Browse all docs

Widget customization

Widget customization

Every widget setting explained: theme, window, launcher, header, copy, behavior, auto-open, page rules, mobile layout, and accessibility.

Last updated:

The widget's appearance and behavior are set per site in the dashboard (open Sites, then the site's widget settings). Because the widget downloads its settings each time it loads, you never need to change the embed snippet when you change them. Settings are cached briefly, so allow up to a minute for a change to reach visitors.

This page documents every setting, using the names stored in the configuration so that they match what you see in the dashboard, exports and the config response of the public API. Everything here is public: do not put secrets in any of these fields.

Theme#

SettingMeaningDefault
modelight, dark or auto (follows the visitor's system setting).light
primary, primary_textAccent color (header, launcher, buttons) and the text color used on it.#1f7a5a, #ffffff
background, textWindow background and main text color.#ffffff, #1b2a24
visitor_bubble, visitor_textBackground and text of the visitor's message bubbles.#1f7a5a, #ffffff
agent_bubble, agent_textBackground and text of the AI and operator bubbles.#eef2f0, #1b2a24
fontsystem, serif, mono or rounded. These use fonts already on the visitor's device, so nothing extra is downloaded.system
radiusCorner rounding in pixels, 0 to 32.14
shadowWhether the window has a drop shadow (its style is under effects).on
presetThe id of the premade theme you started from (empty when you built your own). See Themes and the expanded view.empty

When the widget is in dark mode (set to dark, or auto with a visitor whose device prefers dark), the window background, main text, and AI and operator bubble colors are replaced by a built-in dark palette; your primary and visitor bubble colors still apply, so choose ones that work on both, or set the dark colors yourself in the dark group (see advanced settings below). Colors must be six-digit hex values such as #1f7a5a; anything else is replaced by the default. Always check contrast: text on primary should have a contrast ratio of at least 4.5:1 for readability.

Window#

SettingMeaningRange (default)
positionbottom-right or bottom-left.bottom-right
width, heightChat window size in pixels on desktop.300 to 560 (380), 380 to 900 (600)
offset_x, offset_yDistance from the screen edge in pixels.0 to 200 (20)
z_indexStacking order. The default is very high so the widget sits above most page content. Lower it only if it must sit beneath something.1 to 2147483647 (2147483000)

Launcher#

The launcher is the round button that opens the chat.

SettingMeaningRange (default)
iconchat, sparkle, help or custom.chat
image_urlAn https:// image used when the icon is custom. Use a square image.empty
labelOptional text shown beside the icon (for example "Chat with us"), up to 40 characters.empty
sizeButton size in pixels.40 to 90 (58)
delay_msWait this many milliseconds after the page loads before showing the launcher.0 to 60,000 (0)
hide_on_mobileDo not show the launcher on small screens.off
SettingMeaningDefault
titleHeading at the top of the chat (up to 60 characters).Chat with us
subtitleLine below the title (up to 100).We typically reply instantly
show_avatar, avatar_urlShow a picture in the header. If no avatar URL is set here, the widget can use the agent's persona avatar.on
show_statusShow the online or offline indicator, driven by your business hours.on

Edit the subtitle if you do not reply instantly outside business hours. Set honest expectations.

Text and labels (copy)#

Every piece of text the widget shows can be changed, which is how you translate it or adapt the tone. Each is limited to 120 characters except the error and consent text, which allow 300.

SettingDefault
placeholderType your message…
send_labelSend
online_label, offline_labelOnline, Offline
welcome_bubble(empty) A short message shown next to the launcher to invite a chat, such as "Questions about shipping?". Leave blank for none.
welcome_bubble_delay_s3 (seconds before the bubble appears, 0 to 120)
powered_byPowered by SiteTrellis
end_chat_label, new_chat_labelEnd chat, Start new chat
error_messageCouldn't send. Please try again.
human_joinedA teammate has joined the chat.
transcript_labelEmail me this transcript
consent_text(empty) A short notice such as "By chatting you agree to our privacy policy." With consent collection off it appears as a small note at the bottom of the window; with consent collection on, the visitor must accept it before they can type (an empty notice is replaced by a default one).
consent_url, consent_link_label(empty) An optional https link to your privacy policy shown with the consent notice, and its label (Privacy policy).
consent_accept_label, consent_decline_labelI agree, No thanks
exit_intent_textBefore you go: can we help with anything? (the bubble shown on phones when exit intent fires)

The agent's own greeting and conversation starters are part of the agent, not the widget, so they are edited in the agent builder. To run the chat in several languages, set the agent's language to auto so it answers in the visitor's language; the labels above stay in the single language you set. Per-language label sets are not available in v1.

Behavior#

SettingMeaningDefault
auto_open.enabledOpen the chat automatically.off
auto_open.delay_sOpen after this many seconds (0 to 600).10
auto_open.scroll_pctOpen after the visitor scrolls this percent of the page (0 to 100; 0 disables the scroll trigger).0
auto_open.once_per_sessionOpen at most once per browser session. Independently of this, the chat never opens by itself once the visitor has opened or closed it in that tab.on
auto_open.exit_intentAlso open when the visitor looks about to leave: the cursor leaves through the top of the page (computers) or a fast flick back up the page (touch devices; phones in full-screen mode get a small bubble instead). No history entries are added. See Auto-open, exit intent and consent.off
auto_open.exit_min_time_sDo not trigger exit intent before this many seconds on the page (0 to 600).5
soundPlay a short sound for new replies.off
persist_sessionRemember the conversation across pages and reloads, using the browser's storage. Turn off for shared kiosks.on
show_timestampsShow the time under messages.off
enable_feedbackShow thumbs up and down on replies.on
show_powered_byShow the "Powered by" line. Hiding it needs a plan with the white-label feature (Pro and above); on other plans it is always shown, and the dashboard shows an upgrade link instead of the option.on
mobile_fullscreenUse the full screen for the chat on small screens.on
allow_end_chatLet visitors end the chat themselves.on
collect_consentShow the consent text and require agreement before chatting. The answer is remembered per browser and asked again if you change the notice.off

If no trigger is configured, auto_open opens the chat immediately when enabled, so always set at least a delay, a scroll depth or exit intent.

Auto-open sparingly A chat that pops up on every page annoys visitors. If you use it, pick a delay of 20 seconds or more, keep "once per session" on, and consider limiting it to a pricing or help page with page rules.

Page rules#

Page rules control which pages show the widget, without editing your website. Add URL path patterns to include (show only on matching pages; if empty, show everywhere) and exclude (never show on matching pages). The asterisk * matches any characters. Up to 30 patterns each, 200 characters per pattern.

{
  "page_rules": {
    "include": [],
    "exclude": ["/checkout*", "/account/*", "/legal/*"]
  }
}

To show different agents in different sections of the same site, use page targeting on the agents themselves: see Idle follow-ups and page targeting. Site-wide page rules and agent targeting combine: the widget must be allowed by both.

Page events#

The Page events section lets your own code trigger widget actions without writing widget code. Each rule has an event name and any of: open the chat, show a short message above the chat button, set visitor attributes (values can use {{field}} from the event data). Fire it with SiteTrellis('event', 'name', {...}). See Auto-open, exit intent and consent for the rules and limits.

Mobile and accessibility#

  • Mobile. With mobile_fullscreen on, the chat fills the screen on phones, which gives room for the keyboard. Use hide_on_mobile if the launcher covers important buttons on your mobile layout. The mobile.layout setting also offers a bottom sheet or a small floating window, and the optional expand button gives phones a true full-screen view that respects the notch and the on-screen keyboard.
  • Keyboard and screen readers. The widget is built to be keyboard operable: the launcher and controls can be reached with Tab, the window can be closed with Esc, focus moves into the chat when it opens and returns to the launcher when it closes, and new replies are announced through a live region. Test with your own assistive technology, since page context matters.
  • Contrast and motion. Choose theme colors with sufficient contrast. The widget respects the visitor's reduced-motion preference where animation is used.

Advanced appearance settings#

Beyond the basics above, the widget has a structured settings document (schema 2). Every group is optional: a group you never touch keeps the look it always had, so sites saved before these settings existed render exactly as before. In the dashboard they are grouped in the Appearance tab, with search, a live preview and per-section reset. All values are validated on the server and again in the widget: colors are six-digit hex, choices come from fixed lists, numbers are clamped to a range, URLs must be https://, and nothing is ever treated as HTML.

GroupWhat you can set
theme.presetThe id of the premade theme you started from. It only remembers your starting point (the editor offers "Reset to theme"); the settings themselves are always stored explicitly.
colorsHeader (and a second color for a gradient), header text and bottom line, cards and menus, borders, links, input, input border, placeholder, buttons, accent, launcher, online and offline dots, unread badge, error color, page dimming. An empty value means "automatic" (derived from the brand color, as before).
darkThe same colors for dark mode, separate from light. Empty means the built-in dark palette for window and bubbles, otherwise the light color. Used when mode is dark, or auto and the visitor's device is dark.
typeBase size, line height, body and bold weight, header title size and weight. The font itself is theme.font: system, rounded, humanist, geometric, grotesque, serif, classic, editorial, slab, mono or typewriter (fonts already on the visitor's device).
shapeRadius for bubbles, inputs, buttons and form cards (empty = follows the window radius), border width, and spacing density: compact, comfortable or spacious.
effectsShadow style (soft, crisp, lifted, glow, flat) and color, window opacity and background blur for a frosted-glass look.
windowDesktop size, position and offsets as before, plus tablet_width, tablet_height and tablet offsets for screens between the phone breakpoint and 1024 px (empty = same as desktop).
mobilelayout on phones (auto, fullscreen, sheet or floating), the phone breakpoint in pixels, bottom sheet height, and size and offsets of the floating window.
launcherBesides icon, image, label and size: shape (circle, rounded, pill, square), twelve built-in icons, badge style (count, dot, none), an attention animation (pulse, bounce, wiggle; three times unless animation_loop is on) and its own offsets.
headerAlignment (left or center), avatar shape and size, and close button style (icon, text, chevron).
messagesBubble tail (corner, round, pointer), borders, maximum widths, avatars in messages, sender names, grouping of consecutive messages, timestamp format (time, time24, datetime, relative) and link style.
composerInput style (outlined, filled, underline), send button as icon, label or both, send icon and shape, maximum input height, and whether the box takes focus when the chat opens. The widget has no file attachments, so there is nothing to switch off.
motionOpening animation (pop, fade, slide, zoom, none), duration, optional closing animation, how new messages appear and the typing indicator (dots, pulse, wave, text). A visitor's "reduce motion" setting always wins.
backgroundSolid, gradient or image for the message area and the header, with an overlay color and strength so text stays readable. Images must be https:// and are never fetched until a visitor loads your page.
icons, footerSolid or outline icons and line thickness; footer alignment and size. Add a one-line note above "Powered by" with copy.footer_note.
expandThe expanded view: see Themes and the expanded view.
tokensIndividual design values, for example --st-gap: 12px: see design tokens. Available on every plan.

The extra text settings are footer_note (a line above "Powered by"), expand_label and collapse_label (the tooltip and screen reader name of the expand button), close_label (used by the text close button), side_title (the heading of the side panel in the expanded view, default "Ask about") and typing_text (the text typing indicator). Like every label they accept up to 120 characters (the footer note 160).

Check contrast as you go: the editor shows the WCAG ratio next to each text color, in light and in dark mode, and warns below 4.5:1. All premade themes pass AA in both modes.

Going further#