> ## Documentation Index
> Fetch the complete documentation index at: https://docs.custral.com/llms.txt
> Use this file to discover all available pages before exploring further.

# widget.conversation.started

> A website visitor started a new chat in the widget.

Fires when a visitor starts a new chat from the widget on your website.

## Payload

```json theme={null}
{
  "id": "whd_2Hb6tK9mR",
  "event": "widget.conversation.started",
  "createdAt": "2026-09-11T13:05:19.643Z",
  "data": {
    "conversationId": "conv_7Yn2kP",
    "visitorId": "wv_5Hc2pR",
    "channelId": "chan_9Tb3wL",
    "title": "Chat with Ada Lovell",
    "status": "open"
  }
}
```

<ResponseField name="conversationId" type="string" required>
  The new conversation. Always present.
</ResponseField>

<ResponseField name="visitorId" type="string">
  The visitor who started the chat.
</ResponseField>

<ResponseField name="channelId" type="string">
  The widget channel the chat came in on. A workspace with more than one widget
  tells them apart with this.
</ResponseField>

<ResponseField name="title" type="string">
  The conversation's title when it was created. Usually `Chat with` and the
  visitor's name when they had given one, and `Widget Chat` otherwise.
</ResponseField>

<ResponseField name="status" type="string">
  Always `open`.
</ResponseField>

## Worth knowing

* **Messages arrive separately.** Each message the visitor sends is a
  [`widget.keyword.matched`](/dev/webhooks/events/widget-keyword-matched)
  delivery of its own, and this payload carries no message text.
* **Routing comes after.** When routing gives the chat to a teammate,
  [`conversation.assigned`](/dev/webhooks/events/conversation-assigned) follows.
  With the answer bot on, that waits until the bot hands the chat to a person,
  and a chat offered to several people sends it only once somebody takes it.
* **The title is a snapshot.** Renaming the conversation later sends no event.

## Example

```ts theme={null}
custral.on("widget.conversation.started", async (event) => {
  const {conversationId, title} = event.data;

  await chatOps.post({
    channel: "#website-chats",
    text: `New website chat: ${title ?? "Widget Chat"}`,
    conversationId,
  });
});
```


## Related topics

- [Widget](/dev/webhooks/events/widget.md)
- [widget.visitor.identified](/dev/webhooks/events/widget-visitor-identified.md)
- [Webhooks](/dev/webhooks/overview.md)
- [Event catalog](/dev/webhooks/events/overview.md)
- [Conversation Widget](/blocks/widgets/conversation.md)
