Conversations and Support Tickets
Once the AI chat widget is live, end-user interactions show up in two places in the dashboard: the Conversations tab and the Tickets tab. Both are scoped per Site.
Conversations
Navigate to AI Chat Widget → Conversations for the Site you want to inspect.
Filters
| Filter | What it does |
|---|---|
| Date range | Limit to sessions started or active within a window. |
| Has feedback | Only sessions where the end-user voted up or down on at least one assistant message. |
| Feedback kind | Up only / down only / either / neither. |
| Escalated | Only sessions where the end-user opened a support ticket via the downvote flow. |
Session detail
Clicking a conversation opens the session detail view:
- Left column: the message timeline. Each message bubble is labelled USER / ASSISTANT / SYSTEM, with status type (
ANALYZING,MATCHED_CONTENT, etc.). MATCHED_CONTENT and GENERATED_CONTENT bubbles link to the Flow / Tooltip in the library. - Right column: end-user identity card — anonymousId, externalId (if identified), traits, first-seen / last-seen timestamps.
- Actions: "Open ticket" jumps to the escalated SupportTicket (when present), "Export JSON" downloads the full conversation.
Support Tickets
Navigate to AI Chat Widget → Tickets.
A SupportTicket is created when an end-user downvotes an answer and chooses "Open a support ticket" from the follow-up choice. The ticket carries:
- Email entered by the user (or pre-filled from their identity traits)
- Subject + body
- The full conversation context (attached to the email body)
- A reference back to the originating ChatSession
Where the email goes
The recipient resolves in this order:
- If the widget has a Support email override set (in the Builder), that address is used.
- Otherwise, the tenant owner (the
tenantMemberrow withrole = OWNER) is the recipient. - If neither exists, no email is sent. The ticket is still persisted; the dashboard surfaces it in the Tickets tab.
The email's Reply-to header is set to the end-user's email, so hitting Reply in your inbox lands you in the requester's inbox.
Ticket status
Three states: OPEN → IN_PROGRESS → RESOLVED. Status is editable from the ticket detail page. The end-user is not notified of status changes by email (v1) — they should be told via the human reply you send.
Common operations
| Task | How |
|---|---|
| Reply to a ticket | Click Reply in your email client. The requester receives your message via the Reply-to header. |
| Mark a ticket resolved | Open the ticket detail, change Status to Resolved. Stamps resolvedAt + resolvedBy. |
| Reroute future tickets | Update the widget's Support email override in the Builder. |
| Reuse an AI-generated answer | Re-target the Flow in the library — remove the "No users" audience to make it auto-show. |
Troubleshooting
Tickets are persisting but no email arrives
Check the API server logs for [email] support_ticket_created warnings. The most common causes:
RESEND_API_KEY missing — payload logged only→ setRESEND_API_KEYin your environment and restart the API.no email recipient resolved — owner tenant member may be missing→ ensure at least onetenantMemberrow hasrole = OWNER, or set the widget's Support email override.- Resend send error → check the FROM-address verification in your Resend dashboard.
End-user can't open the chat
Open browser DevTools on the customer site. Look for the GET /api/v1/sdk/chat/config request. The response's reason field tells you the gate:
| Reason | Fix |
|---|---|
SITE_NOT_MAPPED | Complete mapping in Settings → Sites. |
FEATURE_LOCKED | Tenant isn't on Pro/Enterprise. Upgrade the plan. |
WIDGET_DISABLED | No widget row exists for this Site. Create one in the Builder. |
WIDGET_PAUSED | The widget is paused. Click Publish in the Builder. |