> For the complete documentation index, see [llms.txt](https://docs.groundcover.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.groundcover.com/integrations/connected-apps/slack-app.md).

# Slack App

{% hint style="info" %}
This capability is only available to BYOC deployments. Check out our [pricing page](https://www.groundcover.com/pricing) for more information about subscription plans and the available deployment modes.
{% endhint %}

The **Slack App** Destination sends monitor notifications to selected Slack channels in your workspace via the groundcover Slack App. Unlike [Slack Webhook](/integrations/connected-apps/slack-webhook.md), which targets one fixed channel per Destination, the Slack App lets you choose the target channel(s) per [Notification Route](/use-groundcover/monitors/notification-routes.md) rule or per monitor — using a single Destination per workspace.

The same Slack App also powers [@groundcover Agent mentions](/use-groundcover/connectors/slack/slack-agent.md) — users can interact with the groundcover Agent directly from Slack.

{% hint style="info" %}
The Slack App Destination and the **Slack** [connector](/use-groundcover/connectors/slack.md) under **Integrations → Connectors → Org Connectors** are the **same underlying resource**. You can create or manage it from either page:

* **Integrations → Destinations → Slack App** — convenient when you're configuring Slack alongside other Destinations like PagerDuty
* **Integrations → Connectors → Org Connectors → Slack** — convenient when you're managing connectors in general

Both entry points open the same setup wizard, and changes made in one place are immediately reflected in the other.
{% endhint %}

### Setting Up a Slack App

Setting up a Slack App is a one-time process that involves creating a Slack App in your workspace, providing its credentials to groundcover, and authorizing the app via OAuth. The walkthrough covers four steps:

1. Create the Slack App from a pre-filled manifest
2. Upload the groundcover icon to the Slack App
3. Paste the Client ID, Client Secret, and App-Level Token into groundcover
4. Authorize the app via OAuth

See the [Slack connector guide](/use-groundcover/connectors/slack.md) for the full step-by-step walkthrough, the manifest, where to find each credential in Slack, and troubleshooting.

### Selecting Channels for Notifications

After the Slack App is configured, you can choose the target channels at the route or monitor level:

* **From a notification route**: see [Selecting Slack App channels](/use-groundcover/monitors/notification-routes.md#selecting-slack-app-channels)
* **From the monitor wizard**: see [Selecting Slack Channels in the Monitor Wizard](/use-groundcover/connectors/slack.md#selecting-slack-channels-in-the-monitor-wizard)
* **From a monitor YAML**: see the [Monitor that delivers directly to Slack channels](/use-groundcover/monitors/monitor-yaml-structure.md#monitor-that-delivers-directly-to-slack-channels) example

The bot can post to any public channel in the workspace without being invited. Private channels only appear in the channel picker if the bot has been invited to them — run `/invite @groundcover` inside the channel to add it.

### Multiple Slack Workspaces

You can add one Slack App per Slack workspace (for example, `groundcover Prod` and `groundcover Staging`). Each Slack App is bound to a single workspace and appears as a separate Destination in the channel picker, labeled by its Connector Name. See [Connecting Multiple Slack Workspaces](/use-groundcover/connectors/slack.md#connecting-multiple-slack-workspaces) for details.

### Notification Message Format

groundcover sends alert notifications to Slack using the Block Kit format. Each notification message includes:

| Section            | Contents                                                                                    |
| ------------------ | ------------------------------------------------------------------------------------------- |
| **Header**         | Issue summary with a status emoji (e.g., rotating light for firing, checkmark for resolved) |
| **Context fields** | Status, severity, monitor name, and the value that triggered the alert                      |
| **Description**    | The monitor's description with variable expansion                                           |
| **Labels**         | Cluster, namespace, and any other labels from the monitor's group-by or custom labels       |
| **Action buttons** | Interactive buttons for quick actions (see below)                                           |

{% hint style="info" %}
The notification payload structure is fixed and cannot be customized. If you need a custom message format, use a [Generic Webhook](/integrations/connected-apps/generic-webhook.md) instead.

For the full payload JSON structure and field reference, see [Slack Webhook → Payload](/integrations/connected-apps/slack-webhook.md#slack-message-payload) — the Slack App uses the same Block Kit structure with the addition of interactive button support.
{% endhint %}

### Interactive Buttons

Unlike [Slack Webhook](/integrations/connected-apps/slack-webhook.md) notifications (which only include link buttons), Slack App notifications include both **link buttons** that open groundcover pages and **action buttons** that perform operations directly from Slack:

| Button                     | Type   | Action                                                                                                                                                                                                                                                 |
| -------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **View Issue**             | Link   | Opens the issue detail page in groundcover with the relevant time range and filters pre-applied                                                                                                                                                        |
| **View Monitor**           | Link   | Opens the monitor configuration page in groundcover                                                                                                                                                                                                    |
| **Silence**                | Action | Creates a silence for this monitor directly from Slack, pre-filled with the issue's labels — no need to open the groundcover platform. Lets you quickly suppress repeat notifications during known maintenance or investigation                        |
| **Investigate with Agent** | Link   | Opens the issue in groundcover with Agent Mode ready to investigate. This button only appears when AI features are enabled in the backend that sent the notification (see [Configuring Settings](/use-groundcover/agent-mode/configuring-settings.md)) |

Link buttons open the corresponding groundcover page in the browser (authentication is still required). Action buttons perform the operation without leaving Slack.

### Message Lifecycle

Slack App notifications are not static — groundcover actively manages notification messages as the issue progresses.

#### Resolved: Original Message Updated

When a firing issue is resolved, groundcover **edits the original alert message** in place rather than sending a separate notification. The updated message:

* Changes the header status emoji to indicate resolution
* Updates the displayed status from **Firing** to **Resolved** (in the underlying payload, the `status` field changes from `alerting` to `resolved` — see the [Payload Field Reference](/integrations/connected-apps/slack-webhook.md#payload-field-reference) for all possible values)
* Preserves all original context (monitor name, labels, description) so the full alert history is readable in one place

This keeps channels clean by avoiding a separate "resolved" message for every alert. The channel history shows a single message per issue that reflects its current state.

{% hint style="info" %}
If a notification route is configured to send to **different channels** for Firing and Resolved statuses, the resolved update is sent to the Resolved channel as a new message (since the original message is in a different channel). See [Notification Routes](/use-groundcover/monitors/notification-routes.md) for per-status channel routing.
{% endhint %}

#### Renotifications

If a monitor is configured with renotification intervals and an issue remains in a firing state, groundcover sends a **new message** to the channel for each renotification cycle. Each renotification message:

* Is posted as a new top-level message (not a thread reply to the original)
* Contains the same structure as the original notification (header, context, labels, buttons)
* Indicates that this is a renotification for a still-firing issue

This ensures that long-running issues remain visible in the channel and are not buried by newer messages.

### Developer Note

The Slack App Destination is exposed via the same APIs as every other Destination — under the `connected-apps` path:

* REST API: managed via `/api/connected-apps/v1` (type field is `slack-app`)
* Terraform: `groundcover_connected_app` resource with `type = "slack-app"`
* Monitor YAML: referenced by its connected app ID inside `notificationSettings.connectedApps` and `notificationSettings.connectedAppParams.<id>.channels`

See [Destinations → For Developers](/integrations/connected-apps.md#for-developers) for the full developer reference, and [Monitor YAML structure → notificationSettings](/use-groundcover/monitors/monitor-yaml-structure.md#notificationsettings) for the channel field schema.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.groundcover.com/integrations/connected-apps/slack-app.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
