Microsoft Teams Webhook Alerts: The 2026 Setup
The classic Microsoft Teams webhook is retired. Here is the Workflows setup that replaced it, plus a card payload built for monitor alerts.
A Microsoft Teams webhook is still the shortest path from a failing check to a channel people read, but the way you create one changed. The classic Office 365 connector is retired, and the supported route is now a Workflows template. Most monitoring vendors' setup pages still describe the old flow, which is why the steps below look unfamiliar.
What actually changed
Microsoft 365 connectors, previously called Office 365 connectors, were the original mechanism. You opened a channel, added a connector, and got a URL. Microsoft's own page on incoming webhooks now describes creating them through Workflows instead, which runs on Power Automate underneath.
Two practical consequences follow. The payload format moved from the old MessageCard shape to Adaptive Cards. A JSON body copied from a 2022 blog post will be rejected, or render as an empty message. The URL is also shown once, at creation, and cannot be retrieved afterwards from the Teams interface.
| Classic connector | Workflows | |
|---|---|---|
| Created from | Channel connectors menu | Channel Workflows menu |
| Payload | MessageCard | Adaptive Card |
| URL retrievable later | Yes | No, copy it at creation |
| Status as of September 2026 | Retired | Supported |
Creating the webhook in Teams
The click path is short but easy to lose, because the entry point moved into an app rather than a settings screen.
- Open the channel that should receive alerts.
- Select the three dots next to the channel name, then choose Workflows.
- Search for the template Post to a channel when a webhook request is received.
- Confirm the connection, then pick the team and the channel.
- Select Add workflow and copy the generated HTTPS URL immediately.
Store that URL in your secret manager on the way past. Anyone holding it can post into the channel, so treat it like a credential rather than a configuration value. If you lose it, delete the workflow and create a new one.
Permissions are the usual sticking point. Some tenants block workflow creation for members, in which case the owner of the team has to create it or an administrator has to relax the policy. Microsoft's support article on Workflows covers the tenant-level settings involved.
Testing the URL before you wire anything to it
Post a card by hand first. This is a complete, valid body for the Workflows trigger. It renders as a real card rather than a wall of text.
curl -X POST "https://prod-12.westeurope.logic.azure.com:443/workflows/..." \
-H "Content-Type: application/json" \
-d '{
"type": "message",
"attachments": [{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{"type": "TextBlock", "text": "checkout-api is DOWN",
"weight": "Bolder", "size": "Large", "color": "Attention"},
{"type": "FactSet", "facts": [
{"title": "Confirmed from", "value": "London, Singapore"},
{"title": "Status code", "value": "503"},
{"title": "Response time", "value": "timeout after 10s"},
{"title": "Started", "value": "2026-09-23 14:02 UTC"}
]}
]
}
}]
}'
A successful post returns 202 Accepted with an empty body. A 400 usually means the outer type and attachments wrapper is missing, which is the most common error when porting an old MessageCard payload across.
We tested this against a channel with a retired connector still attached. The old URL returned 200 and the message never appeared, which is the worst possible failure mode: a monitoring integration that reports success into a void. Check that a test message actually arrives, not just that the request succeeded.
What belongs on the card
A Microsoft Teams webhook will happily post a wall of prose, and people will stop reading it. An alert card has about three seconds of attention, so put the decision-relevant facts in the first two lines.
Name the monitor, not the URL. Say which regions confirmed the failure, because one region failing is a different event from three. Include the status code or the failed assertion, since that determines who picks it up. Add the time with a timezone, because the reader may be four hours behind the incident.
Add one action button that opens the incident or the status page. The Adaptive Cards schema lists the element types, and Action.OpenUrl is the one you want. Skip anything decorative; a card with an image and three colour-coded columns is slower to read, not faster.
Routing monitor alerts into the channel
With the URL in hand, register it as an alert channel and attach it to the monitors that should use it. Microsoft Teams is one of 16 alert channel types, so the same monitor can also reach SMS or a paging tool:
curl -X POST https://uptimeroom.com/api/v1/channels \
-H "Authorization: Bearer urm_live_..." \
-H "Content-Type: application/json" \
-d '{
"type": "teams",
"name": "platform-alerts channel",
"config": {
"url": "https://prod-12.westeurope.logic.azure.com:443/workflows/..."
}
}'
Attach it per monitor rather than globally. A channel that receives every state change from every check becomes the channel nobody reads, which is the mechanism described in alert fatigue. Remaining fields are in the REST API reference.
One more setting is worth changing while you are in Teams. Channel notifications default to quiet for most members, so a card can arrive without anyone seeing a badge. Turn on channel notifications for the alert channel specifically, or the integration is decorative.
Keeping the workflow working
A Microsoft Teams webhook created through Workflows depends on the account that created it. If that person leaves and their licence is removed, the flow stops running and posts quietly stop arriving. Create it from a shared service account where your tenant allows one, and record who owns it next to the URL in your secret store.
Power Automate also suspends flows that have not run for a long period. A webhook attached only to a monitor that never fails can therefore be dormant on the day you need it. A monthly test post keeps the flow warm and proves the whole path still works, which is cheaper than discovering the gap during an outage.
Watch the response code on your side too. A 202 means the request was accepted for processing, not that the card rendered. If the workflow itself errors, the failure shows in the Power Automate run history rather than in the HTTP response you received.
Is a Microsoft Teams webhook enough to page someone?
No, and it is worth being clear about why. A chat message is a notification surface. It informs someone who is already looking at Teams, and it does nothing for someone asleep. Anything that must wake a person needs SMS, a voice call or a paging tool with an escalation ladder behind it.
The sensible split is by severity. Send warnings and recovery notices to the channel, where they build a shared timeline that helps during a postmortem. Send confirmed customer-facing outages to a phone, and let the Teams card be the second copy that gives the rest of the team context. Public updates belong somewhere else again, which is what incident communication covers.
Common mistakes
Copying a MessageCard payload. The @type and @context fields belong to the retired format. Use the type: message wrapper with an attachments array.
Hardcoding the URL in a repository. It is a bearer credential with no expiry and no scope beyond that channel. Put it in a secret store.
One channel for every monitor. Route by owning team. A card in a channel of 200 people is read by nobody in particular.
Assuming 200 means delivered. A retired connector URL can still accept a request. Confirm visually the first time.
Setting up a Microsoft Teams webhook takes about five minutes now that the Workflows path is the supported one, and the card payload is the part worth spending time on. Keep it to one bold line and four facts. Teams is included with all 15 integrations on the Individual plan at $9 a month as of September 2026. The free plan covers email and web push only, so check pricing before you plan the routing.
FAQ
The classic Microsoft 365 connector, previously called an Office 365 connector, is retired. Incoming webhooks themselves still exist, but you now create them through the Workflows app in a channel rather than the connectors menu. The payload format also changed from MessageCard to Adaptive Cards, so older example payloads no longer render.
Open the channel, select the three dots beside its name, choose Workflows, and pick the template called Post to a channel when a webhook request is received. Confirm the connection, select the team and channel, add the workflow, then copy the HTTPS URL straight away. Teams does not show that URL again afterwards.
An API waits to be called. A webhook calls you, pushing a payload to a URL you registered when an event happens. Monitoring uses both directions: you create monitors through an API, and failures arrive at your chat channel through a webhook. The trade is immediacy against the need to host a reachable endpoint.
Treating a 200 response as proof of delivery, since a retired connector URL can still accept a request while nothing appears in the channel. Committing the URL to a repository, because it is an unscoped credential. Sending every monitor to one shared channel, which trains people to ignore it within a week.
No. A chat message reaches people who are already looking at Teams and does nothing for someone asleep. Use the channel for warnings, recoveries and shared context, and send confirmed customer-facing outages to SMS, a voice call or a paging tool that has an escalation ladder behind it.
Related reading
- Alert Fatigue: How to Cut Your Page Count - Alert fatigue is a volume problem with a number attached. Count pages per responder per week, then use four levers to cut the ones nobody acts on.
- Incident Communication: Templates and a Cadence - Incident communication works when the first update ships in minutes. Here are the templates, the cadence by severity, and who posts each one.