Pipeline Teams Notifier
Keep your team instantly informed — Pipeline Teams Notifier posts a rich, color-coded Adaptive Card to any Microsoft Teams channel the moment a pipeline run completes. No bots, no connectors, no complicated configuration: just a single task and a webhook URL.
What you get in Teams
Each notification is a structured Adaptive Card that surfaces the information that matters:
| Field |
Classic Release |
YAML / Build |
| Status header |
✅ Deployment Successful / ❌ Deployment Failed |
same |
| Service |
Primary artifact source alias |
Pipeline name |
| Version |
Release name (e.g. Release-42) |
Build number |
| Environment |
Stage / environment name |
Source branch name |
| Build |
Build number of the artifact |
Build number |
| Triggered by |
Who requested the release |
Who triggered the build |
| Timestamp |
UTC |
UTC |
| Action button |
🔗 View Release |
🔗 View Build |
The card header is green on success and red on failure — your team can scan the channel at a glance without opening a single link.
Features
- Adaptive Card v1.4 — renders natively in Teams desktop, web, and mobile.
- Classic Releases and YAML pipelines — automatically adapts the card fields to the pipeline type.
- Noise control — set
notifyOn to failureOnly to silence notifications on success, so the channel only lights up when attention is actually needed.
- Custom message title — label each pipeline individually (e.g.
Production Deploy, Staging Smoke Test).
- No extra dependencies — uses Node's built-in
https module; nothing beyond azure-pipelines-task-lib is required.
- Secure by default — store the webhook URL in a pipeline secret variable and reference it as
$(TeamsWebhookSecret).
Requirements
- An Azure DevOps project running Pipelines (Classic or YAML).
- A Microsoft Teams channel with a Workflows (Power Automate) incoming webhook configured (see setup below).
Note: The legacy "Incoming Webhook" connector was retired by Microsoft in 2024. This extension uses the modern Workflows webhook, which is the currently supported method.
Setup
Step 1 — Create the Teams webhook
- In Microsoft Teams, navigate to the channel where you want notifications to appear.
- Click the
... menu next to the channel name → Workflows.
- Search for the template "Post to a channel when a webhook request is received" and select it.
- Follow the prompts, then copy the generated HTTP POST URL — you will need it in the next step.
Step 2 — Store the webhook URL as a secret
In your Azure DevOps pipeline, add a secret variable (e.g. TeamsWebhookUrl) and paste the webhook URL as its value. Mark it as secret so it is not exposed in logs.
Step 3 — Add the task to your pipeline
YAML pipeline
Add the task as the last step in your job (or as a separate always-run job) so it can report the final status:
- task: PipelineTeamsNotifier@1
condition: always()
inputs:
teamsWebhook: '$(TeamsWebhookUrl)'
messageTitle: 'Production Deploy'
notifyOn: 'always'
To notify only on failure:
- task: PipelineTeamsNotifier@1
condition: always()
inputs:
teamsWebhook: '$(TeamsWebhookUrl)'
messageTitle: 'Production Deploy'
notifyOn: 'failureOnly'
Classic Release pipeline
- Open your release pipeline and navigate to the stage you want to monitor.
- Add Pipeline Teams Notifier as an agentless task in the stage — or as a regular task at the end of the agent job.
- Fill in the inputs in the task editor.
Tip for Classic Releases: Add the task to an "always run" condition so it fires whether the preceding tasks succeeded or failed.
| Input |
Required |
Default |
Description |
teamsWebhook |
Yes |
— |
HTTPS URL of the Microsoft Teams Workflows incoming webhook. Store this as a secret variable. |
messageTitle |
No |
Deployment Notification |
Custom label shown inside the card body (e.g. Production Deploy, Hotfix). |
notifyOn |
Yes |
— |
always — send on every run. failureOnly — send only when the pipeline fails. |
Examples
Notify on every run
- task: PipelineTeamsNotifier@1
displayName: 'Notify Teams'
condition: always()
inputs:
teamsWebhook: '$(TeamsWebhookUrl)'
messageTitle: 'API Service — Staging'
notifyOn: 'always'
Notify only on failure (production gate)
- task: PipelineTeamsNotifier@1
displayName: 'Notify Teams on Failure'
condition: always()
inputs:
teamsWebhook: '$(TeamsWebhookUrl)'
messageTitle: 'Production Deploy'
notifyOn: 'failureOnly'