Turning Static Notifications into Interactive Teams Workflows
Welcome back, everyone! If you are anything like me, you are probably drowning in a sea of static notifications every single day. Ping, beep, badge count up—someone posted an update, asked for a review, or dropped a generic message in a Microsoft Teams channel. And what do we usually do? We read it, maybe forget about it, or worse, have to open up an entirely separate browser tab, log into another app, and click around just to submit a tiny piece of feedback or approve a simple request. It is friction-heavy, it kills user engagement, and it pulls your team completely out of their flow state.
That is precisely why we are tackling this massive productivity bottleneck. We want to show you how to take those boring, static alerts and upgrade them into fully interactive Adaptive Cards. Imagine collecting feedback, kicking off robust background processes, branching conversations with bots, and personalizing content dynamically on the fly—all without your users ever leaving the Microsoft Teams app. To hear the complete discussion breakdown and catch all of our deep-dive audio segments, make sure you listen to the companion podcast episode: Build Interactive Microsoft Teams Adaptive Cards. Now, let us dive deep into the architecture, the code snippets, and the exact patterns you need to master this capability today.
Episode Overview
Are you completely tired of static notifications? In this guide—and in our related podcast episode—we turn standard Adaptive Cards into high-powered interactive experiences. You will learn how to effortlessly collect feedback, kick off complex workflows, branch conversations using intelligent bots, and personalize content dynamically. Along the way, we are providing you with copy-paste JSON, deployment tips, and proven patterns designed to keep your users comfortably inside Teams while your automated processes run smoothly in the background.
Who This Is For
- Teams admins, makers, and bot builders
- Power Automate and Power Platform professionals
- Developers wiring Microsoft 365 workflows via Microsoft Graph or the Bot Framework
- Communications, HR, and IT leads who want significantly higher engagement and far fewer ignored posts
Core Concepts (Fast)
- Schema building blocks:
typedefines the card or element,bodydictates what users actually see, andactionsdictate what users can do. - Interactivity:
Action.Submitsends raw data directly to your flow or bot backend,Action.Executehandles context-aware bot actions, andAction.OpenUrlshould generally be saved as an absolute last resort. - Inputs: Utilize elements like
Input.Text,Input.Number,Input.ChoiceSet, andInput.Dateto capture clean data. - Dynamic UX: Leverage templating via
${...}syntax, data binding, and conditionalisVisibleproperties to tailor the experience.
Copy-Paste Starters
1) Collect feedback inside Teams
Let us kick things off with a foundational snippet. This card presents a quick policy update notice along with a text box for comments and an expanded choice set for user sentiment.
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.5", "body": [ { "type": "TextBlock", "text": "Policy Update: Quick Feedback", "weight": "Bolder", "size": "Large" }, { "type": "Input.Text", "id": "policyFeedback", "placeholder": "Share your thoughts..." }, { "type": "Input.ChoiceSet", "id": "sentiment", "style": "expanded", "choices": [ { "title": "👍 Helpful", "value": "positive" }, { "title": "😐 Neutral", "value": "neutral" }, { "title": "👎 Needs work", "value": "negative" } ] } ], "actions": [ { "type": "Action.Submit", "title": "Send", "data": { "kind": "policy-feedback" } } ]}What happens: The moment a user clicks Send, Teams automatically packages up the policyFeedback, the chosen sentiment, and your custom data.kind property and fires it off directly to your connected bot or automated flow.
2) Kick off a Power Automate flow (HTTP trigger)
- Configure a standard Power Automate workflow utilizing the When an HTTP request is received trigger.
- Inside your card's
Action.Submitdefinition, pass the flow URL via your intermediate bot or utilize an incoming webhook endpoint. The resulting flow body will automatically include all of your defined input IDs alongside your customdataproperties.
Expected payload excerpt:
{ "kind": "policy-feedback", "policyFeedback": "Please clarify WFH days.", "sentiment": "neutral", "from": { "aadObjectId": "user-guid", "name": "Adele V." }}3) Branch with a bot using Action.Execute
{ "type": "Action.Execute", "title": "Approve", "verb": "approveRequest", "data": { "requestId": "${request.id}" }}Bot handler idea: Upon receiving the approveRequest verb, your backend should validate user ACLs, write the transaction securely to Dataverse or SharePoint, and then respond directly to the card activity with an updated layout—such as marking the overall status as Approved and hiding the action buttons entirely.
4) Conditional visibility & personalization
{ "type": "Container", "items": [ { "type": "TextBlock", "text": "Hello, ${user.displayName}!" }, { "type": "TextBlock", "text": "Task: ${task.title}" } ], "isVisible": "${task.status != 'completed'}"}5) Safer choices (prevent fat-fingered writes)
{ "type": "Input.ChoiceSet", "id": "priority", "value": "normal", "choices": [ { "title": "Low", "value": "low" }, { "title": "Normal", "value": "normal" }, { "title": "High (requires reason)", "value": "high" } ], "wrap": true}In your backend handler logic, you can easily enforce a validation rule requiring a text justification if the user sets priority == "high" before allowing the workflow to proceed.
Design Patterns That Work
- Micro-approvals: Build clean Approve or Reject mechanisms complete with required comment fields, updating the card inline immediately upon completion.
- Triage cards: Implement a ChoiceSet to dynamically route incoming IT or HR support tickets, allowing a bot to post automated follow-up questions based on the specific route selected.
- Targeted nudges: Design your cards to exclusively display a “Remind assignees” button if the underlying condition
${overdueCount} > 0evaluates to true. - Checklists: Render active remaining tasks while cleanly hiding already completed items using native
isVisibleconditions.
Testing & Tooling
- Always make use of the official Adaptive Card Designer to preview your layouts across the Teams desktop host and mobile form factors.
- Carefully validate your chosen schema version—use version
1.4or higher if you are relying onisVisibleparameters, and1.5for cutting-edge features. - Log the raw submit payloads during your local development phases to rigorously verify input IDs and overall data shapes.
Wiring Options (Choose Your Backend)
- Power Automate: The absolute fastest way to get started. Map your incoming card inputs directly to SharePoint, Dataverse, email notifications, or approval chains.
- Bots (Bot Framework / Teams Toolkit): Gives you maximum architectural control. Use
Action.Executeto build highly responsive, multi-step conversational workflows. - Azure Functions / Logic Apps: Fantastic, lightweight options for managing custom webhooks and specialized backend APIs.
Guardrails & Gotchas
- Every input needs an
id. If your input element does not have an explicitidattribute, you will receive zero data back. - Don’t overuse OpenUrl. Whenever possible, keep your users inside the Teams application context instead of bouncing them out to external web pages.
- Access control: Always validate who clicked the button on the server side—never blindly trust client-side visibility configurations alone.
- State updates: Always post a refreshed card payload after an action is completed to prevent frustrating duplicate submissions by users.
- Mobile first: Rigorously test long text strings, ChoiceSet rendering behavior, and button wrapping characteristics on actual mobile phones.
- Versioning: Pin your schema version explicitly inside your templates to avoid unexpected host regressions during Microsoft updates.
Rollout Checklist (30–60 minutes)
- Pick a single repetitive message type within your organization that could benefit from collecting input (such as a feedback request, an event RSVP, or a support ticket triage).
- Build out the initial card layout within the online Designer; make sure to add a clean Input element alongside an Action.Submit trigger.
- Wire that action directly into a Power Automate HTTP flow to log responses cleanly into SharePoint or Dataverse.
- Incorporate conditional visibility rules to surface role-specific administrative actions only to authorized individuals.
- Pilot the new workflow within a small, focused Team; iterate on your copywriting and layout based on feedback; and then templatize it for wider organizational rollout.
FAQ
- Can cards update after submission? Yes, absolutely. You can post a complete replacement card activity or utilize native bot responses to update the UI inline.
- Do I need a bot to collect input? No, you do not. A standard Power Automate HTTP trigger works wonderfully for simple data collection, though bots add much richer conversational branching.
- How do I limit who can approve? Always validate Microsoft Entra ID group membership or security roles server-side before processing any incoming
Action.*payloads. - Can I localize text? Yes, you can dynamically bind text directly from your incoming payload or generate locale-specific JSON templates on the fly.
By shifting your perspective away from passive communication and toward active, functional design, you can fundamentally change how your organization experiences Microsoft Teams. No more jumping through hoops, no more lost feedback, and no more ignored notifications. Take these patterns, drop them into your environment, and start building experiences that truly engage your workforce today. For a complete auditory walkthrough of these concepts, expert tips, and further architectural discussions, be sure to check out the related podcast episode over at Build Interactive Microsoft Teams Adaptive Cards. Happy building!