Source · Slack · Verified November 1, 2026
Slack webhook source guide
Short answer: A Hooks Slack endpoint verifies X-Slack-Signature as HMAC-SHA256 over v0:<timestamp>:<raw body>, answers the url_verification handshake itself, and normalizes messages to app_mention.received or message.<channel_type>.
Slack is the easiest chat front door for an agent: someone @mentions the bot and a task appears. Hooks handles the two Slack-specific traps — the url_verification handshake and the three-second acknowledgement window — before anything reaches a target.
Set up the webhook in Slack
- In the Slack app, open Event Subscriptions and set the Request URL to the endpoint's ingestion URL.
- Slack verifies the URL immediately; Hooks answers the challenge, so the app shows Verified.
- Subscribe to bot events:
app_mention, andmessage.channelsonly if you want every channel message. - Copy the app's Signing Secret into the Hooks endpoint secret.
Signature verification
| Header | X-Slack-Signature: v0=<hex> |
|---|---|
| Algorithm | HMAC-SHA256 over v0:<timestamp>:<raw body>. |
| Replay window | Five minutes between the v0: timestamp and now. |
| Delivery id | Body `event_id`, reused when Slack retries. |
url_verificationis answered with{"challenge": "..."}after verification, before storage.event_timebecomesoccurredAt; the channel id becomesproject.- Bot messages (
bot_idorsubtype = bot_message) are stored but never delivered, which stops loops.
Events Hooks normalizes
| event.type | subject | What it means |
|---|---|---|
app_mention.received | message | The bot was @mentioned; message text is the subject body. |
message.channels | message | Message in a public channel the app was added to. |
message.groups | message | Message in a private channel. |
message.im | message | Direct message to the app. |
message.mpim | message | Group direct message. |
url_verification.received | url_verification | Handshake, answered inline with the challenge and never stored. |
Normalized payload
Every adapter produces this shape before filters or templates run. The raw payload and sanitized headers stay attached for audit, but filters and templates read the normalized fields.
Normalized event
{
"id": "evt_01j9m7c4d5",
"source": "slack",
"type": "app_mention.received",
"action": "received",
"deliveryId": "Ev01ABCDEF",
"occurredAt": "2026-11-01T09:14:03.000Z",
"actor": { "login": "U024BE7LH", "id": "U024BE7LH", "type": "user" },
"project": "C0123456789",
"subject": {
"kind": "message",
"id": "1719919443.123456",
"title": "@agent triage the failing deploy",
"body": "<@U0LAN0Z89> triage the failing deploy",
"url": "https://acme.slack.com/archives/C0123456789/p1719919443123456"
}
}Filter and template examples
Filter: mentions only
{
"allow": [{ "field": "event.type", "op": "equals", "value": "app_mention.received" }],
"ignoreBots": true
}Destination: Grok Bot task
{
"routineUrl": "https://grok.example.com/routines/abc123",
"key": "{{secret.GROKBOT_KEY}}",
"task": "Slack mention from {{event.actor.login}}:\n{{event.subject.body | truncate:2000}}"
}Retries and the delivery log
408, 425, 429, and 5xx responses retry with backoff and honor Retry-After; other 4xx responses fail permanently with a named code. Every attempt keeps the rendered request and the target response, so a failure points at one field or one status instead of a guess.

Common errors
| Symptom | Fix |
|---|---|
Request URL shows “Your URL didn't respond with the value of the challenge parameter” | The endpoint secret does not match the app's Signing Secret, so verification failed before the handshake. Update the secret and retry the URL verification. |
No events after subscribing | Bot events only arrive for channels the bot was added to. Invite the app to the channel and mention it once. |
Bot replies trigger the agent again | Bot-authored events are stored with filter_reason = "bot_message" and never delivered. Keep ignoreBots on for custom HTTP targets as well. |
Pair with a target
Reference
- Receiving eventshttps://hooks.events/docs/receive-events.md
- Verify signatureshttps://hooks.events/docs/signatures.md
- Payload templateshttps://hooks.events/docs/templates.md
Other sources
<event>.<action> (for example issues.opened) before any destination filter runs.StripeA Hooks Stripe endpoint verifies Stripe-Signature as HMAC-SHA256 over <timestamp>.<raw body> with a five-minute tolerance, then normalizes each event to <resource>.<action> such as invoice.payment_failed.LinearA Hooks Linear endpoint verifies Linear-Signature as hex HMAC-SHA256 over the raw body, rejects payloads whose webhookTimestamp is more than 60 seconds old, and normalizes events to issue.create, issue.update, and comment.create.SentryA Hooks Sentry endpoint verifies Sentry-Hook-Signature as hex HMAC-SHA256 with the Integration's Client Secret, deduplicates by Request-ID, and normalizes events to issue.created or event_alert.triggered.GitLabGitLab project webhooks cover pushes, merge requests, pipelines, issues, notes, and releases.ShopifyShopify app webhooks send topic-scoped events such as orders/create, products/update, and refunds/create.IntercomIntercom sends conversation and contact notification topics, signed with the app client secret.ZendeskZendesk webhooks cover ticket, user, and organization events, signed with a timestamp plus body HMAC.JiraJira Cloud webhooks cover issue creation, updates, comments, and sprint changes.PagerDutyPagerDuty v3 webhooks cover incident trigger, acknowledge, resolve, and annotation events.Standard WebhooksStandard Webhooks deliveries carry webhook-id, webhook-timestamp, and base64 v1 signatures.SvixSvix Play and the Svix dispatcher use the Standard Webhooks headers with svix- prefixes.VercelVercel webhooks cover deployment, integration, project, and domain events.TwilioTwilio status callbacks cover messages, calls, and recordings, signed over the URL and form parameters.DiscordDiscord interaction webhooks use Ed25519 signatures plus a PING handshake.Generic HMACGeneric sources sign timestamp.deliveryId.body with HMAC-SHA256 and send the signature in x-signature.BitbucketBitbucket Cloud repository webhooks cover pushes, pull request changes, and issue events.