/Docs

Microsoft Teams

Route experiment, flag, and safety events from A vs B into any Microsoft Teams channel. Notifications render as Adaptive Cards with the same headline, context, and primary action as their Slack counterparts, so a team using both chat platforms sees mirror messages without surprise.

Two ways to connect

Teams does not offer an OAuth path for incoming notifications. Instead, a Teams channel administrator generates a webhook URL on Microsoft’s side and pastes it into A vs B. There are two ways to obtain that URL, and A vs B accepts both:

VariantWhen to useLong-term outlook
Power Automate (recommended)The modern path Microsoft is steering customers toward. Created in the Power Automate portal as “Post a webhook request when an HTTP request is received.”First-class support. Microsoft is iterating on Power Automate as the long-term workflow surface.
Classic Incoming Webhook (legacy)The original Office 365 connector. Still works in 2026 but Microsoft has announced deprecation; new tenants may not be able to add new connectors.We continue to accept these URLs so customers who have not migrated to Power Automate are not blocked.
Pick one per channel
Each Teams destination in A vs B is a single webhook URL bound to a single channel. Customers commonly run both variants side-by-side during a migration — one channel on Power Automate, another on the classic connector — and that works as expected.

Setup: Power Automate (recommended)

  1. In Microsoft Teams, open the channel that should receive A vs B notifications.
  2. Click the + tab at the top of the channel, search forWorkflows, and add the workflows app to the channel.
  3. From the workflow templates, choose “Post to a channel when a webhook request is received”. Sign in with the Teams account that owns the channel.
  4. On the configuration page, name the workflow (e.g. “A vs B notifications”) and confirm the channel. Save the workflow.
  5. After saving, Power Automate shows the HTTP trigger URL. Copy the full URL — it includes ?api-version=… and &sig=… query parameters that A vs B uses to identify and authenticate against the workflow.
  6. In A vs B, open Organisation Settings → Integrations, click Add Teams channel, choose Power Automate (recommended), paste the URL, name the destination, and submit. A vs B fires a test ping automatically.
Screenshots
Walkthrough screenshots are placeholders in this release and will be replaced with live screenshots from a production-grade Teams tenant.

Setup: Classic Incoming Webhook (legacy)

  1. In Microsoft Teams, open the channel and choose Connectorsfrom the channel’s overflow menu.
  2. Search for Incoming Webhook and click Configure.
  3. Provide a name (e.g. “A vs B”) and optionally upload an icon. Click Create.
  4. Teams shows the webhook URL. Copy the full URL.
  5. In A vs B, open Organisation Settings → Integrations, click Add Teams channel, choose Classic Incoming Webhook (legacy), paste the URL, name the destination, and submit.
Deprecation notice
Microsoft announced in 2024 that classic Incoming Webhook connectors are deprecated and will eventually stop accepting new configurations. Plan a migration to Power Automate at your tenant’s convenience.

Events you can route

The same event vocabulary applies across all destinations. The org-level notification keyword gate ( LIVE and PROD by default) controls which experiments fire chat notifications — see the keyword convention documentation for details.

  • Experiment lifecycle: launched, paused, resumed, completed, changes published, visual changes saved
  • Analytical: winner declared, SRM check failed, guardrail breached, daily results digest
  • Feature flag: published, rule activated (not gated by keywords)
  • Exclusion groups: created, updated, deleted

Every event renders as an Adaptive Card with the same hierarchy: a bold-large headline, a subtle context row of Project · Environment · Engine, a stat block for analytical events, and a primary View in AvsB action that deep-links back to the relevant page. Winner cards carry a green container stripe; SRM and guardrail breaches carry a warning stripe and a “Safety alert — keyword gate bypassed” banner so the team understands the message fired despite the keyword gate.

Daily results digest

Slack’s daily results digest uses threaded replies under a parent message. Teams Adaptive Cards do not support threaded replies, so the Teams digest renders as a single consolidated card with each experiment as a sub-section. If the consolidated card would exceed the 28 KB Adaptive Card POST envelope, A vs B splits it into multiple cards titled “Daily results — {date} — Part {n} of {m}.

Replacing a webhook URL

When the Teams-side webhook URL changes — because the customer rotated it, recreated the connector, or migrated from classic to Power Automate — open the destination card in Project Settings → Integrations and click Replace URL. Paste the new URL; A vs B validates it, rotates the stored secret, clears any prior disable reason, and fires a test ping. Routes and delivery history are preserved.

Troubleshooting

My card didn’t render in the channel

Open the destination card on the Integrations page and click Send test. If the test fails with a clear error, follow the error’s guidance. If the test reports success but the channel does not show a card, the Power Automate flow may be writing to a different channel — check the flow’s post step in the Power Automate portal.

My webhook URL stopped working

If A vs B receives 404 or 410 from Teams on a delivery attempt, it disables the destination automatically and surfaces a banner on the card: “Webhook URL is no longer valid — regenerate on Teams and paste the new one.” Use the Replace URL flow described above to recover.

The daily digest is too long

Long digests automatically split into multiple cards titled Part {n} of {m}. If you would prefer fewer digest events, narrow the routing on the Integrations page so only a subset of experiments produce results-ready events for this destination.

Teams reports “Power Automate misconfigured”

Some misconfigured Power Automate flows return HTML success bodies instead of the expected JSON acknowledgement. A vs B treats that as a permanent failure and disables the destination. Edit the flow on the Power Automate side, confirm the HTTP trigger and the channel-post step are both saved, and use Replace URL if Power Automate regenerated the URL during the edit.

Audit log entries

Every Teams-related action records an entry in the audit log so an administrator can reconstruct exactly when and by whom each connection was created, rotated, or tested:

  • NOTIFICATION_DESTINATION_CREATED — when a Teams destination is added.
  • NOTIFICATION_DESTINATION_UPDATED — when the display name or descriptive fields change.
  • NOTIFICATION_DESTINATION_DELETED — when a destination is removed.
  • TEAMS_DESTINATION_URL_ROTATED — when the webhook URL is replaced. The change record stores the old and new secretHash fingerprints (not the URLs themselves).
  • TEAMS_TEST_MESSAGE_SENT— when a test message is sent, with the result’s success status and the Teams HTTP status code.
What we do not log
A vs B never logs the full webhook URL. Only its SHA-256 fingerprint appears in audit entries. The URL is encrypted at rest and only sent to Teams during a delivery attempt.