Back to guides
Customization

Customize the Widget Templates

Take full control of your chat widget β€” edit any of the 15 visual slots (product cards, message bubbles, modals, header, CSS) with the built-in template editor.

What slot templates are

Every theme in Upsellic is built from 15 independent slot templates. Each slot defines one visual fragment of the widget β€” for example, the product card shown when the AI recommends a product, or the rating modal that appears when a customer closes the chat. Slots are written in Nunjucks (a template language similar to Twig, Handlebars or Jinja) and a single STYLES slot holds all the CSS that wires the layout together.

This means every part of the widget that the visitor sees is editable, per merchant, per theme. You can match the chat to your store's visual design in every detail β€” colors, typography, spacing, button shapes, card layouts β€” without any work on our end and without breaking any other merchant's widget.

1

The 15 slots

SlotWhat it renders
PRODUCT_CARDProduct recommendation card inside the assistant message
CONTENT_CARDArticle / content recommendation card
ORDER_CARDOrder tracking card with status and shipping link
WELCOME_MESSAGEGreeting shown when the chat opens for the first time
GOODBYE_MESSAGEFarewell shown when the conversation ends
HEADERTop bar of the widget (title, subtitle, controls)
FOOTERBottom branding strip below the input
QUANTITY_TIERSQuantity pricing block for the product
MESSAGE_USERCustomer message bubble
MESSAGE_ASSISTANTAssistant message bubble
PRODUCT_MODALFull product detail popup opened when the customer taps a card
RATING_MODALConversation rating popup with sentiment buttons
HANDOFF_UILive agent handoff prompts (waiting / connected / fallback channels)
STYLESThe complete CSS bundle for the theme

Slots reference shared variables β€” theme.primaryColour, phrases.viewProduct, product.salePrice, etc. β€” so even when you rewrite the markup, the widget still wires up to product data, color settings, and translations automatically.

2

System themes vs custom themes

Upsellic ships with system themes (default, minimal, editorial) β€” these are the defaults and are read-only by design, so updates we ship don't accidentally overwrite anyone's customizations. To customize a widget, you first clone one of the system themes into a private custom theme that belongs to your account. From that point on, the theme is yours to edit freely.

Clone a system theme

Before you can edit any template, you need a custom theme β€” a copy of a system theme that exists only in your account.

1

Open the themes list

In the dashboard sidebar, click Themes. You'll see all available themes β€” system themes are marked separately from custom themes you've created previously.

Themes list
2

Click "Clone" on the system theme you want to copy as a starting point

A modal appears asking for the name of your new theme. Pick a name that reflects the brand or purpose (e.g. Holiday Edition, NL Shop, Mobile-first).

Clone theme modal

After confirming, the new custom theme appears in the list with all 15 slots pre-filled from the system theme you cloned. Colors are also copied β€” but everything is now editable.

The system theme you cloned from stays unchanged and continues to be available as a "Compare with source" reference inside the editor β€” useful when you want to see exactly what you've changed.

Edit a slot

1

Open the template editor

On any custom theme card, click the Code editor button. The editor lists all 15 slots on the left, the Monaco code editor in the main area, and a live preview pane on the right that renders the widget from the current draft.

Slot template editor
2

Pick a slot to edit

Click any slot name in the sidebar β€” the editor loads that slot's content and the preview re-renders. The active slot is highlighted, and slots with unsaved drafts (more on that next) are marked so you can see what's been modified.

3

Make your changes

The editor is full-blown Monaco (the same engine that powers VS Code), with syntax highlighting for HTML / Nunjucks (in slot templates) and CSS (in the STYLES slot). Bracket matching, line numbers, multi-cursor, find & replace, keyboard shortcuts β€” every feature you need to edit code.

Every keystroke is auto-saved as a draft. Drafts are private to the editor and have zero effect on the production widget β€” your customers keep seeing the previously published version until you hit Publish.

4

Use the live preview

The preview pane on the right re-renders the widget every time the draft updates. It uses sample product / content / order data so you can see how cards, bubbles, modals and prices look without sending real chats. Click on a product card in the preview to verify the modal you just edited.

Publish your changes

Drafts let you experiment safely. To publish your changes, the workflow is:

1

Compare with source

Click Compare with source on the edited slot. The editor switches to a side-by-side diff view (Monaco's built-in diff editor) showing the original system template on the left and your draft on the right. Every difference is highlighted line-by-line, so you can review exactly what will change before going live.

Compare with source
2

Publish a single slot β€” or all of them at once

Hit Publish to push the active slot's draft to production. Or click Publish all in the toolbar to publish every slot that has unsaved changes β€” this also clears the theme's cache in one go, which is faster when editing many slots.

Publishing emits a theme.updated event internally. The widget bundle for every active widget using this theme is rebuilt and the CDN cache is purged. The next page load on your customers' side will serve the fresh version.

3

Discard or reset if something goes wrong

  • Discard draft β€” reverts the slot's draft back to whatever is currently published, rolling back any unpublished changes.
  • Reset β€” reloads the slot from the original system template (the one this theme was cloned from). Useful when you want to start editing the slot from scratch.

Clear the widget cache

Most of the time you don't need to clear the cache manually β€” publishing a slot already does it automatically. For the rare cases when you want to force a rebuild, the editor toolbar has a Clear widget cache button.

Clear widget cache button

The button purges both the in-memory bundle cache on our API and the CDN cache for every active widget using this theme. The next request rebuilds the bundle from the current published templates.

Export and import themes

Themes are portable β€” you can export an entire custom theme (colors + all 15 slots, drafts and published, in a single JSON file) and import it back later, on the same account or on another one.

1

Export

On any custom theme card, click Export. A JSON file downloads to your computer with a name like MyTheme.2026-05-01T12-34-56.theme.json. Keep it somewhere safe β€” it's a complete snapshot of the theme.

System themes can't be exported directly. Clone the system theme first, then export the cloned theme.

2

Import

Click Import theme in the toolbar at the top of the themes list and pick a JSON file. The imported theme always lands as a new custom theme β€” its name is the original name suffixed with the import timestamp, e.g. MyTheme (import 2026-05-01 14:22:08).

Importing never overwrites an existing theme. This means you can:

  • Roll back a customization by importing an older snapshot β€” the previous version comes in as a brand new theme that you set in the widget edit settings.
  • Experiment β€” import a snapshot, customize it without touching the original, run A/B tests by switching the widget's theme.
Import theme button

To make an imported theme live for a widget, go to Widgets, edit the widget you want to update, and pick the imported theme from the theme list. The switch is instant β€” the next page load on customers' devices serves the new theme.

Share this guide