Event
trigger.slack_event
TriggerChat & messagingconnection requiredruns in-engine
Verifies Slack's v0 signature, answers the url_verification probe, and starts one run per event_id. Requires pasting the callback URL into the Slack app once.
Start a run when Slack posts an Events API event to this workflow.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Slack
- Secret shape
- {"token": "xoxb-…", "signing_secret": "…"}
- Resolved by
- config.connection_id, else the tenant's sole slack connection
- Note
- signing_secret is what verifies inbound deliveries; the bot token is only used by the Slack action nodes.
Configuration
2 fields, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
event_types Only run for these Slack event types — the delivered `event.type`, so 'message' (not 'message.channels'). Leave empty for every event the Slack app is subscribed to. Commonly used: message, app_mention, reaction_added, reaction_removed, member_joined_channel, member_left_channel, channel_created, channel_rename, file_shared, link_shared, pin_added, app_home_opened, team_join. | array | No | — | array of string | message, app_mention |
channel Only run for these channels — comma-separated. Use ids (C…): Slack sends the name only on channel_created/channel_rename, so a #name filter drops message and app_mention events. Leave empty for every channel. | string | No | — | — | C01ABCDEF |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"channel": "C01ABCDEF",
"event_types": "message, app_mention"
}Output
2 shapes — a run emits whichever one applies, and the field picker offers all of them.
eventwhen the event matched event_types and channel
One Slack event, flattened.
| Field | Type | Example |
|---|---|---|
type The Slack event type. | string | app_mention |
subtype Message subtype when Slack sets one, e.g. bot_message. | string | — |
event_id Slack's own event id (Ev…). The idempotency key — a retry carries the same one. | string | Ev01ABCDEF |
team_id The workspace this happened in. | string | T01ABCDEF |
api_app_id The Slack app that delivered it. | string | — |
channel Channel id, flattened from wherever the event carries it (`channel`, `item.channel`, or `channel.id`). | string | C01ABCDEF |
channel_name Channel name, when the event carries one (channel_created). | string | — |
channel_type channel | group | im | mpim, when Slack sends it. | string | — |
user User id, flattened even where Slack nests it (team_join sends an object). | string | U01ABCDEF |
text Message text, for the events that have one. | string | — |
ts Slack timestamp of the message or item this event is about. | string | — |
thread_ts Parent message ts when this is in a thread. Pass it back to slack.post_message to reply in-thread. | string | — |
event_time When Slack recorded the event, epoch seconds. | number | — |
retry_num Slack's delivery attempt number; 0 on the first delivery. | number | — |
is_retry True when Slack is redelivering an event it already sent. | boolean | — |
event Slack's raw inner event object, verbatim. | object | — |
{
"api_app_id": "",
"channel": "C01ABCDEF",
"channel_name": "",
"channel_type": "",
"event": {},
"event_id": "Ev01ABCDEF",
"event_time": 0,
"is_retry": false,
"retry_num": 0,
"subtype": "",
"team_id": "T01ABCDEF",
"text": "",
"thread_ts": "",
"ts": "",
"type": "app_mention",
"user": "U01ABCDEF"
}filteredwhen event_types or channel excluded it — gate the edge on `_filtered != true`
The event arrived but this node's filters excluded it.
| Field | Type | Example |
|---|---|---|
type The Slack event type. | string | app_mention |
subtype Message subtype when Slack sets one, e.g. bot_message. | string | — |
event_id Slack's own event id (Ev…). The idempotency key — a retry carries the same one. | string | Ev01ABCDEF |
team_id The workspace this happened in. | string | T01ABCDEF |
api_app_id The Slack app that delivered it. | string | — |
channel Channel id, flattened from wherever the event carries it (`channel`, `item.channel`, or `channel.id`). | string | C01ABCDEF |
channel_name Channel name, when the event carries one (channel_created). | string | — |
channel_type channel | group | im | mpim, when Slack sends it. | string | — |
user User id, flattened even where Slack nests it (team_join sends an object). | string | U01ABCDEF |
text Message text, for the events that have one. | string | — |
ts Slack timestamp of the message or item this event is about. | string | — |
thread_ts Parent message ts when this is in a thread. Pass it back to slack.post_message to reply in-thread. | string | — |
event_time When Slack recorded the event, epoch seconds. | number | — |
retry_num Slack's delivery attempt number; 0 on the first delivery. | number | — |
is_retry True when Slack is redelivering an event it already sent. | boolean | — |
event Slack's raw inner event object, verbatim. | object | — |
_filtered True when event_types/channel excluded this event. Gate the outgoing edge on `_filtered != true`. | boolean | — |
{
"_filtered": false,
"api_app_id": "",
"channel": "C01ABCDEF",
"channel_name": "",
"channel_type": "",
"event": {},
"event_id": "Ev01ABCDEF",
"event_time": 0,
"is_retry": false,
"retry_num": 0,
"subtype": "",
"team_id": "T01ABCDEF",
"text": "",
"thread_ts": "",
"ts": "",
"type": "app_mention",
"user": "U01ABCDEF"
}Notes
- Slack has no subscription API: after publishing, paste the row's callback_url into the Slack app's Event Subscriptions Request URL yourself.
- Publishing fails if the Slack connection has no signing_secret — without it every delivery would be refused as unverifiable.
- Rotated the signing secret? Disable and re-enable the workflow; an unchanged config republish reuses the stored one.
- Slack retries a delivery it did not get a 2xx for within 3 seconds; retries carry the same event_id and start no second run.
- event_types/channel filter after the run starts: gate the outgoing edge on `_filtered != true`. To keep the traffic off Mantle entirely, narrow the Slack app's own event subscriptions and channel membership.
- event_types matches the delivered event.type: 'message', never 'message.channels' (that is only the subscription name). channel matches the id — Slack sends a channel name on channel_created/channel_rename and nothing else.
Templates that use Slack
See Event run in a workflow.
In a technical demo we add the Slack connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.