Skip to content

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

  1. Create the Slack connection — follow that guide to populate Bot Token + Signing Secret (and optionally the App ID + Configuration Tokens for automatic URL updates).
  2. 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_verification challenge; the backend responds automatically.
  3. 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.
  4. 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:

EventSelf-fires?Typical use
app_mentionNoProduction: human pings the bot
reaction_addedYesChaining workflows / end-to-end self-test (deliberate, low noise)
message.channelsYes (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

FieldDescription
body.eventThe actual Slack event payload (e.g., app_mention)
body.event.typeEvent type — match against the trigger's events filter
body.team_idSlack workspace ID
headers.X-Slack-SignatureHMAC signature (already verified before the workflow runs)
headers.X-Slack-Request-TimestampTimestamp included in signature input

How it works

  • Every incoming webhook is verified with HMAC-SHA256 over v0:{timestamp}:{rawBody} using the connection's signing secret, compared to the X-Slack-Signature header (prefix v0=).
  • Deliveries older than 5 minutes are rejected as replay attempts.
  • The initial url_verification handshake 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.