Skip to Content

Slack

WatchDeck delivers Slack notifications via incoming webhooks. One webhook = one Slack channel. To send to multiple channels, create multiple WatchDeck channels.

There’s no Slack OAuth app to install. Pasting a webhook URL is the entire setup.

Required fields

FieldNotes
Webhook URLMust match https://hooks.slack.com/services/<TEAM>/<CHANNEL>/<TOKEN>. Encrypted at rest.

The URL is encrypted at rest (AES-256-GCM) and never echoed back to the browser after creation. Leaving the field empty on edit keeps the existing value.

Where the webhook URL comes from

In Slack:

  1. Open your workspace’s Apps → search for Incoming Webhooks.
  2. Add the integration to the destination channel.
  3. Copy the generated Webhook URL, that’s what WatchDeck needs.

The URL implicitly carries the destination channel. To change channels, generate a new webhook in the new channel and update the WatchDeck channel.

Add a Slack channel

Message format

Each dispatch sends a Block Kit payload with a text fallback (used by mobile notifications and accessibility readers). The shape:

{ "text": "Endpoint down — Production API", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": ":rotating_light: *Endpoint down*\nHTTP 502 — expected 200" } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "*Endpoint*\nProduction API" }, { "type": "mrkdwn", "text": "*Target*\nhttps://api.example.com/health" }, { "type": "mrkdwn", "text": "*Cause*\nEndpoint down" } ] }, { "type": "section", "text": { "type": "mrkdwn", "text": "<https://app.watchdeck.dev/incidents/abc123|View in WatchDeck>" } } ] }

The fields section is capped at 10 rows.

Severity emojis

SeverityEmoji
critical:rotating_light: 🚨
warning:warning: ⚠️
success:white_check_mark:
info:information_source: ℹ️

User-supplied content (endpoint names, cause details) is mrkdwn-escaped: &, <, > become &amp;, &lt;, &gt; so an endpoint name containing those characters renders correctly.

Test send

Click Test on the channel card to fire a synthetic channel_test block into the channel. The result is shown inline on the card and recorded in the Delivery log with kind='channel_test'.

A successful test sets is_connected=true and updates last_success_at; a failed test does the opposite.

Failure handling

The dispatcher considers any 2xx response a success. Slack returns 200 with body ok for accepted messages.

Slack responseCaptured as
Non-2xxfailure_reason = HTTP <code> · <body excerpt>
429 Too Many RequestsSame, plus the Retry-After header is captured into provider_meta
Network / timeout (10s)failure_reason = the underlying error message

There’s no retry path today, so a failed delivery stays failed. Slack rate-limits incoming webhooks at roughly one message per second per webhook; if you’re firing many opens at once, you’ll see 429s.

What’s not in the Slack channel today

  • No threading. Each incident kind (open, resolve) is a top-level message. There’s no thread_ts linking. A resolution does not thread under the open.
  • No mention helpers. WatchDeck does not auto-prepend <!channel>, <!here>, or <@user> to messages. If you need a mention, use a webhook channel and craft the body yourself.
  • No interactive components. No buttons, no app-style “Acknowledge” actions. (Acknowledgement isn’t a concept on the WatchDeck side either, see Incidents → Lifecycle.)
  • No Slack OAuth app. Webhook only.

Troubleshooting

  • “no_service” or 404 on Test: the webhook has been revoked in Slack. Generate a new one and update the channel.
  • “channel_not_found”: the webhook’s destination channel was archived. Generate a new webhook in a live channel.
  • Messages arrive without colour bars: Block Kit doesn’t surface a coloured banner the way email does. The severity emoji at the start of the headline carries the visual cue.
  • A message lands in the wrong channel: incoming webhooks are bound to one channel at creation time; you cannot retarget without a new URL.

Quotas and limits

  • Counts toward your per-plan channel cap. See Notifications → Quotas.
  • WatchDeck doesn’t apply its own per-channel rate limit. Slack will rate-limit you if you exceed their incoming-webhook budget.

What’s next

Last updated on