๐ด Module 08: Enhance with Adaptive Cards โ
Codename: OPERATION SHOWCASE
Time: 40 minutes
Scenario: Present a Logged Ticket as a Rich Card
๐ฏ Learning Objectives โ
By the end of this module, you will be able to:
- Explain what Adaptive Cards are and when to use them
- Design an Adaptive Card with the JSON schema
- Have Bit present a logged ticket as a rich card instead of plain text
- Bind live values (ticket number, priority, etc.) into the card
- Test the card in the Preview pane
๐งญ Overview โ
In Module 07, when Bit logs a ticket he confirms it as plain text. That works, but a rich card is clearer and more professional โ especially once Bit is published to Microsoft Teams.
In this module you'll give Bit an Adaptive Card so that, after smart-triage logs a ticket, he presents a tidy confirmation card: ticket number, summary, category, priority, status, requestor โ and a button to open the ticket in SharePoint.
๐งญ Where this fits Bit's story. This module makes an existing capability (the ticket from Module 07) look better. If you'd rather practice on the software flow, the same technique applies to a software-request card โ see the alternative at the end.
๐งฐ Prerequisites โ
- Bit with the
smart-triageskill and the Create item / Send email tools from Module 07.
๐ซ In the facilitated workshop, you'll already have logged a ticket in Module 07. If you're at the office, complete Module 07 first.
๐งฉ What Are Adaptive Cards? โ
Adaptive Cards are a platform-agnostic schema for UI cards. Originally developed by Microsoft, they're now an open standard supported across Microsoft Teams, Outlook, Copilot Studio agents, Windows notifications, and more.
Why Use Adaptive Cards? โ
| Plain Text | Adaptive Card |
|---|---|
| Simple, fast | Rich, visual, branded |
| Limited formatting | Full control over layout and buttons |
| Plain data dump | Structured, scannable |
| No interactivity | Buttons, input fields, actions |
Example use cases:
- Ticket confirmation (this module) โ number, priority, status, and a link
- Approval requests โ request details + Approve/Reject buttons
- Order confirmation โ summary, total, tracking link
- Survey / feedback โ inline rating or comment form

๐ How Adaptive Cards Work for Bit โ
Classic Copilot Studio put an Adaptive Card node inside a topic. Bit is a generative agent built from skills, so the approach is simpler โ and it's the method this module uses:
- Give Bit the card as its own skill (
adaptive-card). The card JSON lives inside the skill, with one firm rule: render the card, never show the JSON. - Tell the skill that logs the ticket (
smart-triage) to present its result as that card.
Bit's orchestrator does the rest โ it renders the card and fills the ${โฆ} placeholders from the ticket smart-triage just created. No topic, no node; it fits how Bit already works.
The transferable ideas are unchanged: design the card JSON, and decide which values bind into it.
๐งช Lab 8.1: Design the Ticket Confirmation Card โ
Objective: Author the Adaptive Card JSON for a logged ticket.
Adaptive Cards are defined with JSON. Here's the ticket confirmation card โ a header, the summary, a FactSet of ticket details, and an open-in-SharePoint button:
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{
"type": "TextBlock",
"text": "๐ซ Ticket logged",
"weight": "Bolder",
"size": "Large"
},
{
"type": "TextBlock",
"text": "${title}",
"wrap": true,
"spacing": "None",
"isSubtle": true
},
{
"type": "FactSet",
"facts": [
{ "title": "Ticket #", "value": "${ticketNumber}" },
{ "title": "Category", "value": "${category}" },
{ "title": "Priority", "value": "${priority}" },
{ "title": "Status", "value": "${status}" },
{ "title": "Requestor", "value": "${requestor}" }
]
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "View in SharePoint",
"url": "${ticketUrl}"
}
]
}What this card includes:
- A header and the ticket summary (
${title}) - A FactSet โ ticket number, category, priority, status, requestor
- An Action.OpenUrl button to view the item in SharePoint
Data binding: the ${...} placeholders are filled at runtime with the values from the ticket smart-triage just created.
๐ก Tip: Validate any card JSON in the Adaptive Cards Designer โ paste it, add sample data, and preview before wiring it into Bit.
โ Checkpoint: You have a valid ticket confirmation card.
๐งช Lab 8.2: Give Bit the Card as a Skill, Then Have smart-triage Use It โ
Objective: Add the card to Bit as its own skill, then tell smart-triage to present the logged ticket as that card. This is the exact method shown in this module's screenshots.
Step 1 โ Create the adaptive-card skill โ
In Bit, open Skills โ + Add a skill โ Create from blank (the same place you built your skills in Module 07).
Set it up exactly like this โ the name, description, the render-don't-show rule, and the card JSON inside the skill:
markdown--- name: adaptive-card description: This is what the adaptive card should look like. Replace the blanks with dynamic values. --- # Instructions Never show the JSON โ just render it in the conversation with the dynamic values: { "type": "AdaptiveCard", "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.5", "body": [ { "type": "TextBlock", "text": "๐ซ Ticket logged", "weight": "Bolder", "size": "Large" }, { "type": "TextBlock", "text": "${title}", "wrap": true, "spacing": "None", "isSubtle": true }, { "type": "FactSet", "facts": [ { "title": "Ticket #", "value": "${ticketNumber}" }, { "title": "Category", "value": "${category}" }, { "title": "Priority", "value": "${priority}" }, { "title": "Status", "value": "${status}" }, { "title": "Requestor", "value": "${requestor}" } ] } ], "actions": [ { "type": "Action.OpenUrl", "title": "View in SharePoint", "url": "${ticketUrl}" } ] }Save the skill.
๐ฅ Prefer to upload? Grab the ready-made file and use Upload a skill instead: adaptive-card.md.
Step 2 โ Tell smart-triage to present the card โ
Open your smart-triage skill (from Module 07) and add this section โ keep everything the skill already does:
# Confirm with a card
After creating the ticket, present the confirmation as the Ticket Confirmation
Adaptive Card, filling: ticketNumber, title, category, priority, status,
requestor, and ticketUrl (the SharePoint item link). Do not render the JSON,
just the card. Still send the confirmation email as before.Save the skill.
๐ก Why this works:
smart-triageproduces the ticket values; theadaptive-cardskill holds the layout. Bit's orchestrator connects the two โ it renders the card (not the raw JSON) and drops the live values into the${โฆ}placeholders. The line "Do not render the JSON, just the card" is what stops Bit from printing the JSON as text.
โ
Checkpoint: Bit has an adaptive-card skill, and smart-triage is told to confirm tickets with the card.
๐งช Lab 8.3: Test the Card โ
Preview โ new chat โ log a ticket (as in Module 07):
textMy laptop won't connect to any monitor and I've tried two cables. Please log a ticket.After
smart-triagecreates the row, Bit presents the ticket confirmation card โ number, category, priority, status, requestor, and the View in SharePoint button.
Verify:
- โ The fields show the real ticket values
- โ The button opens the SharePoint item
- โ The confirmation email still sends
โ Checkpoint: Bit confirms tickets with a rich, interactive card.
๐ Alternative: A Software-Request Card โ
The same technique fits the software flow. Instead of a ticket, present a software-request card from software-installation-request:
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.5",
"body": [
{ "type": "TextBlock", "text": "๐ฟ Software request", "weight": "Bolder", "size": "Large" },
{
"type": "FactSet",
"facts": [
{ "title": "Application", "value": "${application}" },
{ "title": "Distribution", "value": "${distribution}" },
{ "title": "Approval needed", "value": "${approvalNeeded}" }
]
}
]
}This is a great place to practice once you've automated approvals in Module 09 โ the card can show whether a request is self-service or awaiting manager sign-off.
๐ Advanced Adaptive Card Features โ
Input Fields โ
Collect data directly in the card:
{ "type": "Input.Text", "id": "note", "placeholder": "Add a note for the help desk" }Action.OpenUrl โ
Open a link when a button is clicked (used above for the SharePoint item).
Conditional Formatting โ
Show/hide elements based on data with $when:
{ "type": "TextBlock", "text": "โ ๏ธ Critical โ fully blocked", "$when": "${priority == 'Critical'}" }Accessibility โ
Always include altText for images and clear, descriptive button labels for screen readers.
๐ ๏ธ Troubleshooting Adaptive Cards โ
Issue 1: Card doesn't render (blank or error) โ
- JSON syntax โ validate in the Adaptive Cards Designer
- Schema version โ try
1.5(or lower if your channel doesn't support it) - Placeholder names โ make sure the skill fills the exact
${...}names used in the card
Issue 2: Fields are blank โ
- The skill didn't pass a value for that placeholder โ check the
smart-triageinstructions list every field - Test with the question you know produces a complete ticket
Issue 3: The button doesn't open the item โ
${ticketUrl}wasn't populated โ have the skill include the SharePoint item link when it creates the ticket
๐ง Key Takeaways โ
- Adaptive Cards provide rich, interactive UI for agent responses
- JSON-based โ defined with the Adaptive Card schema; validate in the designer
- New experience โ give Bit the card template and let a skill present its result as the card (no topic nodes)
- Data binding โ
${...}placeholders are filled from the skill's values - Platform-agnostic โ cards render in Teams, Outlook, and web
- Actions โ buttons can open URLs, submit data, or collect input
๐๏ธ What You've Built โ
Bit now confirms a logged ticket with a rich Adaptive Card โ number, category, priority, status, requestor, and a link to the SharePoint item โ instead of plain text.
โญ๏ธ Next Steps โ
In Module 09: Automate Approvals with Workflows, you'll handle the trickier case โ software that needs a manager's approval โ using the new Workflows designer, and call it from the software-installation-request skill.
Course Navigation: โ Module 07 | Course Index | Next: Module 09 โ