Slack Connection
Connect to Slack to send messages, update messages, read channel history, and (optionally) drive workflows from Slack events via the Slack Trigger.
Configuration
| Field | Description | Required |
|---|---|---|
| Bot Token | Bot User OAuth Token from your Slack app (xoxb-...) | Yes |
| Signing Secret | App-level signing secret used to verify incoming events | Only for the Slack Trigger |
The Bot Token alone is enough for action nodes (Send Message, Update Message, Get Channel History). The Signing Secret is only needed if you also want to use the Slack Trigger.
Quick start (action nodes only)
If you only need to send to Slack, skip everything below the Bot Token row.
- Go to api.slack.com/apps and click Create New App → From scratch.
- Open the app, go to OAuth & Permissions, and add these bot token scopes:
chat:write— send and update messageschannels:read— list public channelschannels:history— read public channel messagesgroups:read— list private channels the bot is ingroups:history— read private channel messages
- Click Install to Workspace at the top of the page and approve.
- Copy the Bot User OAuth Token (
xoxb-...) and paste it into the Bot Token field of the Slack connection. - Click Save.
Invite the bot
The bot must be invited to a channel before it can post or read messages there. In Slack, type /invite @YourBotName in the channel, or add it from the channel's integration settings.
Adding Slack Trigger support
The Slack Trigger receives events (mentions, messages, reactions) from Slack's Events API. To make it work end-to-end, Slack needs to know where to POST those events. You paste that URL into Slack yourself — the connection does not push it programmatically.
Setup:
- Signing Secret — Open your Slack app at api.slack.com/apps → Basic Information → App Credentials → copy Signing Secret into the connection.
- Save the connection (Bot Token + Signing Secret). The connection's Webhook URL is shown right in the create/edit form:Click the copy button next to it. (You can also fetch it via
<WEBHOOK_BASE_URL>/api/conn-webhook/<connection-webhook-token>GET /api/connections/<id>/webhook-info.) - Open your Slack app → Event Subscriptions → toggle Enable Events on → paste the URL into Request URL. Slack sends a
url_verificationchallenge; the backend echoes it automatically, so the URL verifies immediately. - Under Subscribe to bot events, add the event types you want (e.g.
app_mention) and Save Changes.
The webhook token is stable for the life of the connection, so the URL you paste keeps working — you only set it once. (It changes only if you delete and recreate the connection.)
The URL shows before you even save
For webhook-capable connections the form generates the token up front, so you can copy the URL and paste it into Slack while you're still filling in the connection — then save. The saved connection keeps the same URL.
Required bot token scopes
For action nodes:
chat:write(Send Message, Update Message)channels:read,groups:read(Send Message — for name → ID resolution)channels:history,groups:history(Get Channel History)reactions:write(Add Reaction)
For the Slack Trigger you'll also want at least one bot event subscription matching your trigger's events filter. Slack requires the matching read scope per event — e.g.:
app_mentionevent → needsapp_mentions:readmessage.channelsevent → needschannels:historyreaction_addedevent → needsreactions:read
If you change scopes after installing the app, Slack will show an "update available" banner in your workspace; admins approve it and the new scopes take effect.
Bot self-delivery & event choice
Slack treats different events differently when the bot itself posts the message:
| Event | Bot's own message fires it? |
|---|---|
app_mention | No — Slack filters self-mentions |
message.channels | Yes — delivered with subtype: "bot_message" |
reaction_added | Yes |
message.im | Yes (in DMs with the bot) |
For most production workflows app_mention is what you want — a human pings the bot, the workflow runs. For automated end-to-end tests (integrations:test) the test fixture uses reaction_added instead. The Slack action workflow ends with Slack Add Reaction, the bot's own reaction fires the event back, and the Slack Trigger workflow runs — no human required, and the test signal is deliberate (a reaction, not every channel message).
Self-fire = loop risk
Self-delivered events can loop if the trigger workflow itself causes more of them. Examples:
- Filter on
message.channelsAND send another Slack message in response → infinite loop. - Filter on
reaction_addedAND add another reaction in response → infinite loop.
The bundled fixtures avoid this by ending the Slack Trigger workflow in a no-op switch node. Mirror that pattern in your own self-fire setups, or filter on app_mention for production use where the bot can safely reply because Slack filters self-mentions.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
connection_test failed: not_authed on save | Bot Token wrong or revoked | Re-install the app to your workspace and copy a fresh Bot Token. |
Status stays pending_manual_setup | Expected — Slack setup is always manual | Paste the connection's Webhook URL into Slack's Event Subscriptions → Request URL. Status reflects that the URL must be set in Slack by you. |
| Slack shows "Your Request URL didn't respond / verification failed" | WEBHOOK_BASE_URL isn't a public HTTPS endpoint, or the backend isn't reachable | Set WEBHOOK_BASE_URL to a public HTTPS URL (Cloudflare tunnel in dev, real domain in prod) and re-paste the URL into Slack. |
Trigger workflow never fires after a real @mention | URL not pasted into this app's Event Subscriptions, scopes missing, or bot not invited to the channel | Re-paste the connection's Webhook URL, double-check scopes, and /invite @bot in the channel. |
Usage
Once created, this connection is available to: