> ## Documentation Index
> Fetch the complete documentation index at: https://runcrate.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack

> Post Runcrate events to a Slack channel through a Slack incoming webhook.

A Slack endpoint posts each event to one Slack channel as a short message: what happened, one sentence of detail and a link to the right page in Runcrate. You need no server. You need permission to add apps to your Slack workspace.

## Get a webhook URL from Slack

**1. Create a Slack app**

Go to [api.slack.com/apps](https://api.slack.com/apps) and select **Create New App**, then **From scratch**. Name it (for example `Runcrate`), pick your Slack workspace and select **Create App**.

**2. Turn on incoming webhooks**

In the app's menu, open **Incoming Webhooks** and switch **Activate Incoming Webhooks** on.

**3. Add a webhook to a channel**

Select **Add New Webhook to Workspace**, pick the channel the messages should go to and select **Allow**.

**4. Copy the URL**

Back under **Incoming Webhooks**, find the new row and select **Copy** next to its **Webhook URL**. It looks like `https://hooks.slack.com/services/T.../B.../...`.

> [!NOTE]
>
> If your Slack workspace requires approval for apps, an admin approves the app before the webhook works. One app can hold webhooks for several channels: repeat the last two steps for each.

## Add it to Runcrate

**1. Add an endpoint**

In [Settings > Webhooks](https://runcrate.ai/dashboard/settings/webhooks), select **Add endpoint** and choose **Slack**.

**2. Paste the URL**

Paste it into **Slack webhook URL**. Runcrate accepts only `https://hooks.slack.com/services/...` URLs (and `hooks.slack-gov.com` for GovSlack).

**3. Choose events and test**

Pick **All events** or **Choose events**, then select **Send a test event**. A message titled "Test from Runcrate" appears in the channel.

## What the message looks like

Each message is built with Slack's Block Kit:

* **Title** in bold, for example "production used 80% of its monthly budget".
* **One sentence** with the detail and what happens next.
* **Open in Runcrate**, a link to the page where you act on it (the instances list, billing, environments, or webhook settings).
* **Fields** below, side by side, such as Environment, Month to date and Budget.

The notification preview on phones and desktops shows the title. This is the exact body Runcrate posts for a [`budget.threshold_reached`](/docs/webhooks/events) event:

```json theme={"theme":{"light":"github-light","dark":"catppuccin-mocha"}}
{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*production used 80% of its monthly budget*\n$402.17 of $500.00 spent in October 2026. At the full budget its instances stop, launches are refused and its API keys are declined.\n<https://runcrate.ai/dashboard/settings/environments|Open in Runcrate>"
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": "*Environment*\nproduction"
        },
        {
          "type": "mrkdwn",
          "text": "*Month to date*\n$402.17"
        },
        {
          "type": "mrkdwn",
          "text": "*Budget*\n$500.00"
        }
      ]
    }
  ],
  "text": "production used 80% of its monthly budget"
}
```

**What arrives** in the endpoint drawer shows this for any event before you save.

## The URL is the secret

Slack signs nothing. Anyone who has the webhook URL can post to your channel, so treat it like a password:

* Do not paste it into tickets, chat or a repository.
* Runcrate stores it encrypted and only ever shows its host and last four characters, for example `hooks.slack.com/...Xy9Q`.
* If it leaks, remove the webhook in the Slack app (under **Incoming Webhooks**), make a new one and paste the new URL into the endpoint with **Edit**.

## When a message does not arrive

The [delivery log](/docs/webhooks/retries#the-delivery-log) shows each attempt with a sentence about what went wrong. For Slack it reads Slack's answer and says it plainly:

| Slack says | What you see in the log |
| - | - |
| `no_service`, or HTTP 404 | Slack says this webhook was removed or turned off. Make a new one and paste it here. |
| `invalid_token`, `no_service_id` | Slack does not recognise this webhook. Copy the URL again from Slack. |
| `no_active_hooks` | Slack says this webhook is turned off. Turn it back on in the Slack app, or make a new one. |
| `channel_not_found` | Slack cannot find the channel this webhook posts to. It may have been deleted. |
| `channel_is_archived` | The Slack channel this webhook posts to is archived. |
| `action_prohibited` | An admin of your Slack workspace has blocked this webhook from posting. |
| `posting_to_general_channel_denied` | Only admins may post in this Slack channel. Pick another channel for the webhook. |
| `team_disabled`, `no_team` | The Slack workspace is turned off, or Slack cannot find it. |
| HTTP 429 | The endpoint is getting too many messages right now. Runcrate will try again. |

Failed messages are retried on the same schedule as any webhook. See [retries](/docs/webhooks/retries).

## Related

> **[Discord](/docs/webhooks/discord)**
>
> The same events in a Discord channel.

> **[Events](/docs/webhooks/events)**
>
> What each event means and when it is sent.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.