Skip to content

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.

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.

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: finance
Title: Invoice batch finished
Message: {{ run_batch.count }} invoices issued, {{ run_batch.total }} CZK.

A Teams message from Routario is an Adaptive Card. With nothing switched on, it renders a small slice of Markdown:

You writeTeams shows
**bold**bold
_italic_italic
- itema bulleted list
1. itema 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 writeTeams shows
## Headinga 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 linea divider line
![alt](https://…) on its own linean 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.

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. Finance or Chief 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.

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.

A flow on a schedule, three steps:

  1. 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.”
  2. Send Teams — Channel Chief of Staff, Title Morning check-in, Message {{ compose_brief.response }}, Format Markdown for Teams on.
  3. 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.

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.