{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Microsoft Teams Notifications","description":"Control the power of AI Agents in runtime.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"microsoft-teams-notifications","__idx":0},"children":["Microsoft Teams Notifications"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Deliver Capsule policy-violation notifications straight into a Microsoft Teams channel, so your team sees AI agent and shadow-AI signals where they already work."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a policy you've linked is violated, Capsule posts an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Adaptive Card"]}," into a Teams channel of your choice. The card summarizes the violation - severity, policy, affected entity - with a link back into the Capsule portal."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can add more than one Teams channel and link each to different policies, so (for example) high-severity violations post to your incident channel while everything else goes to a routing channel."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Capsule delivers to Teams through a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Power Automate Workflow"]}," that you create on the target channel. The workflow gives you an HTTP endpoint; Capsule posts to that endpoint, and the workflow renders the card into the channel."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"Capsule policy violation\n  → Capsule posts to your Power Automate workflow URL\n  → Power Automate \"Post card in a chat or channel\" action\n  → Adaptive Card appears in your Teams channel\n"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The legacy Office 365 ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["\"Incoming Webhook\" connector"]}," is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["retired by Microsoft and not supported"]},". Use the Power Automate Workflows path described below."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":2},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before you begin, ensure you have:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Microsoft Teams"]}," account that can create ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Power Automate Workflows"]}," in the target team"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["team and channel"]}," where you want Capsule notifications to appear"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Capsule Security"]}," account with admin access"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1-create-the-workflow-webhook","__idx":3},"children":["1. Create the workflow webhook"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create the workflow from the channel where you want Capsule to post."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In Teams, open the target channel, click the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["⋯"]}," (more options) next to the channel name, and choose ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workflows"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select the template ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["\"Post to a channel when a webhook request is received.\""]}," (You can also start from ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://make.powerautomate.com"},"children":["make.powerautomate.com"]}," and pick the same template.)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["team"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["channel"]}," the workflow will post to."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add workflow"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Copy the generated ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP POST URL"]},". This is the value you'll paste into Capsule."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If the \"Add workflow\" button is greyed out"]}," - this is a known issue with the Teams ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["desktop and PWA apps"]},", where the save/add button can stay disabled. Open Teams in a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["normal browser tab"]}," instead, or create the workflow directly at ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://make.powerautomate.com"},"children":["make.powerautomate.com"]},". Allow browser sign-in, cookies, and popups for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["make.powerautomate.com"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["login.microsoftonline.com"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teams.microsoft.com"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"treat-the-url-as-a-secret","__idx":4},"children":["Treat the URL as a secret"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The workflow URL embeds a signature (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sig=…"]},") that authorizes posting to your channel. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Anyone who has the full URL can post to the channel"]},", so treat it like a credential:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Capsule stores it securely and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["never displays it again"]}," after you save - the channel shows only a masked form (host plus the last few characters)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["To ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["rotate"]}," it, regenerate the URL in Power Automate, then paste the new URL into Capsule via ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Edit"]}," on the channel (see below)."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2-configure-the-channel-in-capsule","__idx":5},"children":["2. Configure the channel in Capsule"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Log in to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Capsule Security"]}," portal."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Go to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Settings → Notifications"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add channel"]}," and choose ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Microsoft Teams"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enter a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["display name"]}," (how this channel appears in Capsule) and paste the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["workflow URL"]}," from step 1."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save & Test"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-the-test-actually-proves","__idx":6},"children":["What the test actually proves"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A passing test means Power Automate ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["accepted"]}," the request - it returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202 Accepted"]}," the moment it receives the POST. It does ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," guarantee the card was posted to Teams: the workflow's downstream ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["\"Post card in a chat or channel\""]}," action runs afterward and can still fail."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["So after a successful test, confirm the card actually appears in your Teams channel."]}," If it doesn't, open the workflow's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["run history"]}," in Power Automate - that is the authoritative log of what happened after the request was accepted, and it will show where the post failed."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"3-link-the-channel-to-policies","__idx":7},"children":["3. Link the channel to policies"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A Teams channel only receives notifications for the policies you link to it. On the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["policy edit"]}," screen, add the Teams channel to the policy's notification channels - the same way you link any other notification destination. Link as many policies as you want; a channel with no linked policies stays idle."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"troubleshooting","__idx":8},"children":["Troubleshooting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Test passes, but no card appears in the channel."]}," The test only confirms Power Automate accepted the request (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]},"); the downstream \"Post card in a chat or channel\" action can still fail. Open the workflow's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["run history"]}," in Power Automate to see the failure. The most common cause is the workflow being edited so it no longer posts the Adaptive Card the way Capsule sends it - recreate the workflow from the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["\"Post to a channel when a webhook request is received\""]}," template."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The channel row shows an Error state."]}," Capsule flips a channel to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Error"]}," when a delivery fails, and records a (secret-free) reason. The usual causes are the workflow being ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["deleted or disabled"]},", or its signature being ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["regenerated"]}," so the old URL no longer authorizes. Fix the workflow in Power Automate, then ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Edit"]}," the channel in Capsule and paste the current URL. A successful delivery clears the error and returns the channel to Active."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Duplicate URL rejected."]}," Capsule rejects a workflow URL that another Teams channel already uses - the same workflow always posts to the same destination, so two channels pointing at it would be redundant. This check ignores the signature, so re-adding the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["same workflow with a regenerated signature"]}," is also treated as a duplicate; to rotate the signature, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Edit"]}," the existing channel rather than adding a new one. To notify a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["different"]}," channel, create a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["separate"]}," workflow on that channel and use its URL."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Rate limiting or transient failures."]}," If Power Automate is briefly unavailable or rate-limits a request, Capsule ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["retries automatically"]}," with backoff - you don't need to do anything. Persistent failures surface as an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Error"]}," state on the channel row."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"support","__idx":9},"children":["Support"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For help with this integration:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Email"]},": support@capsule.security"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Include"]},": Your organization ID, the affected channel's display name, and any error shown on the channel row"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"references","__idx":10},"children":["References"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://support.microsoft.com/en-US/teams/apps-service/create-incoming-webhooks-with-workflows-for-microsoft-teams"},"children":["Create incoming webhooks with Workflows for Microsoft Teams (Microsoft Support)"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook"},"children":["Create and send messages using incoming webhooks (Microsoft Learn)"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/"},"children":["Retirement of Office 365 connectors within Microsoft Teams"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://adaptivecards.io/"},"children":["Adaptive Cards"]}]}]}]},"headings":[{"value":"Microsoft Teams Notifications","id":"microsoft-teams-notifications","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"1. Create the workflow webhook","id":"1-create-the-workflow-webhook","depth":2},{"value":"Treat the URL as a secret","id":"treat-the-url-as-a-secret","depth":3},{"value":"2. Configure the channel in Capsule","id":"2-configure-the-channel-in-capsule","depth":2},{"value":"What the test actually proves","id":"what-the-test-actually-proves","depth":3},{"value":"3. Link the channel to policies","id":"3-link-the-channel-to-policies","depth":2},{"value":"Troubleshooting","id":"troubleshooting","depth":2},{"value":"Support","id":"support","depth":2},{"value":"References","id":"references","depth":2}],"frontmatter":{"seo":{"title":"Microsoft Teams Notifications"}},"lastModified":"2026-07-22T15:37:08.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/microsoft-teams","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}