When you build a custom agent in Copilot Studio, you may find that it fails to send an Adaptive Card to a user in Microsoft Teams or another channel. The agent either returns a plain text fallback or shows an error that the card could not be delivered. This problem usually occurs because the Adaptive Card JSON does not meet the schema requirements enforced by the target channel, or because the agent’s topic does not have the correct action configured. This article explains the technical cause of the failure and provides a step-by-step fix to make your agent send Adaptive Cards reliably.
Key Takeaways: Fixing Adaptive Card Delivery in Copilot Studio
- Copilot Studio > Topics > Add node > Send a message > Card type > Adaptive Card: The correct node path to attach an Adaptive Card to a topic response.
- Adaptive Card JSON schema validation: The root cause of most delivery failures — missing $schema or version fields or unsupported element types.
- Channel-specific card size limit of 28 KB: Cards exceeding this limit will be rejected by Teams and other channels without an explicit error in Copilot Studio.
Why Copilot Studio Agents Fail to Send Adaptive Cards
Copilot Studio generates responses through topics that contain a sequence of nodes. When you want to send an Adaptive Card, you must use the Send a message node and set its card type to Adaptive Card. The agent then serializes the JSON payload and passes it to the target channel, such as Microsoft Teams, Microsoft 365 Chat, or a custom connector. The channel validates the card JSON against the Adaptive Card schema version it supports.
The most common failure point is invalid JSON. A missing comma, an extra bracket, or an incorrect property name will cause the channel to reject the card. The agent may then fall back to a plain text message that says something like “I encountered an error sending the card.” A second common cause is exceeding the channel’s size limit. Teams, for example, limits Adaptive Cards to 28 KB of serialized JSON. A card with many columns, images, or action buttons can easily exceed this limit without triggering a clear error in Copilot Studio.
A third cause is using an unsupported element. The Adaptive Card schema evolves through versions 1.0, 1.1, 1.2, and 1.3. Teams currently supports up to version 1.3, but some elements such as ToggleVisibility or Action.ToggleVisibility require version 1.2 or later. If your card uses an element that the channel does not support, the entire card is rejected. Finally, the agent must have the correct action node configured. If you use a Send a message node but do not explicitly set the card type, the agent will send plain text instead of the card.
Steps to Fix an Adaptive Card That Is Not Sent
- Open the topic that contains the card
In Copilot Studio, go to Topics and select the topic where the card is defined. Expand the node tree to find the Send a message node that should contain the card. - Verify the card type is set to Adaptive Card
Click the Send a message node. In the properties panel, locate the Card type dropdown. If it shows None or Text, change it to Adaptive Card. If the dropdown is missing, your node may be an older version. Delete the node and add a new Send a message node from the node palette. - Paste a validated Adaptive Card JSON skeleton
Open the JSON editor inside the node. Replace the existing JSON with a minimal valid skeleton:{"type":"AdaptiveCard","$schema":"http://adaptivecards.io/schemas/adaptive-card.json","version":"1.3","body":[{"type":"TextBlock","text":"Hello world","wrap":true}]}
Test the agent. If the card appears in Teams, the problem is in your original JSON. - Validate your card JSON externally
Copy the JSON from the node. Go to the Adaptive Cards Designer at adaptivecards.io/designer. Paste the JSON into the left pane. The designer will show a red error badge if the JSON is invalid. Fix any errors shown in the schema validation panel. - Check the card size
After validation, copy the JSON into a text editor and save it as a .json file. Check the file size in your operating system. If it exceeds 28 KB, reduce the card by removing columns, images, or action buttons. Use smaller images by compressing them before embedding as data URIs, or host images on a CDN and reference them by URL. - Remove unsupported elements for Teams
Teams supports Adaptive Card version 1.3. Remove elements that require version 1.4 or later, such as Action.Execute. Replace Action.Execute with Action.Submit. Remove any custom styles that are not part of the standard schema. - Publish the agent and test in the target channel
After making changes, click Publish in Copilot Studio. Open the target channel (for example, Microsoft Teams). Start a conversation with your agent and trigger the topic. If the card still fails, open the debug panel in Copilot Studio by clicking the Debug button. Look for error messages in the Output pane. The error often contains the exact JSON path that failed.
Alternative Method: Use a Power Automate Flow to Generate the Card
If the card JSON is complex and you cannot reduce its size, create a Power Automate flow that generates the Adaptive Card and sends it to Teams. From Copilot Studio, call the flow using the Call an action node. This method offloads card generation to a service that has more robust error handling and logging.
If the Adaptive Card Still Has Issues After the Main Fix
Copilot Studio Agent Sends Card Only as Plain Text
This indicates the channel received the card but could not render it. The most common cause is a missing or incorrect ContentType header. In Copilot Studio, ensure the Send a message node’s Content type is set to application/vnd.microsoft.card.adaptive. If the node does not expose this option, add a new node and manually set the content type in the advanced properties.
Card Appears in Copilot Studio Test Panel but Not in Teams
The test panel in Copilot Studio uses a different rendering engine than Teams. A card may render correctly in the test panel but fail in Teams because of Teams-specific restrictions. For example, Teams does not support the Action.OpenUrl target style that opens a URL in a new window. Use Action.OpenUrl with the default style. Also, Teams limits the number of actions to six per card. Reduce the action count if it exceeds six.
Agent Returns a Generic Error Instead of the Card
A generic error often means the card JSON caused a server-side exception. Open the Copilot Studio debug pane and look for a line that says “AdaptiveCardRenderException” or “CardRenderException.” The error message usually contains the index of the problematic element. For example, “body[3].columns[1].items[0]” points to the first item in the second column of the fourth body element. Edit that element in the JSON editor and remove or fix the property that caused the exception.
Card Sends but Shows a Blank White Box in Teams
A blank card means the JSON is valid but the card has no visible body elements. Ensure the body array contains at least one element such as TextBlock, Image, or ColumnSet. Also check that the element’s text property is not empty and that the element’s wrap property is set to true for text blocks.
Copilot Studio vs Power Automate for Adaptive Card Delivery
| Item | Copilot Studio Send a Message Node | Power Automate Flow |
|---|---|---|
| Card generation | Inline JSON in the node | JSON built by flow actions or expressions |
| Schema validation | Manual — you must test externally | Automatic — flow fails with a clear error message |
| Size limit handling | No built-in size check | You can add a condition to check JSON length |
| Error logging | Debug pane in Copilot Studio | Flow run history with detailed step output |
| Channel support | Teams, Microsoft 365 Chat, custom connector | Teams, Outlook, webhook, and 300+ connectors |
You can now identify and fix the three main causes of Adaptive Card failure in Copilot Studio: invalid JSON, oversized payload, and unsupported schema elements. Use the external validator at adaptivecards.io/designer before pasting any card into a topic. For complex cards that require dynamic data, switch to a Power Automate flow to gain better error handling and logging. A final advanced tip: set the version property in your card JSON to 1.3 to match Teams’ maximum supported version, and always test in the actual Teams client rather than relying solely on the Copilot Studio test panel.