Skip to content

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

FieldDescriptionRequired
Bot TokenBot User OAuth Token from your Slack app (xoxb-...)Yes
Signing SecretApp-level signing secret used to verify incoming eventsOnly 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.

  1. Go to api.slack.com/apps and click Create New AppFrom scratch.
  2. Open the app, go to OAuth & Permissions, and add these bot token scopes:
    • chat:write — send and update messages
    • channels:read — list public channels
    • channels:history — read public channel messages
    • groups:read — list private channels the bot is in
    • groups:history — read private channel messages
  3. Click Install to Workspace at the top of the page and approve.
  4. Copy the Bot User OAuth Token (xoxb-...) and paste it into the Bot Token field of the Slack connection.
  5. 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:

  1. Signing Secret — Open your Slack app at api.slack.com/appsBasic InformationApp Credentials → copy Signing Secret into the connection.
  2. Save the connection (Bot Token + Signing Secret). The connection's Webhook URL is shown right in the create/edit form:
    <WEBHOOK_BASE_URL>/api/conn-webhook/<connection-webhook-token>
    Click the copy button next to it. (You can also fetch it via GET /api/connections/<id>/webhook-info.)
  3. Open your Slack app → Event Subscriptions → toggle Enable Events on → paste the URL into Request URL. Slack sends a url_verification challenge; the backend echoes it automatically, so the URL verifies immediately.
  4. 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_mention event → needs app_mentions:read
  • message.channels event → needs channels:history
  • reaction_added event → needs reactions: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:

EventBot's own message fires it?
app_mentionNo — Slack filters self-mentions
message.channelsYes — delivered with subtype: "bot_message"
reaction_addedYes
message.imYes (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.channels AND send another Slack message in response → infinite loop.
  • Filter on reaction_added AND 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

SymptomLikely causeFix
connection_test failed: not_authed on saveBot Token wrong or revokedRe-install the app to your workspace and copy a fresh Bot Token.
Status stays pending_manual_setupExpected — Slack setup is always manualPaste 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 reachableSet 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 @mentionURL not pasted into this app's Event Subscriptions, scopes missing, or bot not invited to the channelRe-paste the connection's Webhook URL, double-check scopes, and /invite @bot in the channel.

Usage

Once created, this connection is available to: