Send Slack Message
The Send Slack Message node posts a message to a Slack channel or DM as part of your workflow. Use it for alerts, notifications, approvals, and team communication.
Prerequisites
Connect your Slack workspace in Build → App Authorizations before using this node.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Connection | Select | Yes | Your connected Slack workspace |
| Channel | Select/FX | Yes | Channel to post in (e.g., #general, #alerts). Also supports DMs by user ID. |
| Message | FX formula | Yes | The message text. Supports Slack markdown and workflow variables. |
| Thread TS | FX formula | No | Reply in a thread by providing the parent message timestamp |
| Unfurl links | Toggle | No | Show link previews (default: true) |
| Unfurl media | Toggle | No | Show media previews (default: true) |
Slack formatting
Slack uses its own markdown syntax:
| Syntax | Result |
|---|---|
*bold* | bold |
_italic_ | italic |
~strikethrough~ | |
`code` | code |
> quote | blockquote |
:emoji: | emoji icon |
<@U1234> | @mention a user |
<#C1234> | #channel link |
<https://url|Display Text> | clickable link |
Using variables in messages
Reference data from any previous node:
:bell: *New Lead Alert*
*Name:* {{trigger.body.name}}
*Email:* {{trigger.body.email}}
*Score:* {{tinygpt.result.score}}/100
*Tier:* {{tinygpt.result.tier}}
_Submitted at {{trigger.timestamp}}_
Thread replies
Post in a thread instead of the main channel:
- Set Thread TS to the parent message's timestamp
- Common source:
{{slack_send.message.ts}}from a previous Slack message node
This is useful for updating the same thread:
Trigger → Slack (post alert to #channel) → ... process ... →
Slack (reply in thread with results, Thread TS: {{slack_send.message.ts}})
Channel selection
Static channel
Select a channel from the dropdown. The list shows all channels the bot has access to.
Dynamic channel
Use an FX variable for the channel:
{{trigger.body.department}}_alerts
If the incoming data has department: "engineering", this posts to #engineering_alerts.
Direct messages
Send a DM to a specific user by providing their Slack user ID:
Channel: {{trigger.body.slack_user_id}}
Output variables
{{slack_send.message.ts}} → message timestamp (use for thread replies)
{{slack_send.channel}} → channel ID
{{slack_send.ok}} → true if message sent successfully
Common patterns
Error alert
Any node → Error branch → Slack (#alerts: ":rotating_light: Workflow failed: {{error.message}}")
Approval request
Trigger → Slack (post approval request) → Wait for Webhook →
If-Else (approved?) → Continue or stop
Daily digest
Schedule (daily 9am) → Find All (today's metrics) → Transformer (format) →
Slack (#daily-standup: formatted report)
Multi-channel alert
Add multiple Slack nodes to post the same event to different channels:
Trigger → [parallel]:
Slack (#general: brief summary)
Slack (#engineering: detailed technical info)
Slack (DM to project owner)
Use thread replies to keep channels clean. Post the initial alert as a top-level message, then post all follow-ups (status updates, resolution notes) as thread replies to that message.
The Slack bot must be invited to a channel before it can post there. If you get a "channel_not_found" error, go to the target Slack channel and type /invite @TinyCommand to add the bot.