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.

FieldTypeRequiredDefaultConstraintsExample
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.
arrayNo—array of stringmessage, 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.
stringNo——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.

FieldTypeExample
type
The Slack event type.
stringapp_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.
stringEv01ABCDEF
team_id
The workspace this happened in.
stringT01ABCDEF
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`).
stringC01ABCDEF
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).
stringU01ABCDEF
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.

FieldTypeExample
type
The Slack event type.
stringapp_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.
stringEv01ABCDEF
team_id
The workspace this happened in.
stringT01ABCDEF
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`).
stringC01ABCDEF
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).
stringU01ABCDEF
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.

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.