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
| Field | Notes |
|---|---|
| Webhook URL | Must 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:
- Open your workspace’s Apps → search for Incoming Webhooks.
- Add the integration to the destination channel.
- 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.
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
| Severity | Emoji |
|---|---|
| critical | :rotating_light: 🚨 |
| warning | :warning: ⚠️ |
| success | :white_check_mark: ✅ |
| info | :information_source: ℹ️ |
User-supplied content (endpoint names, cause details) is mrkdwn-escaped — &, <, > become &, <, > 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 response | Captured as |
|---|---|
| Non-2xx | failure_reason = HTTP <code> · <body excerpt> |
| 429 Too Many Requests | Same, 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_tslinking — 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.