> For the complete documentation index, see [llms.txt](https://docs.flowcp.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.flowcp.ai/guides/read-chat-conversations.md).

# Read chat conversations

**Distribute → Chat conversations** is where you read the transcripts your [chat widgets](/guides/embed-ai-chat-widget.md) have retained. It's the team-facing side of the same records a visitor sees in the widget's own **History** list.

The entry only appears in the sidebar once a widget on the app retains anything, so there is never a dead link to an empty page.

> **Conversation history is a paid feature** — it needs the **Team** plan or above, and the plan sets how long transcripts are kept (Team 30 days, Business 60, Enterprise 180). Chatting is on every plan, including **Starter**; only *keeping* the conversation is paid. Without it this page shows an upgrade card instead of the reader. See [Plans & features](/reference/plans-and-features.md).

## Turn retention on first

Transcripts are **off by default** — a chat turn is stateless and nothing is stored. To start keeping them, open **Distribute → Chat widget**, switch on **Retain transcripts** on the widget, set **Keep conversations for (days)** — up to your plan's ceiling, default 30 — and save. **Chat conversations** appears in the sidebar as soon as you do. The toggle is locked on plans without conversation history.

Turning retention back off stops recording new turns but keeps what was already stored until it ages out or you delete it.

Downgrading to a plan without conversation history stops the recording immediately: visitors get fresh threads, their **History** list comes back empty, and this page is replaced by the upgrade card. That card still offers **Delete retained transcripts**, so you can erase what was stored while the workspace was paid.

## Read a conversation

The page targets the branch selected in the header, the same as the widget page. Switch branches there to read another branch's threads.

If several widgets on the branch retain transcripts, pick one from the **Widget** dropdown. With only one, it is shown straight away.

Threads are listed newest first. Each row shows:

* when the thread was **last active** and how many **messages** it has;
* whether it was **anonymous** or from a signed-in **visitor** — a short, non-reversible id you can correlate across threads, not the person's identity;
* a **context** badge when the host page attached [page context](/guides/embed-ai-chat-widget.md#ground-the-assistant-in-the-current-page);
* the **origin** that drove the chat, and a preview of the first question.

Click a row for the full transcript. Host instructions sent with `FlowCPChat.prompt()` are marked **Host instruction (not shown to the visitor)**, so you can tell what your app injected from what the person actually typed.

## Delete

**Delete** on an open transcript removes that one thread. **Delete all** removes every retained transcript for the selected widget. Neither can be undone, and neither interrupts anyone: a visitor mid-chat simply starts a new record on their next message.

## What is stored — and what isn't

A retained transcript is a **text-only projection**: the user's text, the assistant's text, the **names** of the tools the assistant called, how many attachments a message had, and the latest page context.

FlowCP never stores attachment contents, tool **arguments or results** (they can carry your API's records), the model's reasoning, or the end-user's token. The visitor's conversation handle and their token are stored only as SHA-256 hashes.

That's what makes this view safe to give a customer-success team: they can read what people asked without gaining access to the records behind the answers.

## Reacting to conversations elsewhere

The dashboard is for reading. If you want another system to *act* on chat activity — open a CRM ticket, ping a Slack channel, log a lead — add a [webhook](/guides/webhooks.md) and subscribe to `conversation.created` and `message.created`. Those events fire whether or not transcripts are retained, and carry message text only for webhooks that explicitly opt in.
