Appearance
Slack node
The Slack node posts a message to a Slack channel through an incoming webhook. It's the quickest way to turn a flow into a team notification — a new signup, a failed payment, a form submission — without wiring up the full HTTP node yourself.
Component id: flowrunner/slack. It makes a network request and can fail for reasons outside your flow, so it carries an error port.
IMPORTANT
This node is an installable component, not part of the engine. Every workspace gets it installed automatically; if it has been removed, the node passes straight through at run time and the editor marks it Not installed in the Add panel. Open Components in the project header to reinstall it.
How it works
The node sends a POST to your Slack webhook URL with a JSON payload:
- Webhook — from
webhook, with${env.X}and${secrets.X}resolved. A missing webhook fails the node (slack: missing webhook URL). Store the webhook as a secret and reference it with${secrets.SLACK_WEBHOOK}. - Message — from
text, rendered as a full template:${secrets.X}/${env.X}and flow refs like${start.email}are substituted. - Username / Icon emoji — optional overrides sent as
usernameandicon_emojiwhen set.
The request goes through the same hardened, SSRF-guarded fetch as the HTTP node: it re-validates every redirect hop, times out, and caps the response.
WARNING
Changed: the webhook must now point at hooks.slack.com. The component's manifest declares that as the only host it may reach, and the runtime enforces it on every redirect hop. A webhook pointing anywhere else is refused before the request is made (…which its manifest does not allow-list). Previously any URL was accepted, which meant a mistyped or hostile webhook could ship your message data to a third party.
On a 2xx from Slack the node stores an object under resultVar (default slack):
text
{
ok: true,
status: <HTTP status number>
}A non-2xx response fails the node (slack: webhook returned <status>) and takes the error port.
Config
| Field | Required | Description |
|---|---|---|
webhook | Yes | The Slack incoming-webhook URL. Resolves ${env.X} and ${secrets.X}. Missing webhook fails the node. |
text | No | The message. Rendered as a template — flow refs (${start.email}), ${env.X}, and ${secrets.X} all resolve. |
username | No | Override the display name the message is posted under. |
iconEmoji | No | Override the message icon, e.g. :robot_face:. Sent as icon_emoji. |
resultVar | No (default slack) | The variable the { ok, status } result is stored under. |
retries | No (default 0) | Retry a network error or a retryable status (408/425/429/5xx) up to this many times (max 5). See Retrying transient failures. |
retryDelayMs | No | Milliseconds to wait between retries. |
Ports
| Port | Followed when |
|---|---|
next | Slack accepted the message (a 2xx response). |
error | The node failed — missing webhook, a non-2xx response, or the request threw (network failure, timeout, blocked address). The message is slack: <reason> and is also written to error.message. |
Example
Notify your team channel whenever a contact form is submitted:
text
Slack webhook: ${secrets.SLACK_WEBHOOK}
text: "📥 New enquiry from ${start.name} (${start.email})"
username: FlowRunner
iconEmoji: :envelope:
resultVar: slack
# read later as: slack.ok, slack.statusTIP
Create the webhook in Slack under Apps → Incoming Webhooks, pick the target channel, and paste the generated URL into a workspace secret named SLACK_WEBHOOK. The channel is fixed by the webhook itself — you don't set it in the node.