Widget Appearance & Channels
The SendSeven website widget — both the live-chat / support widget and the newsletter widget — is configured through a set of fields stored in the widget's config. You edit them in the widget editor (Settings → Widgets); if you manage widgets through the API, they are the keys inside the widget config object.
This guide is a reference for the appearance and layout options, the visitor-facing size control, the agent-type transparency indicator, the reactions toggle, how RCS appears as a widget channel, and the trust rules for data your page passes through SendSevenConfig.
For the widget's messaging capabilities (media support, buttons, handoff) see the Live Chat guide. For attaching a bot see Deploy a Bot to a Widget.
All of the fields below are optional and default to the widget's previous behavior. Existing embeds are unaffected — you do not need to change your embed snippet or re-save a widget to keep it working exactly as it does today. Adopt these options only when you want the new behavior.
Appearance & layout options
| Field | Type | Allowed values | Default | Effect |
|---|---|---|---|---|
bubbleLayout | string | classic, panel | classic | Container style. classic is the floating rounded panel anchored in the page corner (today's behavior). panel docks the widget as a sticky, full-height side panel. |
cardLayout | string | legacy, inline, hero, grid | legacy | How card content is rendered inside the widget. legacy is today's rendering; inline, hero, and grid are alternative card presentations. |
cornerRadius | number | 0–40 (px) | 12 | Border radius of the widget panel, in pixels. 0 gives square corners; higher values round them more. |
defaultSize | string | compact, tall, full | tall | The size the widget opens at on desktop. See Size presets below. |
showAgentType | boolean | true, false | true | Show the agent-type indicator in the widget header. See Agent-type indicator. |
allowReactions | boolean | true, false | true | Whether visitors can react to messages. See Message reactions & replies. |
launcher_icon | string | default, whatsapp, telegram, messenger, instagram, sms, email, message_circle, chat_dots, sparkles, help, headset, phone, life_buoy, hand_wave | null | Icon on the closed bubble (launcher) button. null or omitted shows the default icon. Note the snake_case key. |
Support widget layout
These keys shape the support widget's home screen, channel list and launcher. All are optional. A missing key or null keeps the previous look (shown as "When unset"). An empty string counts as null; any other value outside the list returns 422.
| Field | Type | Allowed values | When unset | Effect |
|---|---|---|---|---|
homeLayout | string | menu, composer | menu | menu opens on the channel list. composer opens on a message box first. |
channelButtonStyle | string | outline, filled, minimal, brand | outline | Style of the channel buttons. |
channelDisplayMode | string | full, icons-only, tiles | full | How the channel list is laid out. |
launcherMode | string | panel, speed_dial | panel | panel opens the widget. speed_dial fans the channel buttons out from the bubble. |
prechatMode | string | form, composer | form | Where the pre-chat details are asked: a separate form step, or fields inside the message box. |
desktopHandoff | boolean | true, false | false | On desktop, a click on a messenger channel shows a QR code and a web link instead of trying to open the app. See Desktop hand-off. |
aiThinkingDisplay | string | typing, status | status | How the widget shows that an AI agent or bot is working on a reply. typing shows plain typing dots only. status shows a bubble with changing status text and the sources being checked. |
Defaults for new support widgets. When you create a support widget and leave a key out, SendSeven fills it in: desktopHandoff is true and aiThinkingDisplay is typing; with live chat on, homeLayout and prechatMode are composer; with live chat off, channelButtonStyle is brand. A value you send, even null or false, always wins. Updates never add defaults, and newsletter widgets get none.
Desktop hand-off
With desktopHandoff on, every messenger channel in the widget's public settings carries a handoff object:
{
"channel_type": "whatsapp",
"identifier": "4915123456789",
"handoff": {
"link": "https://wa.me/4915123456789?text=Hi%2C%20I%20need%20help%21",
"web_link": "https://web.whatsapp.com/send?phone=4915123456789&text=Hi%2C%20I%20need%20help%21",
"qr": "data:image/png;base64,iVBORw0KGgo..."
}
}
| Field | Description |
|---|---|
link | The link a phone opens. The QR code contains this link. |
web_link | The messenger's separate web app, only for WhatsApp (WhatsApp Web). null for the other channels. |
qr | QR code for link as a PNG data URI. |
Each channel gets its own handoff, also several channels of the same type. Email, live chat and SMS sender names made of letters (they can't receive replies) never get one.
Online team
The live-chat status the widget checks lists up to five team members who are online and available for live chat, those with a profile picture first:
{
"available": true,
"online_agents": 3,
"estimated_wait_time": 30,
"within_schedule": true,
"next_open_at": null,
"agents": [
{ "name": "Anna", "avatar_url": "https://.../anna.png" },
{ "name": "Jonas", "avatar_url": null }
]
}
Only the first name (or live chat nickname) and the profile picture are shared, never email addresses, IDs or last names. agents is empty while live chat is unavailable. Members who are set to away or turned live chat off in their profile are not listed.
Size presets & the visitor resize control
defaultSize sets how large the widget opens on desktop:
| Preset | Approximate size | Notes |
|---|---|---|
compact | 340 × 480 px | A small, unobtrusive panel. |
tall | 380 px × ~70% of viewport height | The default — a comfortable reading height. |
full | 400 px × full viewport height | Maximum vertical space. |
The visitor can cycle between these sizes at any time using a resize control in the widget header. Their choice is remembered in the browser's localStorage and restored on their next visit, so a returning visitor sees the size they last chose rather than the configured default.
On mobile devices the widget always opens full-screen, regardless of defaultSize. The size presets and the resize control apply on desktop only.
Agent-type transparency indicator
When showAgentType is true (the default), the widget header tells the visitor who they are talking to:
- AI Agent — an AI assistant is answering.
- Automation — an automation/flow is handling the conversation.
- Human — a member of your team has taken over.
This is a transparency indicator: it makes automated conversation partners clearly identifiable to the visitor, in line with the transparency expectations of the EU AI Act. The label updates live — for example, when a bot escalates and a teammate takes over, the header switches from AI Agent to Human without a page reload.
Set showAgentType to false to hide the indicator.
Message reactions & replies
allowReactions controls the React button on individual messages inside the widget:
true(default) — visitors can add an emoji reaction to a message.false— the React button is hidden.
This toggle gates reactions only. Reply (replying to a specific message) is always available and is not affected by allowReactions.
Creating widgets from the preset gallery
New workspaces no longer start with an auto-created default widget. Instead, you create the widgets you need from a preset gallery in the widget editor — pick a starting preset (for example a support bubble or a newsletter signup) and customize it with the options above. Existing widgets are unchanged.
RCS as a widget channel
The widget can offer RCS (Rich Communication Services) as a channel, alongside WhatsApp, Telegram, Messenger, Instagram, Email and SMS. RCS is offered only when your workspace has an active RCS channel, and whether it appears for support, for newsletter opt-in, or both is driven by the RCS agent's declared use case.
For RCS as a full messaging channel (capabilities, sending, delivery model), see the RCS channel guide.
Why RCS is different from other channels
Every other messenger channel has a public click-to-chat URL — WhatsApp's wa.me, Telegram's t.me, Messenger's m.me. RCS has none. The officially supported website/QR entry point for an RCS business agent is an sms: deep link that carries the agent's messaging service id, which has the form {agent_id}@rbm.goog.
Tapping the link opens the visitor's default messaging app. On a device that is RCS-capable and whose carrier has your agent launched, it upgrades to a branded RCS conversation with your agent. Otherwise it opens plain SMS (when a fallback number is configured) or shows the messaging app's built-in error.
There are two deep-link formats:
| Format | Shape | When it is used |
|---|---|---|
| Service id only | sms:{service_id}?body={message} | No SMS fallback configured. On a non-RCS device this shows the messaging app's error. |
| With SMS fallback | sms:+{fallback}?service_id={service_id}&body={message} | A fallback number is configured. On a non-RCS device the message is sent as a plain SMS to that number. |
The @ in the service id must be percent-encoded in the URL so the phone's URI parser does not read it as an address separator.
Support widget: supportSignupOptions.rcs
On a support widget, RCS appears under supportSignupOptions.rcs. The sms: deep link is pre-built on the server (with a default "Hi, I need help!" message), because a support entry point has no per-visitor list choice:
{
"supportSignupOptions": {
"rcs": {
"direct_link": "sms:sendseven_x_agent%40rbm.goog?body=Hi%2C%20I%20need%20help%21",
"qr_code_base64": "data:image/png;base64,iVBORw0KGgo...",
"launched": true
}
}
}
| Field | Type | Description |
|---|---|---|
direct_link | string | The ready-to-use sms: deep link. |
qr_code_base64 | string | A QR code for the same link, as a base64-encoded PNG data URI — ideal for print or on-screen scanning. |
launched | boolean | Advisory only — see The launched flag. |
Newsletter widget: availableChannels.rcs
On a newsletter widget, RCS appears under availableChannels.rcs. Here the deep link is built on the client, because the opt-in message depends on which list(s) the visitor is subscribing to (the body is start {slug1}_{slug2}, exactly like the WhatsApp newsletter opt-in). The widget receives the pieces it needs to assemble the link:
{
"availableChannels": {
"rcs": {
"service_id": "[email protected]",
"fallback_number": null,
"launched": true
}
}
}
| Field | Type | Description |
|---|---|---|
service_id | string | The RCS agent's messaging service id ({agent_id}@rbm.goog). The widget uses it to build the sms: link client-side. |
fallback_number | string | null | An optional SMS-capable fallback number. When null, the widget emits the service-id-only format; when present, it emits the SMS-fallback format so non-RCS devices still reach you by SMS. |
launched | boolean | Advisory only — see below. |
The launched flag is advisory
launched reflects whether the RCS agent is launched on at least one carrier. It is advisory only — it does not remove the RCS option. The channel/chip still shows even when launched is false, so you can surface RCS to visitors before carrier launch is complete. Use the flag if you want to decide, in your own front-end, whether to present RCS publicly yet.
Data passed through SendSevenConfig
Your website can hand context to the live chat widget before the chat starts, for example the page topic or the plan a visitor is looking at, so your team and your AI agents do not have to ask for it again. Because this data comes from the visitor's browser, SendSeven applies fixed trust rules to it.
<script>
window.SendSevenConfig = {
name: "Ada Lovelace",
email: "[email protected]",
custom: {
interest: "pricing",
contact_type: "prospect"
}
};
</script>
Keys in custom can be a custom field's key, its display name or its id. SendSeven matches them to your custom fields on its servers when the chat starts, in this order: id, then key, then display name. A display name or key that two of your fields share is not matched, so prefer the key. The public widget configuration only lists the custom fields of the widget's pre-chat form, never your full list of custom fields.
Trust rules
- Always unverified. The visitor can change anything on the page, so these values are stored as Visitor-provided. Agents and AI agents see them as unverified, and they never verify an email address or phone number.
- Only existing fields are accepted. A
customkey is used only when it matches an active custom field. Unknown keys, inactive fields, empty values and nested objects are ignored. At most 50 keys are read, and each value is limited to 2000 characters. - Values must fit the field. Each value is validated against the field type and its validation rules. A select or multiselect field only accepts its defined options. A value that does not fit is not saved.
- Trusted values are never overwritten. A value set by your team, the API, an import, an integration, a Flow or a contact token is kept. Injected data can fill an empty field and can replace a value that was itself visitor-provided or set by AI.
- Signed chats only fill empty fields. When the chat is linked to a contact through a contact token or identity verification, injected custom data only fills fields that are empty.
- Contact details are claims. An injected
nameis used only when the contact has no name yet. Anemailorphonenever replaces a saved primary address or number, and a value that belongs to another contact creates a merge suggestion for your team instead of linking the chat to that contact.contactIdis never trusted.
Limit injected data to the widget's form fields
By default, SendSevenConfig.custom can set any active custom field. As an optional hardening step you can limit it to the custom fields of the widget's pre-chat form. Values for other fields are then not saved to the contact.
In the widget editor, open Advanced → Custom data from your website and choose Only pre-chat form fields. Through the API, set customDataScope in the widget config:
customDataScope | Effect |
|---|---|
all_fields (default) | Any active custom field can be set. |
form_fields | Only custom fields that are part of the widget's pre-chat form (required or optional fields) can be set. |
An unrecognized value is treated as form_fields. The trust rules above apply in both modes.
The same settings section, and the embed code dialog, show a notice: "This data can technically be changed by the visitor. For trusted data, use contact tokens."
For a plan, an account status, an order or anything an AI agent should rely on, send the data from your backend with a contact token, or sign the visitor's identity with identity verification. See Customer context for how the sources fit together.
Next Steps
- Live Chat Widget — widget messaging capabilities and responding to conversations
- Deploy a Bot to a Widget — attach an FAQ Bot to a widget
- RCS Business Messaging — RCS as a full messaging channel
- Getting Subscribers & Opt-Ins — how newsletter opt-in works across channels
- Live Chat Contact Tokens: pass trusted, verified data to the widget