Skip to content

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.

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.

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 writeSlack shows
# Heading / **bold**bold text (Slack has no headings, so a heading becomes bold)
- itema bulleted list
[text](url)a clickable link
a Markdown tablea real, rendered table
a lone --- linea divider rule
a lone ![alt](https://...) linean inline image

The first three (headings, lists, links) were always supported. Tables, dividers, and images are newer — that’s the part worth knowing well.

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).

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 – Standup
14:00 – Client call
---
**Follow-ups due**
- Confirm the Acme quote

A line with nothing on it but ![alt text](https://...) 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.

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 }}:

  1. Send Slack — label it post. Sends the top-level message.
  2. Send SlackThread 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.

Have an Ask AI step draft a report, then post it as a nicely-formatted Slack message.

  1. Schedule trigger — every morning at 08:00.

  2. 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 anything
    tabular, use a real GFM pipe table (a header row, then a |---|---| separator
    row) — never hand-align columns with spaces. Use a standalone --- line as a
    divider between distinct sections — sparingly, once or twice at most. Keep
    tables 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.
  3. Send SlackChannel 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.