Slack Trigger
Triggers a workflow when your Slack app receives Events API deliveries (messages, mentions, reactions, etc.).
Slack's Events API Request URL lives at the Slack App level. You paste the connection's webhook URL into Slack's Event Subscriptions once; every workflow built on the same connection then receives deliveries.
Requires a Slack connection configured with Bot Token + Signing Secret. The connection shows its webhook URL in the create/edit form — copy it and paste it into Slack. See the Slack connection guide.
Webhook URL is per-connection, not per-workflow
The URL is tied to the connection, not the trigger node. It looks like:
https://<your-deployment>/api/conn-webhook/<connection-webhook-token><connection-webhook-token> is generated when you create the Slack connection and stored in connection.metadata.webhook_token. Fetch it with:
bash
curl -H "Authorization: Bearer $TOKEN" \
https://<your-deployment>/api/connections/<connection-id>/webhook-info \
| jq '.data.url'The same URL services every slack_trigger workflow that references this connection — the dispatcher fans the delivery out to all matching workflows.
Setup
- Create the Slack connection — follow that guide to populate Bot Token + Signing Secret (and optionally the App ID + Configuration Tokens for automatic URL updates).
- In your Slack App's Event Subscriptions page:
- If you used the automatic option, the Request URL is already pointed at this connection — just turn Enable Events on.
- If you went manual, paste the URL from the connection's webhook-info endpoint into Request URL. Slack sends a one-time
url_verificationchallenge; the backend responds automatically.
- Under Subscribe to bot events, add the event types you want to listen for (e.g.
app_mention,message.channels). The Slack Trigger node's events filter is for dispatch-side filtering; the real Slack subscription is configured here. - Build a workflow with the Slack Trigger as the first node, set its Connection, and publish.
Event choice & loop hazard
Slack delivers different events differently when the bot itself caused them:
| Event | Self-fires? | Typical use |
|---|---|---|
app_mention | No | Production: human pings the bot |
reaction_added | Yes | Chaining workflows / end-to-end self-test (deliberate, low noise) |
message.channels | Yes (subtype: "bot_message") | Same idea but fires on every channel message — noisier |
If you pick a self-firing event and the trigger workflow then performs the SAME action (sending a message under message.channels, adding a reaction under reaction_added), you'll loop forever. Either keep app_mention (no self-fire) or design the trigger workflow with no matching outbound action — terminate in a switch, datastore write, or downstream non-Slack action. The bundled Slack trigger fixture uses reaction_added and ends in a no-op switch so it pairs cleanly with the sibling Slack action workflow during integrations:test.
Output
| Field | Description |
|---|---|
body.event | The actual Slack event payload (e.g., app_mention) |
body.event.type | Event type — match against the trigger's events filter |
body.team_id | Slack workspace ID |
headers.X-Slack-Signature | HMAC signature (already verified before the workflow runs) |
headers.X-Slack-Request-Timestamp | Timestamp included in signature input |
How it works
- Every incoming webhook is verified with
HMAC-SHA256overv0:{timestamp}:{rawBody}using the connection's signing secret, compared to theX-Slack-Signatureheader (prefixv0=). - Deliveries older than 5 minutes are rejected as replay attempts.
- The initial
url_verificationhandshake is signed too — the backend verifies it and responds with the challenge value automatically.
Signing Secret required
The Slack Trigger refuses to publish if the connection is missing its Signing Secret. Without it, deliveries cannot be authenticated.
Stable webhook URL
The connection's webhook URL is fixed for the life of the connection, so the URL you paste into Slack keeps working — you only set it once. If you change WEBHOOK_BASE_URL, re-paste the new URL into Slack's Event Subscriptions. See Slack connection setup.