Conversation
Widget / Conversation

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

conversation.show_operator_name
Type: booleanDefault: 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.

brand.emoji_pack_id
Type: stringDefault: —
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:

  • url and deeplink: open the link in a new tab;
  • callback: sends the press to SupportHub: POST /api/webhooks/widget/{ws}/messages/{id}/inline-callback with {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.

conversation.inline_keyboard_enabled
Type: booleanDefault: 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.

ticket_confirmation_text
Type: stringDefault: "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
Type: { enabled, text }Default: "{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
Type: { enabled, text }Default: "Handing over to {department}"
Department transfer. {department} is the department name.
operator_transfer_text
Type: stringDefault: "Handing over to another operator"
Operator-to-operator transfer message.
snoozed
Type: { enabled, text }Default: "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
Type: { enabled, text }Default: "Picking your question back up"
Conversation resumed: a snoozed conversation is back in progress.
reopened
Type: { enabled, text }Default: "Ticket reopened"
Ticket reopened: a closed conversation was opened again.
ticket_closed
Type: { enabled, text }Default: "🔒 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
Type: { enabled, text }Default: { 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.

Was this page helpful?