Microsoft Teams adaptive card templates for GitHub events
12 ready-to-copy Microsoft Teams adaptive card JSON templates for the most common GitHub events. Use them with Power Automate Workflows, GitHub Actions, or any webhook tool. Or skip the JSON entirely with PullNotifier.
Targeting: microsoft teams adaptive card template · Last updated 2026-05-02
Contents
Skip the manual setup
PullNotifier installs from Microsoft AppSource in 5 minutes — no YAML, no Power Automate flows.
The 12 templates
Click Copy JSON on any template to paste it into your Power Automate flow, GitHub Actions workflow, or webhook handler. Each template ships with a small visual preview so you know what it looks like in Microsoft Teams before you wire it up.
Each card below uses Adaptive Card schema v1.5 — the format Microsoft Teams renders natively in channels, chats, and the Workflows app. Replace the {{...}} placeholders with your live GitHub event payload (e.g. {{pull_request.html_url}}) before posting.
GitHub PR opened adaptive card
Notify a Microsoft Teams channel the moment a new pull request is opened. Includes author avatar, repo metadata, and quick-jump action buttons.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Accent",
"text": "Pull request opened"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{user.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{ "type": "TextBlock", "weight": "Bolder", "text": "{{user.login}}" },
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Good",
"text": "OPEN",
"size": "Small"
},
{
"type": "TextBlock",
"text": "{{body}}",
"wrap": true,
"maxLines": 4
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View PR", "url": "{{html_url}}" },
{ "type": "Action.OpenUrl", "title": "Files changed", "url": "{{html_url}}/files" }
]
}Preview in Teams
Pull request opened
octocat · acme/api · #482
Add retry logic to webhook delivery worker
When to use
- Default channel announcement when any PR is opened in a watched repo
- Pair with Power Automate "When a pull request is opened" GitHub trigger
- Drop into a custom GitHub Actions workflow that posts to a Teams webhook
PR review request Microsoft Teams card
Sent when a draft PR transitions to "ready for review" or when reviewers are explicitly requested. Includes an @-mention example for the requested reviewer.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Accent",
"text": "Review requested"
},
{
"type": "TextBlock",
"text": "<at>{{requested_reviewer.login}}</at>, please review this PR.",
"wrap": true
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{user.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{ "type": "TextBlock", "weight": "Bolder", "text": "{{user.login}}" },
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Warning",
"text": "READY FOR REVIEW",
"size": "Small"
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "Review PR", "url": "{{html_url}}/files" },
{ "type": "Action.OpenUrl", "title": "Open conversation", "url": "{{html_url}}" }
],
"msteams": {
"entities": [
{
"type": "mention",
"text": "<at>{{requested_reviewer.login}}</at>",
"mentioned": {
"id": "{{requested_reviewer.teams_id}}",
"name": "{{requested_reviewer.display_name}}"
}
}
]
}
}Preview in Teams
Review requested
alice · acme/api · #482
@bob, please review: Add retry logic to webhook delivery worker
When to use
- Ping a specific reviewer the moment they are requested
- Use msteams.entities to resolve GitHub login to Microsoft Teams ID
- Pair with the GitHub "review_requested" event in Power Automate
PR approved adaptive card Teams
Celebrate a successful code review. Sent when a reviewer approves a pull request. Pairs nicely with the merge-ready signal.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Good",
"text": "PR approved"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{review.user.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{review.user.login}} approved"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{pull_request.title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Good",
"text": "APPROVED ✓",
"size": "Small"
},
{
"type": "TextBlock",
"text": "{{review.body}}",
"wrap": true,
"maxLines": 4
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View review", "url": "{{review.html_url}}" },
{ "type": "Action.OpenUrl", "title": "Merge PR", "url": "{{pull_request.html_url}}" }
]
}Preview in Teams
PR approved
bob approved · acme/api · #482
LGTM. Nice cleanup of the retry helper.
When to use
- Notify the PR author the moment their work is approved
- Trigger downstream automation (auto-merge bots) once approval count crosses threshold
- Public visibility into review velocity for engineering managers
PR changes requested Microsoft Teams
Inform the PR author that a reviewer requested changes. Includes the reviewer comment so the author can act without context-switching.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Attention",
"text": "Changes requested"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{review.user.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{review.user.login}} requested changes"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{pull_request.title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Attention",
"text": "CHANGES REQUESTED",
"size": "Small"
},
{
"type": "TextBlock",
"text": "{{review.body}}",
"wrap": true,
"maxLines": 6
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "Read review", "url": "{{review.html_url}}" },
{ "type": "Action.OpenUrl", "title": "Open files", "url": "{{pull_request.html_url}}/files" }
]
}Preview in Teams
Changes requested
bob requested changes · acme/api · #482
Could you add a unit test for the retry backoff cap?
When to use
- Reduce review-cycle latency by alerting authors instantly
- Combine with personal notifications for the PR author only
- Display the inline review comment in the card body
PR merged Microsoft Teams adaptive card
Announce a successful merge to the channel. Includes the merge commit SHA, author, and a quick link to the deployment dashboard.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Good",
"text": "Pull request merged"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{merged_by.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{merged_by.login}} merged into {{base.ref}}"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}} · {{merge_commit_sha}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Good",
"text": "MERGED",
"size": "Small"
},
{
"type": "FactSet",
"facts": [
{ "title": "Commits", "value": "{{commits}}" },
{ "title": "Files changed", "value": "{{changed_files}}" },
{ "title": "+/-", "value": "+{{additions}} / -{{deletions}}" }
]
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View merge", "url": "{{html_url}}" },
{ "type": "Action.OpenUrl", "title": "Deploy status", "url": "https://deploys.example.com/{{merge_commit_sha}}" }
]
}Preview in Teams
Pull request merged
alice merged into main · acme/api · #482
Add retry logic to webhook delivery worker · +124/-32
When to use
- Channel-wide visibility on what just shipped to main
- Connect to your deploy pipeline for inline tracking
- Audit trail of merges for engineering retrospectives
PR closed adaptive card
Notify the channel when a pull request is closed without being merged. Useful for detecting abandoned work or scope changes.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Attention",
"text": "Pull request closed (not merged)"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{sender.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{ "type": "TextBlock", "weight": "Bolder", "text": "{{sender.login}} closed" },
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Attention",
"text": "CLOSED",
"size": "Small"
},
{
"type": "TextBlock",
"text": "Closed without merge after {{days_open}} days. Reason: {{close_reason}}",
"wrap": true,
"isSubtle": true
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View PR", "url": "{{html_url}}" },
{ "type": "Action.OpenUrl", "title": "Reopen", "url": "{{html_url}}" }
]
}Preview in Teams
Pull request closed (not merged)
alice closed · acme/api · #482
Closed without merge after 14 days. Replaced by #491.
When to use
- Track abandoned PRs that need cleanup or follow-up
- Surface scope-change conversations to the team lead
- Record close reasons in your engineering analytics tool
GitHub Actions failed Microsoft Teams card
Alert the channel when a GitHub Actions workflow fails. Includes the failed job, branch, commit, and a re-run shortcut.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Attention",
"text": "❌ Workflow failed"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{workflow.name}}"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · {{head_branch}} · {{head_sha_short}}"
}
]
}
]
},
{
"type": "TextBlock",
"color": "Attention",
"text": "FAILED",
"size": "Small"
},
{
"type": "FactSet",
"facts": [
{ "title": "Triggered by", "value": "{{actor.login}}" },
{ "title": "Failed job", "value": "{{failed_job_name}}" },
{ "title": "Duration", "value": "{{duration}}" }
]
},
{
"type": "TextBlock",
"text": "First failing step: {{failed_step_name}}",
"wrap": true,
"isSubtle": true
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View logs", "url": "{{html_url}}" },
{ "type": "Action.OpenUrl", "title": "Re-run failed jobs", "url": "{{html_url}}/rerun" },
{ "type": "Action.OpenUrl", "title": "View commit", "url": "{{commit_url}}" }
]
}Preview in Teams
Workflow failed
CI · acme/api · main · a1b2c3d
First failing step: Run integration tests · 3m 42s
When to use
- Catch broken main-branch builds before they block the team
- Page on-call when overnight workflows fail
- Connect with the workflow_run.failure GitHub event
CI passed Microsoft Teams adaptive card
Quick confirmation that a workflow succeeded. Useful for release branches, nightly runs, and main-branch protection signalling.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Good",
"text": "✅ Workflow succeeded"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{workflow.name}}"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · {{head_branch}} · {{head_sha_short}}"
}
]
}
]
},
{
"type": "TextBlock",
"color": "Good",
"text": "PASSED",
"size": "Small"
},
{
"type": "FactSet",
"facts": [
{ "title": "Triggered by", "value": "{{actor.login}}" },
{ "title": "Jobs", "value": "{{jobs_count}} passed" },
{ "title": "Duration", "value": "{{duration}}" }
]
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View run", "url": "{{html_url}}" },
{ "type": "Action.OpenUrl", "title": "View commit", "url": "{{commit_url}}" }
]
}Preview in Teams
Workflow succeeded
CI · acme/api · main · a1b2c3d
12 jobs passed in 4m 18s
When to use
- Confirm green main after a known-flaky test was fixed
- Acknowledge release-branch builds before publishing
- Pair with workflow_run.success or check_suite.completed events
Deployment notification Microsoft Teams
Confirm a successful deployment to a target environment. Includes environment, commit, and a link to the live URL or deployment dashboard.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Good",
"text": "🚀 Deployment succeeded"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{deployment.environment}}"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · {{deployment.ref}} · {{deployment.sha_short}}"
}
]
}
]
},
{
"type": "TextBlock",
"color": "Good",
"text": "DEPLOYED",
"size": "Small"
},
{
"type": "FactSet",
"facts": [
{ "title": "Deployed by", "value": "{{deployment.creator.login}}" },
{ "title": "Version", "value": "{{deployment.payload.version}}" },
{ "title": "Duration", "value": "{{duration}}" }
]
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "Open environment", "url": "{{deployment_status.environment_url}}" },
{ "type": "Action.OpenUrl", "title": "Deployment logs", "url": "{{deployment_status.log_url}}" },
{ "type": "Action.OpenUrl", "title": "View release", "url": "{{release_url}}" }
]
}Preview in Teams
Deployment succeeded
production · acme/api · v2.14.0
Deployed by alice in 2m 47s
When to use
- Announce production releases to the engineering org
- Track staging deploys ahead of QA hand-off
- Pair with deployment_status.success GitHub events
Rollback notification Microsoft Teams
Critical alert sent when a deployment fails or auto-rollback is triggered. Highlights the failure reason and bridges straight into incident response.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Large",
"weight": "Bolder",
"color": "Attention",
"text": "🛑 Deployment failed — rollback initiated"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{deployment.environment}}"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · {{deployment.ref}} · {{deployment.sha_short}}"
}
]
}
]
},
{
"type": "TextBlock",
"color": "Attention",
"text": "ROLLED BACK",
"size": "Small"
},
{
"type": "FactSet",
"facts": [
{ "title": "Triggered by", "value": "{{deployment.creator.login}}" },
{ "title": "Failure stage", "value": "{{deployment_status.state}}" },
{ "title": "Reverted to", "value": "{{previous_release.tag_name}}" }
]
},
{
"type": "TextBlock",
"text": "{{deployment_status.description}}",
"wrap": true
},
{
"type": "TextBlock",
"text": "<at>{{oncall.login}}</at> please investigate.",
"wrap": true
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "Open incident channel", "url": "{{incident_url}}" },
{ "type": "Action.OpenUrl", "title": "Deployment logs", "url": "{{deployment_status.log_url}}" },
{ "type": "Action.OpenUrl", "title": "Runbook", "url": "{{runbook_url}}" }
],
"msteams": {
"entities": [
{
"type": "mention",
"text": "<at>{{oncall.login}}</at>",
"mentioned": {
"id": "{{oncall.teams_id}}",
"name": "{{oncall.display_name}}"
}
}
]
}
}Preview in Teams
Deployment failed — rollback initiated
production · acme/api · v2.14.1
Health check failed after 90s. Reverted to v2.14.0. @oncall please investigate.
When to use
- Page on-call when production rollback fires
- Trigger an incident channel auto-creation flow
- Pair with deployment_status.failure or deployment_status.error events
GitHub issue alert Microsoft Teams
Surface high-priority issues the moment they are opened. Filter on the priority:high label to keep noise down.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Attention",
"text": "🚨 High-priority issue opened"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "auto",
"items": [
{
"type": "Image",
"url": "{{user.avatar_url}}",
"size": "Small",
"style": "Person"
}
]
},
{
"type": "Column",
"width": "stretch",
"items": [
{ "type": "TextBlock", "weight": "Bolder", "text": "{{user.login}}" },
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · #{{number}}"
}
]
}
]
},
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{title}}",
"wrap": true
},
{
"type": "TextBlock",
"color": "Attention",
"text": "PRIORITY: HIGH",
"size": "Small"
},
{
"type": "TextBlock",
"text": "{{body}}",
"wrap": true,
"maxLines": 5
},
{
"type": "TextBlock",
"text": "Labels: {{labels}}",
"wrap": true,
"isSubtle": true
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "Triage issue", "url": "{{html_url}}" },
{ "type": "Action.OpenUrl", "title": "Assign to me", "url": "{{html_url}}" }
]
}Preview in Teams
High-priority issue opened
jenny · acme/api · #1421
Checkout flow returns 500 for ~2% of mobile users on iOS 18.
When to use
- Triage critical customer-reported bugs in a #support-escalation channel
- Page the on-call engineer for SEV-2 severity issues
- Pair with issues.opened or issues.labeled GitHub events filtered on label
Security alert Microsoft Teams card
Notify the security or engineering channel when Dependabot or GitHub Advanced Security flags a vulnerability. Includes severity, package, and remediation link.
adaptive-card.json
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"color": "Attention",
"text": "🔒 Security alert"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "TextBlock",
"weight": "Bolder",
"text": "{{alert.security_advisory.summary}}"
},
{
"type": "TextBlock",
"spacing": "None",
"isSubtle": true,
"text": "{{repository.full_name}} · {{alert.dependency.package.ecosystem}}/{{alert.dependency.package.name}}"
}
]
}
]
},
{
"type": "TextBlock",
"color": "Attention",
"text": "SEVERITY: {{alert.security_vulnerability.severity}}",
"size": "Small"
},
{
"type": "FactSet",
"facts": [
{ "title": "CVE", "value": "{{alert.security_advisory.cve_id}}" },
{ "title": "Vulnerable range", "value": "{{alert.security_vulnerability.vulnerable_version_range}}" },
{ "title": "Patched version", "value": "{{alert.security_vulnerability.first_patched_version.identifier}}" },
{ "title": "Manifest", "value": "{{alert.dependency.manifest_path}}" }
]
},
{
"type": "TextBlock",
"text": "{{alert.security_advisory.description}}",
"wrap": true,
"maxLines": 4
},
{
"type": "TextBlock",
"text": "<at>{{security_team.login}}</at> please review and dispatch.",
"wrap": true
}
],
"actions": [
{ "type": "Action.OpenUrl", "title": "View advisory", "url": "{{alert.html_url}}" },
{ "type": "Action.OpenUrl", "title": "Open Dependabot PR", "url": "{{auto_dependabot_pr_url}}" },
{ "type": "Action.OpenUrl", "title": "Dismiss", "url": "{{alert.html_url}}" }
],
"msteams": {
"entities": [
{
"type": "mention",
"text": "<at>{{security_team.login}}</at>",
"mentioned": {
"id": "{{security_team.teams_id}}",
"name": "{{security_team.display_name}}"
}
}
]
}
}Preview in Teams
Security alert
acme/api · npm/lodash
CVE-2025-19999 — Prototype pollution in lodash <4.17.22. Patched in 4.17.22.
When to use
- Route critical CVEs to your #security channel
- Pair with the dependabot_alert.created or secret_scanning_alert.created events
- Drive SLA timers from the moment the alert fires
How to use these templates
These templates are payload-ready Adaptive Card v1.5 JSON. There are three common ways to ship them:
- Power Automate Workflows. Use the Workflows app in Microsoft Teams. Trigger on a GitHub event (or a generic HTTP request), then add the "Post adaptive card in a chat or channel" action. Paste the JSON and bind
{{...}}placeholders to the dynamic content. - GitHub Actions. POST the JSON to a Microsoft Teams Workflow webhook URL using
curlor a community action. The body of the request must wrap the card in anattachmentsarray withcontentType: application/vnd.microsoft.card.adaptive. - Custom webhook handler. If you already process GitHub webhooks server-side, render the template with your favourite templating library (Mustache, Handlebars, JS template literals) and POST it to the channel webhook URL.
Placeholder reference
Each template uses Mustache-style {{...}} placeholders. They map directly to the GitHub webhook payload. Common ones:
{{pull_request.html_url}}— full PR URL on github.com{{repository.full_name}}— owner/repo, e.g.acme/api{{user.login}},{{user.avatar_url}}— author identity{{workflow.name}},{{head_sha_short}}— for CI cards{{deployment.environment}}— for deployment cards{{alert.security_advisory.cve_id}}— for Dependabot cards
For the full GitHub webhook payload reference, see GitHub's docs at docs.github.com/en/webhooks/webhook-events-and-payloads.
@-mentions: the gotcha
Microsoft Teams adaptive cards do not support GitHub-style @username mentions out of the box. To trigger a real notification, you need two things:
- An
<at>name</at>tag inside any TextBlock body where the mention should appear. - An
msteams.entitiesarray on the card root that maps each tag to a Microsoft Teams / Azure AD user ID. The id field must be the Teams ID — not the GitHub login.
That GitHub-login-to-Teams-ID mapping is the painful part. The PR review request, rollback, and security alert templates above show the structure. PullNotifier handles the mapping automatically.
Want to skip the templates entirely?
PullNotifier installs from Microsoft AppSource and sends polished adaptive cards out of the box — with live in-place updates, smart filtering, GitHub-to-Microsoft-Teams user mapping, code review reminders, and per-channel routing rules. No JSON to author, no Power Automate Flow to maintain, no broken{{placeholder}} bugs at 2am.
GitHub PR opened adaptive card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#pr-opened)Notify a Microsoft Teams channel the moment a new pull request is opened. Includes author avatar, repo metadata, and quick-jump action buttons.
PR review request Microsoft Teams card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#pr-ready-for-review)Sent when a draft PR transitions to "ready for review" or when reviewers are explicitly requested. Includes an @-mention example for the requested reviewer.
PR approved adaptive card Teams
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#pr-approved)Celebrate a successful code review. Sent when a reviewer approves a pull request. Pairs nicely with the merge-ready signal.
PR changes requested Microsoft Teams
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#pr-changes-requested)Inform the PR author that a reviewer requested changes. Includes the reviewer comment so the author can act without context-switching.
PR merged Microsoft Teams adaptive card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#pr-merged)Announce a successful merge to the channel. Includes the merge commit SHA, author, and a quick link to the deployment dashboard.
PR closed adaptive card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#pr-closed)Notify the channel when a pull request is closed without being merged. Useful for detecting abandoned work or scope changes.
GitHub Actions failed Microsoft Teams card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#ci-workflow-failed)Alert the channel when a GitHub Actions workflow fails. Includes the failed job, branch, commit, and a re-run shortcut.
CI passed Microsoft Teams adaptive card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#ci-workflow-succeeded)Quick confirmation that a workflow succeeded. Useful for release branches, nightly runs, and main-branch protection signalling.
Deployment notification Microsoft Teams
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#deployment-succeeded)Confirm a successful deployment to a target environment. Includes environment, commit, and a link to the live URL or deployment dashboard.
Rollback notification Microsoft Teams
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#deployment-failed)Critical alert sent when a deployment fails or auto-rollback is triggered. Highlights the failure reason and bridges straight into incident response.
GitHub issue alert Microsoft Teams
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#issue-priority-high)Surface high-priority issues the moment they are opened. Filter on the priority:high label to keep noise down.
Security alert Microsoft Teams card
(https://pullnotifier.com/tools/microsoft-teams-adaptive-card-templates#security-alert)Notify the security or engineering channel when Dependabot or GitHub Advanced Security flags a vulnerability. Includes severity, package, and remediation link.
Frequently asked
What Adaptive Card version does Microsoft Teams support?
Microsoft Teams renders Adaptive Card schema v1.5 in channels, group chats, and 1:1 chats as of 2026. All templates on this page target v1.5. Older v1.4 elements still work, but v1.5 unlocks new layout primitives such as carousel and refined column behaviour.
Can I use these templates with the retired Office 365 Connectors?
No. Office 365 Connectors used the legacy MessageCard format and were retired by Microsoft on December 31, 2025. These templates use modern Adaptive Card v1.5, which is compatible with Microsoft Teams Workflows (Power Automate), Incoming Webhook 2.0, and the Microsoft Bot Framework. See our Office 365 Connector migration guide for the full deprecation timeline.
How do I add @-mentions to a card?
Add an <at>name</at> tag inside a TextBlock and a matching entry in the msteams.entities array on the card root. The mentioned.id field must be the Microsoft Teams (Azure AD) user ID — not the GitHub login. The PR review request, rollback, and security alert templates on this page show the exact structure.
Where do I paste these templates?
Three common destinations: (1) Power Automate Workflows — paste into the "Post adaptive card in a chat or channel" action. (2) GitHub Actions — POST the JSON to a Microsoft Teams Workflow webhook URL via curl. (3) A custom webhook handler — render the template server-side and POST to the channel webhook URL.
Are these templates free?
Yes. Every template on this page is free to copy, modify, and use commercially. No attribution required. We built them as a useful resource for engineering teams that prefer hand-rolling their integrations.
Do they work with GitHub Enterprise Server?
Yes. The Adaptive Card JSON is identical regardless of where the GitHub webhook originates. Just point your GitHub Enterprise Server webhook at the Microsoft Teams Workflow URL or your custom handler. The placeholders are the same fields GHES sends in its webhook payloads.
Keep reading
PullNotifier
© 2026 PullNotifier. All rights reserved
Microsoft Teams
Solutions