Incoming Webhooks: Posting Into a Channel
An incoming webhook is the simplest way to push a message into a specific Teams channel: a channel owner adds the Incoming Webhook connector from the channel's connector list, gives it a name and icon, and receives a unique HTTPS URL. Any external system — a CI server, a monitoring tool, a script — can then POST a JSON payload to that URL and the message appears in the channel, with no OAuth token, app registration, or bot required, making it the fastest way to get simple notifications flowing.
Cricket analogy: This is like a stadium giving the ground announcer's PA system a single dedicated phone line — anyone with that number can call in a score update and it's broadcast to the whole crowd, no credential check required.
POST https://outlook.office.com/webhook/{unique-id}/IncomingWebhook/{token}/{guid}
Content-Type: application/json
{
"@type": "MessageCard",
"@context": "http://schema.org/extensions",
"themeColor": "0076D7",
"summary": "Deployment finished",
"sections": [{
"activityTitle": "Deployment to production succeeded",
"facts": [
{ "name": "Service", "value": "payments-api" },
{ "name": "Version", "value": "3.4.1" }
],
"markdown": true
}]
}Office 365 Connectors and Their Deprecation
Office 365 Connectors extended the incoming webhook idea into pre-built integrations — GitHub, Trello, RSS, Azure DevOps — that a channel owner could configure through a gallery without writing any code, mapping specific external events to formatted MessageCard notifications. Microsoft has deprecated Connectors in favor of Workflows built on Power Automate, meaning any tenant still relying on the classic Connectors gallery should plan a migration, since Microsoft has been progressively retiring the legacy connector infrastructure.
Cricket analogy: This is like a cricket board retiring an old manual scoreboard-relay system in favor of a modern digital broadcast pipeline — the old gallery of pre-built connectors is being phased out for Power Automate workflows.
If you inherited a Teams channel with legacy Office 365 Connectors configured, check Microsoft's Message Center for tenant-specific deprecation dates and use the built-in migration guidance to move each connector's logic into an equivalent Power Automate flow.
Change Notifications: Subscribing to Graph Events
Beyond one-way webhooks, Microsoft Graph offers change notifications (also called subscriptions) for two-way event-driven integrations: an app calls POST /subscriptions specifying a resource like /teams/{id}/channels/{id}/messages, a notificationUrl it controls, and an expirationDateTime, and Graph then POSTs a notification payload to that URL whenever a matching message is created, updated, or deleted. Subscriptions expire — typically after 60 minutes for chat messages — so a production app must renew them before expiry via PATCH, and must validate the clientState value on every notification to confirm it originated from the genuine subscription.
Cricket analogy: This is like a broadcaster subscribing to a stadium's official event feed that pushes a notification the instant a wicket falls, rather than the broadcaster having to keep refreshing the scoreboard manually.
Chat and channel message subscriptions have short maximum lifetimes (often 60 minutes) compared to other Graph resources. Build renewal into a scheduled job well before expiry — a lapsed subscription silently stops delivering notifications with no error thrown on the sending side.
- Incoming webhooks give a channel a unique URL that any external system can POST a MessageCard payload to, with no OAuth needed.
- Office 365 Connectors were a no-code gallery of pre-built webhook integrations and are being deprecated in favor of Power Automate workflows.
- Graph change notifications (subscriptions) let an app receive a push notification when a resource like a channel message changes.
- Creating a subscription requires a resource path, a notificationUrl, and an expirationDateTime.
- Message-related subscriptions expire quickly (often around 60 minutes) and must be renewed via PATCH before expiry.
- Always validate the clientState value on incoming notifications to confirm authenticity.
- Migrate any legacy Connector-based integrations to Power Automate flows ahead of tenant deprecation dates.
Practice what you learned
1. What is required to post a message via an incoming webhook?
2. What is replacing Office 365 Connectors in Teams?
3. What must an app do before a Graph change notification subscription expires?
4. What field should be validated on every incoming Graph change notification?
5. Roughly how long do chat/channel message change notification subscriptions typically last before expiring?
Was this page helpful?
You May Also Like
Microsoft Graph API for Teams
Learn how to read and write Teams data — teams, channels, messages, and members — through the unified Microsoft Graph REST API.
Power Automate with Teams
See how low-code Power Automate flows trigger on Teams events and post adaptive cards, approvals, and notifications without custom code.
Single Sign-On (SSO) in Teams Apps
Understand how Teams apps silently authenticate users through Microsoft Entra ID using the getAuthToken and On-Behalf-Of flows.
Related Reading
Related Study Notes in Microsoft Technologies
Browse all study notesWindows 10 / UWP Development Study Notes
.NET · 30 topics
Microsoft TechnologiesWindows Batch Scripting Study Notes
Batch · 30 topics
Microsoft TechnologiesMFC (Microsoft Foundation Classes) Study Notes
C++ · 30 topics
Microsoft TechnologiesSilverlight Study Notes
.NET · 30 topics
Microsoft TechnologiesXAML Study Notes
.NET · 30 topics
Microsoft TechnologiesWPF (Windows Presentation Foundation) Study Notes
.NET · 30 topics