Rich replies: tables, cards and quick replies in the chat
Let the agent answer with a table to compare options, a row of cards to choose from, or quick-reply buttons for the next step, alongside its text. Learn when it uses them, the limits, how they look in the widget and where else they appear.
With Rich replies on, the agent can show structured content inside the chat, under its text:
- a table, to compare several things on the same points, such as plans, products or opening hours;
- cards, a row of options to choose from, each with a title and optionally a picture, a price and buttons;
- quick replies, short buttons for clear next steps. Tapping one sends its text as the visitor's message.
The agent always writes a text reply as well. Rich replies sit under it, like product cards and booking times.
Turn it on or off
Open your agent, select the Appearance tab and find the Rich replies switch, next to Suggest follow-up questions and Show sources under replies. It's on by default for every agent. Click Save changes to apply a change.
The Playground uses the switch as it is on screen, so you can try it before you save.
Turning it off stops new rich replies. Replies that already showed one keep it in the conversation.
When the agent uses them
The agent decides for each reply. It is told to use rich replies only when they help:
| Situation | What it shows |
|---|---|
| A comparison of several items on the same points | A table |
| Several options the visitor can choose between | Cards |
| Clear next steps the visitor would pick from | Quick replies |
It is told not to use them for a single fact, a yes or no, small talk or a reply that is one short paragraph, and to fill them only with facts from your knowledge, the conversation or the results of your actions, never invented products, prices, links or pictures. Like any AI answer, check important replies in the Playground, and use your instructions to steer it, for example "Show our plans as a table when someone asks about prices."
A rich reply is part of the same reply, so it doesn't use an extra message, and turning the switch on doesn't change how the reply streams. The rich reply appears once the text is complete. A visitor who taps a quick reply or a card's reply button sends a message, which counts like a typed one.
Limits and safety rules
A reply shows at most one table, one row of cards and one set of quick replies.
| Kind | Limits |
|---|---|
| Table | 1 to 8 columns and 1 to 20 rows. Each cell is plain text of up to 200 characters, column headers up to 60, an optional caption up to 100. Every row has one cell per column. |
| Cards | 1 to 10 cards. Each has a title of up to 80 characters and, optionally, a subtitle of up to 200, a picture, a price written as text of up to 40 (such as "CHF 49" or "from $9/month") and up to 2 buttons. A button either opens a link or sends a reply of up to 120 characters as the visitor's message. Button labels are up to 40 characters. |
| Quick replies | 1 to 6 buttons of up to 40 characters each. Repeats are shown once. |
intoCHAT checks every rich reply before it's shown:
- Everything is plain text. HTML is refused, and Markdown marks such as
**are removed. - Links and pictures must be full
https://addresses.http://,javascript:anddata:links, addresses with a user name or password, and addresses without a domain such aslocalhostare refused. - Quick replies and reply buttons can't contain a link, since their text is sent as the visitor's message.
A table, a row of cards or a set of quick replies that breaks a rule isn't shown at all, never shown in part. The text reply and any other valid rich reply still appear. When your agent also has actions, chat forms or other tools, it's told what was wrong and may fix it in the same reply.
How it looks in the widget
- Rich replies appear under the agent's message, lined up with it, in your widget's light or dark theme. Link and reply buttons on cards use your Launcher bubble color.
- A table scrolls sideways on a narrow screen. Several cards form a row that scrolls sideways, with arrows for mouse users. A single card is shown wide.
- Quick replies show only under the latest reply and disappear once the visitor sends a message. While quick replies are shown, follow-up questions aren't, so the two don't compete.
- Card links open in a new tab. With Keep campaign tags on links on (see Appearance), they carry your campaign tags like other links in replies.
- Everything works with the keyboard: buttons and links can be reached with Tab, and the table and the row of cards can be focused and scrolled with the arrow keys. Screen readers announce the table's caption, the number of cards and the group of quick replies.
The widget's own labels, such as "More", "Previous", "Quick replies" and the note that a link opens in a new tab, follow the widget language. The text inside a rich reply is written by the agent, in the language of its reply.
Where else rich replies appear
| Place | What you see |
|---|---|
| Conversations tab and the Playground | The rich reply as the visitor saw it. On the Conversations tab its buttons don't send anything. |
| Live chat inbox, hand-off email, helpdesk tickets and the CSV export | A text version: a table as lines of cells separated by |, cards as • Title — subtitle — price with their links, quick replies as [Yes] [No]. |
| Slack and email conversations | Not offered: the agent writes plain text there. |
| REST API and MCP server | A ui field, described below. |
In the API
Send a message (without streaming) and Get a conversation add a ui field to an agent reply that showed a rich reply. A reply without one has no ui field. The MCP tools chat_with_agent and get_conversation return the same. content and reply stay plain text without the rich reply.
{
"id": "MESSAGE_ID",
"role": "assistant",
"content": "Here are our two plans.",
"createdAt": "2026-10-27T10:00:00.000Z",
"authorName": null,
"sources": [],
"ui": [
{
"type": "table",
"title": "Plans",
"columns": ["Plan", "Price", "Seats"],
"rows": [["Basic", "CHF 9", "1"], ["Pro", "CHF 29", "5"]]
},
{
"type": "cards",
"cards": [
{
"title": "Pro",
"subtitle": "For growing teams",
"image": "https://www.example.com/pro.png",
"price": "CHF 29 / month",
"buttons": [
{ "label": "See details", "url": "https://www.example.com/pricing" },
{ "label": "Start a trial", "reply": "I'd like to start a Pro trial" }
]
}
]
},
{ "type": "quick_replies", "replies": ["Compare features", "Talk to sales"] }
]
}
Each item has a type: table (with columns, rows and an optional title), cards (each card with title, optional subtitle, image and price, and buttons with a label and either a url or a reply) or quick_replies (with replies). Optional fields are left out when empty.
Next steps
- Customize the widget's appearance
- Connect your store for product cards from live searches
- Write instructions that tell the agent when to compare in a table