Skip to main content
Start from Send a first message. This page covers listing conversations, resuming them, paging history, reconnect, and retry. useWebChat has no list helper. Use novu.webChat.listConversations to build a conversation sidebar or history screen.

List

Call novu.loadWebChat(), then novu.webChat.listConversations on the client from useNovu. useWebChat loads Web Chat for the chat UI only. Each row is a WebChatConversation with these fields: identifier, title, status, agentIdentifier, lastActivityAt, and createdAt.
data.conversations is the page. Use data.next and data.previous with after and before to page older lists. When a row is selected, pass item.identifier as conversationId and item.agentIdentifier as agentId on useWebChat. Match the agent to the conversation.

Start or resume

Pass conversationId so the hook loads history on mount.
Store the conversationId that sendMessage returns, or the conversationId field on the hook result. On the next visit, pass that id back in, or pick a row from List. To start another chat, remount the component without conversationId, or clear the prop. agentId selects the agent. If the identifier changes, remount with the new agentId. Omit conversationId unless that conversation belongs to the new agent. A conversation id from a different agent does not resume.

Older messages

If pagination.hasMore is true, call pagination.fetchMore() to load an older page.
Overlapping fetchMore calls do not run.

Reconnect

The hook reconnects and applies missed events on its own. Show a banner from these fields.
catchUpError is separate from send and fetch error. conversationStatus does not become an error state when recovery fails.

Retry

If message.status is failed, call retryMessage with that message id. Retry reuses the original idempotency key. It does not create a second message with the same text.

Resolved

conversationStatus on useWebChat is active or resolved. Do not use it to disable the composer. The agent marks a conversation resolved with ctx.resolve(). conversationStatus becomes resolved. When the subscriber sends the next message, the conversation reopens and conversationStatus becomes active again. Use conversationStatus for badges or labels in your UI. Keep the composer enabled unless isRunning or isLoading is true. Inspect resolved conversations in the Novu dashboard.