Incident webhook to Slack and Microsoft Teams
One webhook from your monitoring tool announces the incident in both Slack and a Teams channel.
Drag to pan, pinch to zoom. This is the real graph the template installs.
Purpose
One webhook from your monitoring tool announces the incident in both Slack and a Teams channel.
How it works
What it does
- Exposes a webhook your alerting tool can POST an incident to.
- Announces it in a Slack channel, then in a Microsoft Teams channel.
idempotency_path: idmeans a monitoring tool that retries the same incident does not start a second run.
Validation
This template is contract-validated: the unit suite checks every node type, every config key and the whole graph against the same rules a saved workflow passes. It has not been run against the live provider — the ids, names and columns below are placeholders to replace with your own.
Nodes 3
- 01Incident webhooktrigger.webhookTrigger
- 02Announce in Slackslack.post_messageApp
- 03Announce in Teamsteams.send_messageApp
View template JSON
{
"format": "mantle-workflow/v1",
"id": "slack-teams-incident-broadcast",
"name": "Incident webhook to Slack and Microsoft Teams",
"graph": {
"nodes": [
{
"id": "hook",
"type": "trigger.webhook",
"label": "Incident webhook",
"config": {
"slug": "incident",
"idempotency_path": "id",
"response_mode": "immediate"
},
"worker_type": "generic-worker",
"position": {
"x": 60,
"y": 220
}
},
{
"id": "slack",
"type": "slack.post_message",
"label": "Announce in Slack",
"config": {
"channel": "#incidents",
"text": ":rotating_light: *{{ $json.severity }}* — {{ $json.title }}\n{{ $json.description }}\nStarted {{ $now }}"
},
"worker_type": "generic-worker",
"position": {
"x": 380,
"y": 220
}
},
{
"id": "teams",
"type": "teams.send_message",
"label": "Announce in Teams",
"config": {
"team_id": "00000000-0000-0000-0000-000000000000",
"channel_id": "19:0000000000000000000000000000000@thread.tacv2",
"message": "<b>{{ $json.severity }}</b> — {{ $json.title }}<br>{{ $json.description }}",
"content_type": "html"
},
"worker_type": "generic-worker",
"position": {
"x": 700,
"y": 220
}
}
],
"edges": [
{
"from": "hook",
"to": "slack"
},
{
"from": "slack",
"to": "teams"
}
]
}
}Requirements
The connections and permissions each step needs, from the node contracts in the catalog.
- SlackAPI key
Used by Announce in Slack.
Credential: the bot token (xoxb-…), or {"token": "xoxb-…"}
- The bot must be a member of a private channel before it can post there (Slack error not_in_channel otherwise).
- Microsoft TeamsOAuth 2.0
Used by Announce in Teams.
Credential: {"client_id", "client_secret", "refresh_token"}
- Needs a delegated ChannelMessage.Send permission on the Azure AD app; the team/channel ids come from the channel's ••• → Get link to channel.
Setup
- Point your alert rule at the webhook URL and send
{id, severity, title, description}(rename the fields in the two message texts if yours differ). - Pick a Slack connection and set the channel.
- Pick a Teams connection and replace
team_id/channel_idwith your own — both are visible in the channel's Get link to channel.
Sample input and output
Synthetic examples: node-contract samples or placeholders, never customer data.
Input
The fields the template declares or reads from the request body. Values are placeholders.
{
"id": "<id>",
"severity": "<severity>",
"title": "<title>",
"description": "<description>"
}Output
Announce in Teams teams.send_message
{
"message_id": "",
"ok": true,
"web_url": ""
}Failure handling
What the graph does when a step fails, read from its retry settings, error branches and error policies.
- A step that fails, after any retries, fails the run. The failed step is kept with its input and error.
See it run, then make it yours.
Templates install as drafts. Edit any step, and Workflow Health re-checks the graph on every save.