Send a Microsoft Teams message from a flow
If your team lives in Teams, that is where an automation’s output belongs: the morning brief, the finished batch, the lead that just landed. Connecting takes one URL copied out of Teams, and needs no Azure app registration and no admin consent.
Connect a channel
Section titled “Connect a channel”1. Pick or create the channel. Anything works — a dedicated Routario channel keeps automation traffic out of a discussion channel.
2. Create the webhook in Teams. Hover the channel name → ⋯ → Workflows, then pick the template that creates an incoming webhook. Its name varies by tenant: “Post to a channel when a webhook request is received” in some, “Send webhook alerts to <channel>” in others. Both are the same thing. Confirm the connection when prompted, choose the team and channel, and create it. Teams then shows a long URL — copy it.
3. Paste it into Routario. Go to Settings → Connections → Apps → Microsoft Teams, paste the URL, and connect. That first channel becomes your default; adding more comes later, under Sending to more than one channel.
Connecting immediately posts a real card into the channel:
✅ Routario connected — this channel will now receive your automation updates.
That card is the test. An incoming webhook has no silent way to check it works, so Routario would rather post something visible than claim success it cannot verify. There is a Test button afterwards that posts a second one.
Post from a flow
Section titled “Post from a flow”Add a Send Teams step. It takes four fields:
- Channel (optional) — which registered destination to post to. Leave it empty for your default one.
- Message — the card body. Accepts template variables.
- Title (optional) — a short bold heading above the body.
- Format Markdown for Teams (optional) — render headings, tables, dividers and images in the message. See below.
Channel: financeTitle: Invoice batch finishedMessage: {{ run_batch.count }} invoices issued, {{ run_batch.total }} CZK.Formatting: what renders, what doesn’t
Section titled “Formatting: what renders, what doesn’t”A Teams message from Routario is an Adaptive Card. With nothing switched on, it renders a small slice of Markdown:
| You write | Teams shows |
|---|---|
**bold** | bold |
_italic_ | italic |
- item | a bulleted list |
1. item | a numbered list |
[text](url) | a clickable link |
Turn on Format Markdown for Teams and four more things render as real card elements, like Format Markdown for Slack does on the Slack step:
| You write | Teams shows |
|---|---|
## Heading | a bold heading (# large, ## medium, ### and below bold body size) |
a pipe table (header row, then |---|---:|) | a table, with the alignment the separator row sets |
--- on its own line | a divider line |
 on its own line | an inline image (https only) |
Leave it off for plain alerts. A message with no headings, tables, dividers or images looks the same either way.
Limits. A table wider than 8 columns or longer than 50 rows stays as literal text, and so does a table with a row that has more cells than the header row. Teams also caps the card’s size (28 KB through a channel webhook). A formatted card over that cap goes out as the plain card instead. The reader loses the layout but never the words. Keep tables to summaries, not data dumps.
Sending to more than one channel
Section titled “Sending to more than one channel”A Teams incoming webhook addresses exactly one channel — the URL is the address — so each channel you want to reach is registered once, with its own webhook.
Under Settings → Connections → Apps → Microsoft Teams, the Channels list holds them. New channel asks for two things:
- Name — how it appears here and in a step’s channel picker, e.g.
FinanceorChief of Staff. - Incoming Webhook URL — that channel’s URL, from the same Teams Workflows step as above.
Adding one posts a confirmation card to that channel, so you find out immediately whether the URL works. One channel is the default, marked in the list: it’s where a step that names no channel posts. Change it with Make default on another row.
A step stores the channel’s internal id rather than its name, so renaming a channel never breaks a flow. Removing one does — steps that name it start failing, which the confirmation dialog warns you about.
Sending to a person
Section titled “Sending to a person”A destination can also be a person, which arrives as a direct message from the Routario bot. A webhook can’t do this — there’s no such thing as an incoming webhook for a 1:1 chat — so this needs the Routario Teams bot set up for your workspace. Add one under the People view of the same list. If the bot isn’t configured, Routario says so instead of adding a destination that could never deliver.
Worked example: a daily brief in Teams
Section titled “Worked example: a daily brief in Teams”A flow on a schedule, three steps:
- Run agent — composes the brief. Tell it how to format: “Your output is posted to Microsoft Teams as a card. Use
##headings for sections, bullets and bold inside them, and a small table (a few columns) where rows compare. No images unless you have an https URL.” - Send Teams — Channel
Chief of Staff, TitleMorning check-in, Message{{ compose_brief.response }}, Format Markdown for Teams on. - Send notification (optional) — the same text in the bell panel, so it is also in Routario.
What lands in the channel is a card with section headings, bullets under each, and a table where the agent chose one.
When something doesn’t arrive
Section titled “When something doesn’t arrive”A card sent successfully but nothing appeared. Routario reports the send as OK when Microsoft accepts the request (HTTP 202) — but with a Workflows webhook, acceptance happens before the workflow runs. If the workflow itself then fails, the card never posts. Check its run history: Teams → the channel → ⋯ → Workflows → your workflow → Run history. Each run shows succeeded or failed there.
The channel says “We’re having trouble loading your messages.” That is the Teams client failing to load the conversation, not a rejected message. Quit Teams and reopen it — messages posted while it was in that state are all there. Do not go hunting through the message format on this symptom; nothing is wrong with it.
The step failed with “Unknown Teams channel”. The name doesn’t match a registered channel. The error lists the ones that do exist; add the missing channel, or fix the name on the step. Names match what you typed, ignoring case.
Routario says Teams isn’t connected. No destination is registered, or the stored URL was cleared — add a channel under Settings → Connections → Apps.
Sends stopped working after a while. If the workflow is deleted in Teams, its URL dies and that channel is marked Removed in Teams in the list — the one channel, not the whole connection. Create a new workflow in Teams and paste the new URL into that channel.
Where to go next
Section titled “Where to go next”- Send a Slack message from a flow — the same job in Slack.
- Keep a human in the loop — when the message needs an answer, not just an audience.
- Send Teams step reference — every field, verbatim.