Conversation with an operator
What the conversation looks like in the widget: the operator’s name, the “read” mark, reactions, buttons, system messages, closing a conversation by the visitor and rating it after it’s closed.
How the conversation view works
At the top there’s a heading: “Welcome!” (or the Welcome message from the Welcome section) and a line about the response time. Below it is the message feed, and at the bottom the input field.
What appears in the feed:
- The visitor’s messages: on the right, in the accent color.
- The operator’s messages: on the left, with an avatar (the operator’s photo or, failing that, the project logo or a letter) and a caption with their name.
- Notices about conversation events: an operator took the conversation, transferred it, snoozed it, resumed it, reopened it or closed it. They arrive as bot messages (on the left, marked BOT) and stay in the history after a page reload.
- Buttons under some automatic messages, for example in the reminder before an auto-close.
Operator name
| Field | Type | Default | Description |
|---|---|---|---|
| conversation.show_operator_name | boolean | true | Widget BuilderConversationShow operator name. When it’s off, the operator’s messages are captioned with the Project name from the Brand section (or “Team”) instead of their name, and the assignment and closing messages have no name. The operator’s photo is still shown. Telegram, VK and other bots have the same toggle in the bot builder. |
The “read” mark
SettingsWidget BuilderPrivacy, the Show 'operator seen' indicator to visitor toggle (conversation.privacy.operator_seen_enabled, on by default). When the operator opens the conversation in the dashboard, a “✓✓” read mark appears under the visitor’s messages: under the latest one and all earlier ones. It means “the operator opened the conversation”, not “the operator read every word”.
Reactions
A 350 ms long-press (on touch screens) or a 600 ms hover on an operator’s message opens a panel of 4 emoji. A tap adds the reaction, and a counter appears under the message. Only operator messages can get reactions. The builder has no separate reactions toggle: they’re always on.
❤️,🔥,👍,🎉. The default is ❤️ 👍 👎 🎉. More on the Brand page.| Field | Type | Default | Description |
|---|---|---|---|
| brand.emoji_pack_id | string | — | Your own emoji set, separated by commas: ❤️,🔥,👍,🎉. The default is ❤️ 👍 👎 🎉. More on the Brand page. |
The reaction is saved in SupportHub (POST /api/webhooks/widget/{ws}/messages/{id}/react), but the operators’ dashboard doesn’t show visitor reactions at the moment.
Buttons under messages
Some automatic messages come with buttons, for example the reminder before an auto-close. Operators don’t attach buttons of their own to replies. A button is one of three kinds:
urlanddeeplink: open the link in a new tab;callback: sends the press to SupportHub:POST /api/webhooks/widget/{ws}/messages/{id}/inline-callbackwith{target}. An internal note with the button’s target appears in the conversation, and an operator who has that conversation open gets a pop-up notification, “Visitor tapped: target”.
The buttons are only visible while the conversation is open: after a page reload, they’re no longer under the message.
| Field | Type | Default | Description |
|---|---|---|---|
| conversation.inline_keyboard_enabled | boolean | true | Widget BuilderReply KeyboardsEnable inline keyboards. When it’s off, the messages themselves stay, but no buttons are shown under them. |
System messages
The texts are set in SettingsWidget BuilderSystem Messages, separately for Russian and English. For messages with a toggle, turning it off hides the message entirely.
Each operator action (taking, transferring, snoozing, resuming, reopening, closing) puts exactly one notice in the conversation. The server writes and stores it, in the language the visitor’s widget is shown in, so after a page reload the history has the same line. The ticket-created confirmation appears right after the visitor’s first message.
{number} is the first 8 characters of the ticket number, {queue_position} the place in the queue. An empty field means no confirmation.{operator} is the operator’s name. Being assigned by replying first sends no separate notice.{department} is the department name.{time} is the wake-up date and time in the project’s time zone (Settings → Work Hours), marked with the zone, e.g. “25.09.2026 10:00:00 MSK”. If the conversation is snoozed until the customer replies and the text has {time}, a general text with no time goes out instead.{operator} is the name of the operator who closed it; delete the variable to hide it.| Field | Type | Default | Description |
|---|---|---|---|
| ticket_confirmation_text | string | "Ticket created" | Ticket created confirmation: the reply to the first message of a new conversation. The widget shows it right away, and it stays in the history as a bot message. {number} is the first 8 characters of the ticket number, {queue_position} the place in the queue. An empty field means no confirmation. |
| assigned | { enabled, text } | "{operator} is with you" | Operator assigned: when an operator takes the conversation or it’s assigned to them. {operator} is the operator’s name. Being assigned by replying first sends no separate notice. |
| department_transfer | { enabled, text } | "Handing over to {department}" | Department transfer. {department} is the department name. |
| operator_transfer_text | string | "Handing over to another operator" | Operator-to-operator transfer message. |
| snoozed | { enabled, text } | "Snoozed until {time}" | Ticket snoozed. {time} is the wake-up date and time in the project’s time zone (Settings → Work Hours), marked with the zone, e.g. “25.09.2026 10:00:00 MSK”. If the conversation is snoozed until the customer replies and the text has {time}, a general text with no time goes out instead. |
| resumed | { enabled, text } | "Picking your question back up" | Conversation resumed: a snoozed conversation is back in progress. |
| reopened | { enabled, text } | "Ticket reopened" | Ticket reopened: a closed conversation was opened again. |
| ticket_closed | { enabled, text } | "🔒 Conversation closed by {operator}" | Ticket closed: the server sends it as a regular message when an operator closes the conversation. {operator} is the name of the operator who closed it; delete the variable to hide it. |
| blocked_reply | { enabled, text } | { false, null } | Reply to blocked visitors. A blocked visitor gets this text in the chat at most once every 24 hours, whichever conversation they write in; no ticket is created. Off by default. |
The “Close ticket” button
In an existing conversation, a button between the messages and the input field carries the text from Widget BuilderHours & Avail.'Close ticket' button text (“Close ticket” by default; an empty field means no button). Pressing it asks “Close this conversation?”; after “Yes, close”, the widget sends POST /api/webhooks/widget/{ws}/ticket/{tid}/resolve (the conversation gets the resolved status) and takes the visitor back to the start of the tab. If the request fails, “Could not close. Please try again.” appears for 4 seconds.
When an operator closes the conversation
If the conversation is open, the input field is hidden and the “Continue” and “Open a new conversation” buttons appear instead. The feed gets the Ticket closed message (unless it’s turned off in the builder).
Rating the conversation
If Widget BuilderConversationCSAT rating prompt is on (it’s off by default), a rating card appears in the feed after the conversation is closed, whether by an operator, by the visitor or by auto-close: the Rating prompt text (“How did we do?” by default) and five stars. Once the visitor picks the stars, an optional comment field and a Submit button appear. The widget sends POST /api/webhooks/widget/{ws}/rate, and the card changes to “Thanks for your feedback!”. If sending fails, the card stays and the visitor can try again.
Until the conversation is rated, the card shows again every time the visitor opens that closed conversation. Where operators see the rating is covered in Rating system.
Other
Auto-scroll to the bottom
When the visitor sends a message, the widget always scrolls to the bottom. When an incoming message arrives, it scrolls down only if the visitor was already at the bottom. If they’re reading older messages, the view doesn’t jump; on a computer, a round arrow button to the latest messages appears instead.
Photo viewer
Clicking a photo in the conversation opens it full screen. Zoom with the buttons, the +/-/0 keys, Ctrl + mouse wheel, a pinch or a double click; drag to pan. Close it with Esc, a click on the background or the × button. Videos play right in the feed.

