Send a Slack message from a flow
A flow that finishes with a message in Slack — a daily summary, a finished batch, a new lead — is one of the most common automations there is. The Send Slack step posts it, and when the message is more than a single line, it can render as an actual table, a section divider, or an inline image in the channel, not a wall of dashes and pipe characters.
The Send Slack step
Section titled “The Send Slack step”Add a Send Slack step and fill in:
- Channel — a channel name (
#alerts) or id (C0123ABCD). Leave it blank to use your workspace’s default channel. - Message — the text to post. Accepts template variables.
- Format Markdown for Slack — off by default. Turn it on to get everything below.
- Thread timestamp (optional) — thread this message under an earlier one (see Threading replies, below).
Requires Slack connected under Settings → Connections → Apps.
Formatting for Slack
Section titled “Formatting for Slack”Slack doesn’t render standard Markdown — **bold**, # Heading, and a Markdown table all show up as literal punctuation in a plain Slack message. Turn on Format Markdown for Slack and Routario translates the message before sending it:
| You write | Slack shows |
|---|---|
# Heading / **bold** | bold text (Slack has no headings, so a heading becomes bold) |
- item | a bulleted • list |
[text](url) | a clickable link |
| a Markdown table | a real, rendered table |
a lone --- line | a divider rule |
a lone  line | an inline image |
The first three (headings, lists, links) were always supported. Tables, dividers, and images are newer — that’s the part worth knowing well.
Tables
Section titled “Tables”Write an ordinary GitHub-style Markdown table — a header row, a separator row, then data rows:
| Item | Amount ||---|---:|| Widget A | 1450.50 || Widget B | 320.00 |With Format Markdown for Slack on, that posts as a real Slack table — an actual grid, not pipe characters. The separator row also sets column alignment: --- (left, the default), ---: (right, good for numbers), :---: (center).
Keep tables to a short summary. Slack itself caps a table at 100 rows, 20 columns, and 10,000 characters — a table over any of those limits posts as plain text instead of a table, so a full data export won’t render (a link to the record in Routario is a better fit for that).
Dividers
Section titled “Dividers”A line with nothing on it but ---, ***, or ___ becomes a horizontal divider — useful for separating distinct parts of one message, like today’s schedule from today’s follow-ups:
**Today's schedule**
09:00 – Standup14:00 – Client call
---
**Follow-ups due**
- Confirm the Acme quoteImages
Section titled “Images”A line with nothing on it but  becomes an inline image. The URL must be a public https:// link — Slack can’t fetch a http:// URL or anything requiring a login, and a non-https link is left as literal text rather than dropped.
Threading replies
Section titled “Threading replies”Pass an earlier Slack message’s timestamp as Thread timestamp to reply into that message’s thread instead of starting a new one. Capture it off a prior Send Slack step’s output — label that step (say, post) and reference {{ post.ts }}:
- Send Slack — label it
post. Sends the top-level message. - Send Slack — Thread timestamp is
{{ post.ts }}. Sends as a threaded reply under it.
This is how a flow keeps a running conversation (an update, then progress replies) as one thread instead of a stream of separate messages.
Worked example: a daily brief in Slack
Section titled “Worked example: a daily brief in Slack”Have an Ask AI step draft a report, then post it as a nicely-formatted Slack message.
-
Schedule trigger — every morning at 08:00.
-
Ask AI (label:
brief) — prompt it to write today’s summary, and tell it explicitly how the output will be used:Write today's briefing: the calendar, open follow-ups, and anything overdue.Your output is posted to Slack, so format it for that surface. For anythingtabular, use a real GFM pipe table (a header row, then a |---|---| separatorrow) — never hand-align columns with spaces. Use a standalone --- line as adivider between distinct sections — sparingly, once or twice at most. Keeptables to a short summary, not a full data dump. Standard **bold**, bullets,and [links](url) all render fine; Slack has no heading syntax, so use**bold** for anything that would otherwise be a heading. -
Send Slack — Channel is
#daily-brief, Message is{{ brief.response }}, Format Markdown for Slack is on.
The prompt is the important part: an AI step has no way to know its output is headed to Slack unless you tell it — once it knows, it reaches for real tables and dividers instead of guessing at formatting.
Where to go next
Section titled “Where to go next”- Send Slack — full reference — every field, with example values.
- Keep a human in the loop — for a Slack message that asks a question and waits for an answer, instead of this fire-and-forget send.
- Send email from a flow — the equivalent step for email.