Skip to main content

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

FilterWhat it does
Date rangeLimit to sessions started or active within a window.
Has feedbackOnly sessions where the end-user voted up or down on at least one assistant message.
Feedback kindUp only / down only / either / neither.
EscalatedOnly 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:

  1. If the widget has a Support email override set (in the Builder), that address is used.
  2. Otherwise, the tenant owner (the tenantMember row with role = OWNER) is the recipient.
  3. 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: OPENIN_PROGRESSRESOLVED. 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

TaskHow
Reply to a ticketClick Reply in your email client. The requester receives your message via the Reply-to header.
Mark a ticket resolvedOpen the ticket detail, change Status to Resolved. Stamps resolvedAt + resolvedBy.
Reroute future ticketsUpdate the widget's Support email override in the Builder.
Reuse an AI-generated answerRe-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 → set RESEND_API_KEY in your environment and restart the API.
  • no email recipient resolved — owner tenant member may be missing → ensure at least one tenantMember row has role = 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:

ReasonFix
SITE_NOT_MAPPEDComplete mapping in Settings → Sites.
FEATURE_LOCKEDTenant isn't on Pro/Enterprise. Upgrade the plan.
WIDGET_DISABLEDNo widget row exists for this Site. Create one in the Builder.
WIDGET_PAUSEDThe widget is paused. Click Publish in the Builder.