> ## Documentation Index
> Fetch the complete documentation index at: https://docs.upmind.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuring Options in Cart and Portal

> A full reference for everything you can customise in Cart 2.0's storefront and Client Portal, from layouts and copy to styling and feature toggles.

* **Time** — 20 minutes
* **Difficulty** — Intermediate

**What You'll Build:** A clear understanding of every configurable element across the Cart and Client Portal, including page templates, product layouts, content overrides, design tokens, and feature visibility settings, so you can shape the customer experience from first browse through to post-purchase account management.

**Prerequisites:**

* An active [Upmind account](https://upmind.com/start) with Cart 2.0 enabled.
* Access to **Settings > Brand Settings** in your Upmind admin panel.
* A read-through of [Configuring Your Store with UI Metadata](/using-cart-20/choosing-what-to-implement-for-your-business/configuring-your-store-with-ui-metadata) to understand how context and data settings work.
* A read-through of [<u>Setting Up Theming with CSS Variables</u>](/using-cart-20/choosing-what-to-implement-for-your-business/setting-up-theming-with-css-variables) to understand how design tokens are applied.
* Basic familiarity with JSON and CSS syntax.

Cart 2.0 is designed to adapt to your brand and product model rather than forcing your business to adapt to a fixed checkout. Customisation is handled through a combination of **UI metadata**, **design tokens**, and **component-level configuration**, giving teams control without fragmenting logic or introducing fragile overrides.

This section covers what can be customized in the **Cart** and the **Client Portal**.

## What is configurable in the Cart

The Cart is the customer-facing purchase experience, from browsing products to confirmation. Nearly every visible and behavioural element can be adjusted without rewriting core logic. You can configure the following:

1. Layout and structure
2. Content and copy
3. Visual styling and branding
4. Feature visibility and behaviour

### 1. Layout and structure

#### **Templates**

Templates can be set on the various contexts to allow users to customise pages in their store with different layouts.

These are configured through the **UI Schema** in your brand settings. The setting key follows this format:

```text theme={null}
@context.{page}.template
```

These can be set globally (`*`) to apply that template to all applicable pages.

`JSON` **Example:**

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.*.template": = "two-column-ltr"
  }
  ```
</CodeGroup>

Or by `{page}` context specifically, such as (`@context.checkout.template`) for the checkout page to use the "full" template.

`JSON` **Example:**

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.checkout.template": = "full"
  }
  ```
</CodeGroup>

This sets every page to use the **Two Column (Left-to-Right)** template. You can then override individual pages by also specifying their specific context.

* @context.\*.template = two-column-ltr > all pages default to this
* @context.auth.template = canvas-card > login/register pages override to this

`JSON` **Example:**

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.*.template": = "two-column-ltr",
  	"@context.auth.template": = "canvas-card"
  }
  ```
</CodeGroup>

In this example, every page uses the two-column layout except the login and registration pages, which use the centred card style instead.

* **Login & Registration (auth)**

| **Template Value**         |
| -------------------------- |
| `two-column-ltr` (Default) |
| `two-column-rtl`           |
| `split`                    |
| `canvas-card`              |
| `surface-box`              |
| `enclosed`                 |

<Note>
  Auth template context does not support `full` template.
</Note>

`JSON` **Example**: Registration (Split) - Full-width horizontal split. No header or footer visible. Clean, minimal design with the form centred.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.auth.template": "split"
  }
  ```
</CodeGroup>

<Frame caption="Split registration layout">
  <img src="https://mintcdn.com/upmind/A-RwNPXmK_xnEEqe/images/fb/77b031c5741bf8fd.png?fit=max&auto=format&n=A-RwNPXmK_xnEEqe&q=85&s=d1cf63945c0335182e1d2ce7225e8ae2" alt="Split registration layout" className="mx-auto" style={{ width:"99%" }} width="2808" height="1444" data-path="images/fb/77b031c5741bf8fd.png" />

  <img src="https://mintcdn.com/upmind/A-RwNPXmK_xnEEqe/images/fb/77b031c5741bf8fd.png?fit=max&auto=format&n=A-RwNPXmK_xnEEqe&q=85&s=d1cf63945c0335182e1d2ce7225e8ae2" alt="Split registration layout" className="mx-auto" style={{ width:"99%" }} width="2808" height="1444" data-path="images/fb/77b031c5741bf8fd.png" />

  <img src="https://mintcdn.com/upmind/A-RwNPXmK_xnEEqe/images/fb/77b031c5741bf8fd.png?fit=max&auto=format&n=A-RwNPXmK_xnEEqe&q=85&s=d1cf63945c0335182e1d2ce7225e8ae2" alt="Split registration layout" className="mx-auto" style={{ width:"99%" }} width="2808" height="1444" data-path="images/fb/77b031c5741bf8fd.png" />
</Frame>

* **Product Configuration (configure)**

| **Template Value**         |
| -------------------------- |
| `two-column-rtl` (Default) |
| `two-column-ltr`           |
| `full`                     |
| `enclosed`                 |

`JSON` **Example**: Product Configuration (full) - Full-width single column. All configuration options and product details stack vertically. Good for simple products with few options.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.configure.template": "full"
  }
  ```
</CodeGroup>

<Frame caption="Full configure layout">
  <img src="https://mintcdn.com/upmind/1xguIfYUrfespmVI/images/fb/7cce6a9d6d321fc7.png?fit=max&auto=format&n=1xguIfYUrfespmVI&q=85&s=9610f6f698d81a642394107a0ccbd8b3" alt="Full configure layout" className="mx-auto" style={{ width:"98%" }} width="1470" height="1542" data-path="images/fb/7cce6a9d6d321fc7.png" />

  <img src="https://mintcdn.com/upmind/1xguIfYUrfespmVI/images/fb/7cce6a9d6d321fc7.png?fit=max&auto=format&n=1xguIfYUrfespmVI&q=85&s=9610f6f698d81a642394107a0ccbd8b3" alt="Full configure layout" className="mx-auto" style={{ width:"98%" }} width="1470" height="1542" data-path="images/fb/7cce6a9d6d321fc7.png" />

  <img src="https://mintcdn.com/upmind/1xguIfYUrfespmVI/images/fb/7cce6a9d6d321fc7.png?fit=max&auto=format&n=1xguIfYUrfespmVI&q=85&s=9610f6f698d81a642394107a0ccbd8b3" alt="Full configure layout" className="mx-auto" style={{ width:"98%" }} width="1470" height="1542" data-path="images/fb/7cce6a9d6d321fc7.png" />
</Frame>

* **Basket (basket)**

| **Template Value**         |
| -------------------------- |
| `two-column-ltr` (Default) |
| `two-column-rtl`           |
| `full`                     |
| `enclosed`                 |

`JSON` **Example**: Basket (two-column-rtl) - Order summary on the left, product list on the right.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.basket.template": "two-column-rtl"
  }
  ```
</CodeGroup>

<Frame caption="Two column right to left basket layout">
  <img src="https://mintcdn.com/upmind/VnCXiz5rboywDnvn/images/fb/d6b8230c8242ecd6.png?fit=max&auto=format&n=VnCXiz5rboywDnvn&q=85&s=40abab879072394a5ceb6f2da2f58cca" alt="Two column right to left basket layout" className="mx-auto" style={{ width:"99%" }} width="2108" height="1538" data-path="images/fb/d6b8230c8242ecd6.png" />

  <img src="https://mintcdn.com/upmind/VnCXiz5rboywDnvn/images/fb/d6b8230c8242ecd6.png?fit=max&auto=format&n=VnCXiz5rboywDnvn&q=85&s=40abab879072394a5ceb6f2da2f58cca" alt="Two column right to left basket layout" className="mx-auto" style={{ width:"99%" }} width="2108" height="1538" data-path="images/fb/d6b8230c8242ecd6.png" />

  <img src="https://mintcdn.com/upmind/VnCXiz5rboywDnvn/images/fb/d6b8230c8242ecd6.png?fit=max&auto=format&n=VnCXiz5rboywDnvn&q=85&s=40abab879072394a5ceb6f2da2f58cca" alt="Two column right to left basket layout" className="mx-auto" style={{ width:"99%" }} width="2108" height="1538" data-path="images/fb/d6b8230c8242ecd6.png" />
</Frame>

* **Checkout (checkout)**

| **Template Value**         |
| -------------------------- |
| `two-column-ltr` (Default) |
| `two-column-rtl`           |
| `full`                     |
| `enclosed`                 |

`JSON` **Example**: Checkout (enclosed) - Checkout content wrapped in a card container. Gives a self-contained, focused checkout experience.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.checkout.template": "enclosed"
  }
  ```
</CodeGroup>

<Frame caption="Enclosed checkout layout">
  <img src="https://mintcdn.com/upmind/z5ofg3t7by4uN44v/images/fb/ebceaeb586fe99e1.png?fit=max&auto=format&n=z5ofg3t7by4uN44v&q=85&s=005ce43b56b777dd71937f5dbc72a67b" alt="Enclosed checkout layout" className="mx-auto" style={{ width:"99%" }} width="2204" height="1534" data-path="images/fb/ebceaeb586fe99e1.png" />

  <img src="https://mintcdn.com/upmind/z5ofg3t7by4uN44v/images/fb/ebceaeb586fe99e1.png?fit=max&auto=format&n=z5ofg3t7by4uN44v&q=85&s=005ce43b56b777dd71937f5dbc72a67b" alt="Enclosed checkout layout" className="mx-auto" style={{ width:"99%" }} width="2204" height="1534" data-path="images/fb/ebceaeb586fe99e1.png" />

  <img src="https://mintcdn.com/upmind/z5ofg3t7by4uN44v/images/fb/ebceaeb586fe99e1.png?fit=max&auto=format&n=z5ofg3t7by4uN44v&q=85&s=005ce43b56b777dd71937f5dbc72a67b" alt="Enclosed checkout layout" className="mx-auto" style={{ width:"99%" }} width="2204" height="1534" data-path="images/fb/ebceaeb586fe99e1.png" />
</Frame>

* **Billing Details (billing\_details)**

| **Template Value**         |
| -------------------------- |
| `two-column-ltr` (Default) |
| `two-column-rtl`           |
| `full`                     |
| `enclosed`                 |

`JSON` **Example**: Billing details (full) - Full-width single column.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.billing_details.template": "full"
  }
  ```
</CodeGroup>

<Frame caption="Full billing details layout">
  <img src="https://mintcdn.com/upmind/2ooSxDpt6PiIGMr-/images/fb/04692649bc7ecaaf.png?fit=max&auto=format&n=2ooSxDpt6PiIGMr-&q=85&s=43caabebfc3007ed2b5d1eff94ee7646" alt="Full billing details layout" className="mx-auto" style={{ width:"99%" }} width="2488" height="1540" data-path="images/fb/04692649bc7ecaaf.png" />

  <img src="https://mintcdn.com/upmind/2ooSxDpt6PiIGMr-/images/fb/04692649bc7ecaaf.png?fit=max&auto=format&n=2ooSxDpt6PiIGMr-&q=85&s=43caabebfc3007ed2b5d1eff94ee7646" alt="Full billing details layout" className="mx-auto" style={{ width:"99%" }} width="2488" height="1540" data-path="images/fb/04692649bc7ecaaf.png" />

  <img src="https://mintcdn.com/upmind/2ooSxDpt6PiIGMr-/images/fb/04692649bc7ecaaf.png?fit=max&auto=format&n=2ooSxDpt6PiIGMr-&q=85&s=43caabebfc3007ed2b5d1eff94ee7646" alt="Full billing details layout" className="mx-auto" style={{ width:"99%" }} width="2488" height="1540" data-path="images/fb/04692649bc7ecaaf.png" />
</Frame>

* Order Confirmation (confirmation)

| **Template Value**         |
| -------------------------- |
| `two-column-ltr` (Default) |
| `two-column-rtl`           |
| `full`                     |
| `enclosed`                 |

`JSON` **Example**: Order Confirmation (full) - Full-width single column.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.confirmation.template": "full"
  }
  ```
</CodeGroup>

<Frame caption="Full confirmation layout">
  <img src="https://mintcdn.com/upmind/92wYnpdR_k6AjH3x/images/fb/569cc8348a5a3588.png?fit=max&auto=format&n=92wYnpdR_k6AjH3x&q=85&s=d7d1e5bc7ee2fa7bdc8a51938899d10d" alt="Full confirmation layout" className="mx-auto" style={{ width:"99%" }} width="1952" height="1532" data-path="images/fb/569cc8348a5a3588.png" />

  <img src="https://mintcdn.com/upmind/92wYnpdR_k6AjH3x/images/fb/569cc8348a5a3588.png?fit=max&auto=format&n=92wYnpdR_k6AjH3x&q=85&s=d7d1e5bc7ee2fa7bdc8a51938899d10d" alt="Full confirmation layout" className="mx-auto" style={{ width:"99%" }} width="1952" height="1532" data-path="images/fb/569cc8348a5a3588.png" />

  <img src="https://mintcdn.com/upmind/92wYnpdR_k6AjH3x/images/fb/569cc8348a5a3588.png?fit=max&auto=format&n=92wYnpdR_k6AjH3x&q=85&s=d7d1e5bc7ee2fa7bdc8a51938899d10d" alt="Full confirmation layout" className="mx-auto" style={{ width:"99%" }} width="1952" height="1532" data-path="images/fb/569cc8348a5a3588.png" />
</Frame>

**Appendix: Template Page Contexts**

| **Context**      | **Definitions**                                                                                                                                                                                                      | **Configuration Key**              | **Applies To**                                        |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ----------------------------------------------------- |
| auth             | The context for login, registration, and password recovery pages. It has the widest selection of available templates, giving you the most control over the first impression customers get when accessing your store. | @context.auth.template             | Login, Registration, and Password Recovery pages      |
| configure        | The context for the product configuration page, where customers select options, choose billing terms, and fill in any required provisioning fields.                                                                  | @context.configure.template        | Product Configuration page                            |
| basket           | The context for the basket page, where customers review their selected products, quantities, and totals before moving to checkout.                                                                                   | @context.basket.template           | Basket / Cart page                                    |
| checkout         | The context for the checkout page, where customers enter payment details and complete their purchase.                                                                                                                | @context.checkout.template         | Checkout / Payment page                               |
| billing\_details | The context for the standalone billing details page, where customers enter or update the billing information tied to their account.                                                                                  | @context.billing\_details.template | Standalone Billing Details page                       |
| confirmation     | The context for the order confirmation page, shown to customers after a successful purchase.                                                                                                                         | @context.confirmation.template     | Order Confirmation page                               |
| catalogue        | The context for the product catalogue page, where customers browse available products and categories.                                                                                                                | @context.catalogue.template        | Product Catalogue listing page                        |
| recommendations  | The context for the product recommendations page, where suggested or related products are shown to customers during the buying journey.                                                                              | @context.recommendations.template  | Recommendations / Cross-sell page                     |
| \* (wildcard)    | A global context that applies a setting across all pages at once. Any page with its own specific context setting will take precedence over the wildcard value.                                                       | @context.\*.template               | All pages simultaneously (can be overridden per-page) |

**Appendix: Template Properties**

| **Context**      | **Component**                 | **Template Enum**         | Type   | **Default**    | **Template Enum Values**                                                              |
| ---------------- | ----------------------------- | ------------------------- | ------ | -------------- | ------------------------------------------------------------------------------------- |
| auth             | `session/Login.vue`           | `SESSION_TEMPLATE`        | String | two-column-ltr | `split`, `enclosed`, `canvas-card`, `surface-box`, `two-column-ltr`, `two-column-rtl` |
| auth             | `session/Register.vue`        | `SESSION_TEMPLATE`        | String | two-column-ltr | `split`, `enclosed`, `canvas-card`, `surface-box`, `two-column-ltr`, `two-column-rtl` |
| auth             | `session/RecoverPassword.vue` | `SESSION_TEMPLATE`        | String | two-column-ltr | `split`, `enclosed`, `canvas-card`, `surface-box`, `two-column-ltr`, `two-column-rtl` |
| basket           | `basket/Basket.vue`           | `BASKET_TEMPLATE`         | String | two-column-rtl | `full`, `two-column-ltr`, `two-column-rtl`, `enclosed`                                |
| checkout         | `checkout/Checkout.vue`       | `CHECKOUT_TEMPLATE`       | String | two-column-rtl | `full`, `two-column-ltr`, `two-column-rtl`, `enclosed`                                |
| billing\_details | `billing/Billing.vue`         | `BILLING_TEMPLATE`        | String | -              | `full`, `two-column-ltr`, `two-column-rtl`, `enclosed`                                |
| configure        | `product/Configure.vue`       | `PRODUCT_TEMPLATE`        | String | two-column-rtl | `full`, `two-column-ltr`, `two-column-rtl`, `enclosed`                                |
| confirmation     | `order/Order.vue`             | `ORDER_TEMPLATE`          | String | -              | `full`, `two-column-ltr`, `two-column-rtl`, `enclosed`                                |
| basket (edit)    | `basket-product/Edit.vue`     | `BASKET_PRODUCT_TEMPLATE` | String |                | `full`, `two-column-ltr`, `two-column-rtl`, `enclosed`                                |

#### Other layout and structure settings

You can control how pages are structured across contexts such as catalogue, configuration, basket, checkout, and confirmation. These changes are driven by **context settings**, allowing different behaviour on different screens without duplication.

Configurable elements include:

**JSON Examples**

* Product listing layout (grid, list, column count by viewport). The product catalogue list appears with a 2-column layout. The default is a `3-column layout`.

`JSON` **Example**: productListLayout column.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.catalogue.productListLayout": "2-col"
  }
  ```
</CodeGroup>

<Frame caption="2 column product catalogue list layout">
  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/bcdc8e0e20856686.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=b3fc18819c8a11e63418a42029eca244" alt="2 column product catalogue list layout" className="mx-auto" style={{ width:"93%" }} width="1838" height="1536" data-path="images/fb/bcdc8e0e20856686.png" />

  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/bcdc8e0e20856686.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=b3fc18819c8a11e63418a42029eca244" alt="2 column product catalogue list layout" className="mx-auto" style={{ width:"93%" }} width="1838" height="1536" data-path="images/fb/bcdc8e0e20856686.png" />

  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/bcdc8e0e20856686.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=b3fc18819c8a11e63418a42029eca244" alt="2 column product catalogue list layout" className="mx-auto" style={{ width:"93%" }} width="1838" height="1536" data-path="images/fb/bcdc8e0e20856686.png" />
</Frame>

* Visibility of sections such as categories, recommendations, or breadcrumbs. Breadcrumbs can be hidden globally. It is `visible` by default.

`JSON` **Example**: Breadcrumbs visibility.

<CodeGroup>
  ```json JSON theme={null}
  {
     "@context.*.breadcrumbs": "hidden"
  }
  ```
</CodeGroup>

<Frame caption="Breadcrumbs hidden on category">
  <img src="https://mintcdn.com/upmind/ObllJJl59DabnmMn/images/fb/d213dcd8b1b206d7.png?fit=max&auto=format&n=ObllJJl59DabnmMn&q=85&s=b3eae8460838425c3d231b1432dd201d" alt="Breadcrumbs hidden on category" className="mx-auto" style={{ width:"82%" }} width="2734" height="640" data-path="images/fb/d213dcd8b1b206d7.png" />

  <img src="https://mintcdn.com/upmind/ObllJJl59DabnmMn/images/fb/d213dcd8b1b206d7.png?fit=max&auto=format&n=ObllJJl59DabnmMn&q=85&s=b3eae8460838425c3d231b1432dd201d" alt="Breadcrumbs hidden on category" className="mx-auto" style={{ width:"82%" }} width="2734" height="640" data-path="images/fb/d213dcd8b1b206d7.png" />

  <img src="https://mintcdn.com/upmind/ObllJJl59DabnmMn/images/fb/d213dcd8b1b206d7.png?fit=max&auto=format&n=ObllJJl59DabnmMn&q=85&s=b3eae8460838425c3d231b1432dd201d" alt="Breadcrumbs hidden on category" className="mx-auto" style={{ width:"82%" }} width="2734" height="640" data-path="images/fb/d213dcd8b1b206d7.png" />
</Frame>

* Placement of summaries, totals, and action buttons. Even when product options are selected, these will not show in your configuration summary. The default is `visible`.

`JSON` **Example**: productConfigOptionsSummary visibility.

<CodeGroup>
  ```json JSON theme={null}
  {
     "@context.*.productConfigOptionsSummary": "hidden"
  }
  ```
</CodeGroup>

<Frame caption="Product configuration option summary hidden">
  <img src="https://mintcdn.com/upmind/kXD0Ya8PpcxxNm6Q/images/fb/437a7ba2081e54f0.png?fit=max&auto=format&n=kXD0Ya8PpcxxNm6Q&q=85&s=c5aa1ead2d34aaedc1ebe7fa5fdd500f" alt="Product configuration option summary hidden" className="mx-auto" style={{ width:"96%" }} width="2062" height="1534" data-path="images/fb/437a7ba2081e54f0.png" />

  <img src="https://mintcdn.com/upmind/kXD0Ya8PpcxxNm6Q/images/fb/437a7ba2081e54f0.png?fit=max&auto=format&n=kXD0Ya8PpcxxNm6Q&q=85&s=c5aa1ead2d34aaedc1ebe7fa5fdd500f" alt="Product configuration option summary hidden" className="mx-auto" style={{ width:"96%" }} width="2062" height="1534" data-path="images/fb/437a7ba2081e54f0.png" />

  <img src="https://mintcdn.com/upmind/kXD0Ya8PpcxxNm6Q/images/fb/437a7ba2081e54f0.png?fit=max&auto=format&n=kXD0Ya8PpcxxNm6Q&q=85&s=c5aa1ead2d34aaedc1ebe7fa5fdd500f" alt="Product configuration option summary hidden" className="mx-auto" style={{ width:"96%" }} width="2062" height="1534" data-path="images/fb/437a7ba2081e54f0.png" />
</Frame>

* Step ordering and visibility within the checkout flow. Basket items can be visible in the checkout. The default is `hidden`.

`JSON` **Example**: basketItems visibility.

<CodeGroup>
  ```json JSON theme={null}
  {
     "@context.checkout.basketItems": "visible"
  }
  ```
</CodeGroup>

<Frame caption="Basket items in checkout visibility">
  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/bc3ba328fb598169.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=519757a5e697b859200ee70f9dbf5501" alt="Basket items in checkout visibility" className="mx-auto" style={{ width:"99%" }} width="2796" height="1384" data-path="images/fb/bc3ba328fb598169.png" />

  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/bc3ba328fb598169.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=519757a5e697b859200ee70f9dbf5501" alt="Basket items in checkout visibility" className="mx-auto" style={{ width:"99%" }} width="2796" height="1384" data-path="images/fb/bc3ba328fb598169.png" />

  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/bc3ba328fb598169.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=519757a5e697b859200ee70f9dbf5501" alt="Basket items in checkout visibility" className="mx-auto" style={{ width:"99%" }} width="2796" height="1384" data-path="images/fb/bc3ba328fb598169.png" />
</Frame>

* Control how product options are displayed and selected by the customer. Renders the option selector in particular layouts. The default is `radio-rows`.

`JSON` **Example**: optionSelector structure.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.configure.optionSelector": "select"
  }
  ```
</CodeGroup>

<Frame caption="Select option selector">
  <img src="https://mintcdn.com/upmind/6knUVC8F1nK4E5CY/images/fb/c63342619a3d514d.png?fit=max&auto=format&n=6knUVC8F1nK4E5CY&q=85&s=9a684a0abc48a9a78a54d87a3ebe4ee2" alt="Select option selector" className="mx-auto" style={{ width:"98%" }} width="2790" height="842" data-path="images/fb/c63342619a3d514d.png" />

  <img src="https://mintcdn.com/upmind/6knUVC8F1nK4E5CY/images/fb/c63342619a3d514d.png?fit=max&auto=format&n=6knUVC8F1nK4E5CY&q=85&s=9a684a0abc48a9a78a54d87a3ebe4ee2" alt="Select option selector" className="mx-auto" style={{ width:"98%" }} width="2790" height="842" data-path="images/fb/c63342619a3d514d.png" />

  <img src="https://mintcdn.com/upmind/6knUVC8F1nK4E5CY/images/fb/c63342619a3d514d.png?fit=max&auto=format&n=6knUVC8F1nK4E5CY&q=85&s=9a684a0abc48a9a78a54d87a3ebe4ee2" alt="Select option selector" className="mx-auto" style={{ width:"98%" }} width="2790" height="842" data-path="images/fb/c63342619a3d514d.png" />
</Frame>

* Set the number of columns in the option selector when using the `radio-grid` layout. Displays option cards in a column grid, adjustable from 1 to 4 columns to suit your product listing layout. The default is `2-col`.

`JSON` **Example**: optionSelectorGrid columns.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.configure.optionSelectorGrid": "3-col"
  }
  ```
</CodeGroup>

<Frame caption="3-col option selector grid">
  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/b8f41ea9fe4463a5.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=bb85707eda61825608c642269cd78f5e" alt="3-col option selector grid" className="mx-auto" style={{ width:"97%" }} width="2530" height="1530" data-path="images/fb/b8f41ea9fe4463a5.png" />

  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/b8f41ea9fe4463a5.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=bb85707eda61825608c642269cd78f5e" alt="3-col option selector grid" className="mx-auto" style={{ width:"97%" }} width="2530" height="1530" data-path="images/fb/b8f41ea9fe4463a5.png" />

  <img src="https://mintcdn.com/upmind/5gi4DQpw4X76kT6T/images/fb/b8f41ea9fe4463a5.png?fit=max&auto=format&n=5gi4DQpw4X76kT6T&q=85&s=bb85707eda61825608c642269cd78f5e" alt="3-col option selector grid" className="mx-auto" style={{ width:"97%" }} width="2530" height="1530" data-path="images/fb/b8f41ea9fe4463a5.png" />
</Frame>

* Toggle the visibility of icons displayed alongside each selectable option. Option icons are `visible` by default. You can hide them to display option labels only.

`JSON` **Example**: optionSelectorIcons visibility.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.configure.optionSelectorIcons": "hidden"
  }
  ```
</CodeGroup>

* Assign a display name to a group of options when using the select-grouped selector layout. Shows a labelled group heading within the grouped dropdown, making it easier for customers to scan and identify related options.

`JSON` **Example**: optionGroupLabel.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@data.optionGroupLabel":
  }
  ```
</CodeGroup>

* Assign an icon to an option group, displayed next to the group label in a `select-grouped` layout. Shows a visual icon beside the group label to help customers quickly identify and differentiate option categories.

`JSON` **Example**: optionGroupIcon.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@data.optionGroupIcon": "rocket"
  }
  ```
</CodeGroup>

* Control how billing term options (e.g., monthly, yearly) are presented to the customer. Renders billing terms structure accordingly. The default is `radio-grid`.

`JSON` **Example**: termSelector structure.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.configure.termSelector": "select"
  }
  ```
</CodeGroup>

<Frame caption="termSelector select">
  <img src="https://mintcdn.com/upmind/pcUdSuxUJ6LgBXnd/images/fb/9f636cd9ed933bcd.png?fit=max&auto=format&n=pcUdSuxUJ6LgBXnd&q=85&s=27b3717e7eb4c094b64ad1c957f87ce0" alt="termSelector select" className="mx-auto" style={{ width:"98%" }} width="2788" height="1526" data-path="images/fb/9f636cd9ed933bcd.png" />

  <img src="https://mintcdn.com/upmind/pcUdSuxUJ6LgBXnd/images/fb/9f636cd9ed933bcd.png?fit=max&auto=format&n=pcUdSuxUJ6LgBXnd&q=85&s=27b3717e7eb4c094b64ad1c957f87ce0" alt="termSelector select" className="mx-auto" style={{ width:"98%" }} width="2788" height="1526" data-path="images/fb/9f636cd9ed933bcd.png" />

  <img src="https://mintcdn.com/upmind/pcUdSuxUJ6LgBXnd/images/fb/9f636cd9ed933bcd.png?fit=max&auto=format&n=pcUdSuxUJ6LgBXnd&q=85&s=27b3717e7eb4c094b64ad1c957f87ce0" alt="termSelector select" className="mx-auto" style={{ width:"98%" }} width="2788" height="1526" data-path="images/fb/9f636cd9ed933bcd.png" />
</Frame>

* Set the number of columns in the term selector when using the `radio-grid` layout. Display billing term cards in various columns. The default is `2-col`.

`JSON` **Example**: termSelectorGrid columns.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.configure.termSelectorGrid": "3-col"
  }
  ```
</CodeGroup>

<Frame caption="termSelectorGrid 3 column">
  <img src="https://mintcdn.com/upmind/ZsIo0APxdVb_gFS-/images/fb/2786c3e636ae4a34.png?fit=max&auto=format&n=ZsIo0APxdVb_gFS-&q=85&s=399df1c5f8d99415eb30201afcb96b59" alt="termSelectorGrid 3 column" className="mx-auto" style={{ width:"98%" }} width="2794" height="1464" data-path="images/fb/2786c3e636ae4a34.png" />

  <img src="https://mintcdn.com/upmind/ZsIo0APxdVb_gFS-/images/fb/2786c3e636ae4a34.png?fit=max&auto=format&n=ZsIo0APxdVb_gFS-&q=85&s=399df1c5f8d99415eb30201afcb96b59" alt="termSelectorGrid 3 column" className="mx-auto" style={{ width:"98%" }} width="2794" height="1464" data-path="images/fb/2786c3e636ae4a34.png" />

  <img src="https://mintcdn.com/upmind/ZsIo0APxdVb_gFS-/images/fb/2786c3e636ae4a34.png?fit=max&auto=format&n=ZsIo0APxdVb_gFS-&q=85&s=399df1c5f8d99415eb30201afcb96b59" alt="termSelectorGrid 3 column" className="mx-auto" style={{ width:"98%" }} width="2794" height="1464" data-path="images/fb/2786c3e636ae4a34.png" />
</Frame>

* Toggle the visibility of the billing summary shown beneath the selected term. Show a cost summary line (e.g., "Pay $12.00 today, then $X.XX/mo"). The default is `visible.`

`JSON` **Example**: termSelectorSummary visibility.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@context.configure.termSelectorSummary": "hidden"
  }
  ```
</CodeGroup>

### 2. Content and copy

All user-facing text is controlled through **i18n configuration in UI metadata.** Content can be overridden at brand, category, product, or option level, allowing targeted messaging where it matters most.

This includes:

**CSS Examples**

* Headings and subheadings. You can change the colour of headings in your cart.

`CSS` **Example**: Text colour display of headings.

<CodeGroup>
  ```css CSS theme={null}
  {
     --text-display: #d72929;
  }
  ```
</CodeGroup>

<Frame caption="Updated title colour">
  <img src="https://mintcdn.com/upmind/Dgjmf3QWYVBR40cE/images/fb/5d3fcd8abf0be164.png?fit=max&auto=format&n=Dgjmf3QWYVBR40cE&q=85&s=8382799543173d4a6653f5948121753b" alt="Updated title color" className="mx-auto" style={{ width:"97%" }} width="2796" height="498" data-path="images/fb/5d3fcd8abf0be164.png" />

  <img src="https://mintcdn.com/upmind/Dgjmf3QWYVBR40cE/images/fb/5d3fcd8abf0be164.png?fit=max&auto=format&n=Dgjmf3QWYVBR40cE&q=85&s=8382799543173d4a6653f5948121753b" alt="Updated title color" className="mx-auto" style={{ width:"97%" }} width="2796" height="498" data-path="images/fb/5d3fcd8abf0be164.png" />

  <img src="https://mintcdn.com/upmind/Dgjmf3QWYVBR40cE/images/fb/5d3fcd8abf0be164.png?fit=max&auto=format&n=Dgjmf3QWYVBR40cE&q=85&s=8382799543173d4a6653f5948121753b" alt="Updated title color" className="mx-auto" style={{ width:"97%" }} width="2796" height="498" data-path="images/fb/5d3fcd8abf0be164.png" />
</Frame>

* Button labels and call-to-action text. Colour can be changed on the text on the primary buttons.

`CSS` **Example**: Colour display of primary buttons.

<CodeGroup>
  ```css CSS theme={null}
  {
     --text-button-primary: #ff6363;
  }
  ```
</CodeGroup>

<Frame caption="Updated button colour">
  <img src="https://mintcdn.com/upmind/FQ1NhxALxjSHvvWW/images/fb/a82285f71d35458e.png?fit=max&auto=format&n=FQ1NhxALxjSHvvWW&q=85&s=df82f6a3eacfede477bfb4e29f2ac7e5" alt="Updated button color" className="mx-auto" style={{ width:"55%" }} width="808" height="1532" data-path="images/fb/a82285f71d35458e.png" />

  <img src="https://mintcdn.com/upmind/FQ1NhxALxjSHvvWW/images/fb/a82285f71d35458e.png?fit=max&auto=format&n=FQ1NhxALxjSHvvWW&q=85&s=df82f6a3eacfede477bfb4e29f2ac7e5" alt="Updated button color" className="mx-auto" style={{ width:"55%" }} width="808" height="1532" data-path="images/fb/a82285f71d35458e.png" />

  <img src="https://mintcdn.com/upmind/FQ1NhxALxjSHvvWW/images/fb/a82285f71d35458e.png?fit=max&auto=format&n=FQ1NhxALxjSHvvWW&q=85&s=df82f6a3eacfede477bfb4e29f2ac7e5" alt="Updated button color" className="mx-auto" style={{ width:"55%" }} width="808" height="1532" data-path="images/fb/a82285f71d35458e.png" />
</Frame>

* Empty-state messages. Colour can be changed on the text when the basket is empty.

`CSS` **Example**: Core text colour change display.

<CodeGroup>
  ```css CSS theme={null}
  {
     --color-core-display: #ed1111;
  }
  ```
</CodeGroup>

<Frame caption="Empty basket colour change">
  <img src="https://mintcdn.com/upmind/pcUdSuxUJ6LgBXnd/images/fb/a09c43d06db3c5b7.png?fit=max&auto=format&n=pcUdSuxUJ6LgBXnd&q=85&s=af0dfef53679d06770cf3cfbc2f449bf" alt="Empty basket color change" className="mx-auto" style={{ width:"80%" }} width="2006" height="1540" data-path="images/fb/a09c43d06db3c5b7.png" />

  <img src="https://mintcdn.com/upmind/pcUdSuxUJ6LgBXnd/images/fb/a09c43d06db3c5b7.png?fit=max&auto=format&n=pcUdSuxUJ6LgBXnd&q=85&s=af0dfef53679d06770cf3cfbc2f449bf" alt="Empty basket color change" className="mx-auto" style={{ width:"80%" }} width="2006" height="1540" data-path="images/fb/a09c43d06db3c5b7.png" />

  <img src="https://mintcdn.com/upmind/pcUdSuxUJ6LgBXnd/images/fb/a09c43d06db3c5b7.png?fit=max&auto=format&n=pcUdSuxUJ6LgBXnd&q=85&s=af0dfef53679d06770cf3cfbc2f449bf" alt="Empty basket color change" className="mx-auto" style={{ width:"80%" }} width="2006" height="1540" data-path="images/fb/a09c43d06db3c5b7.png" />
</Frame>

* Informational banners and notices.
* Legal text references. You can create your store's terms and conditions. For more information, follow this [guide](/setup-and-configuration/other-setup-items/how-to-create-terms-and-conditions).

`CSS` **Example**: Core colour of legal texts.

<CodeGroup>
  ```css CSS theme={null}
  {
     --color-core-base: #ed1111;
  }
  ```
</CodeGroup>

<Frame caption="Legal text colour change">
  <img src="https://mintcdn.com/upmind/ZsIo0APxdVb_gFS-/images/fb/2c048fb8eee8bc5e.png?fit=max&auto=format&n=ZsIo0APxdVb_gFS-&q=85&s=8de942a83f784c17886630ccb5715f56" alt="Legal text color change" className="mx-auto" style={{ width:"97%" }} width="2798" height="442" data-path="images/fb/2c048fb8eee8bc5e.png" />

  <img src="https://mintcdn.com/upmind/ZsIo0APxdVb_gFS-/images/fb/2c048fb8eee8bc5e.png?fit=max&auto=format&n=ZsIo0APxdVb_gFS-&q=85&s=8de942a83f784c17886630ccb5715f56" alt="Legal text color change" className="mx-auto" style={{ width:"97%" }} width="2798" height="442" data-path="images/fb/2c048fb8eee8bc5e.png" />

  <img src="https://mintcdn.com/upmind/ZsIo0APxdVb_gFS-/images/fb/2c048fb8eee8bc5e.png?fit=max&auto=format&n=ZsIo0APxdVb_gFS-&q=85&s=8de942a83f784c17886630ccb5715f56" alt="Legal text color change" className="mx-auto" style={{ width:"97%" }} width="2798" height="442" data-path="images/fb/2c048fb8eee8bc5e.png" />
</Frame>

**JSON Examples**

* Assign a custom image URL to a specific product option, displayed within the option selector. Show the specified image alongside the option label, giving customers a visual reference for each selectable product option.

`JSON` **Example**: optionImgUrl.

<CodeGroup>
  ```json JSON theme={null}
  {
  	"@data.optionImgUrl":
  }
  ```
</CodeGroup>

### 3. Visual styling and branding

Cart styling is controlled through **design tokens** rather than fixed CSS overrides. Because tokens are semantic, updating a primary colour or font updates the entire cart consistently, including complex components like summaries and modals.

You can configure:

**CSS Examples**

* Brand colours and accents.

`CSS` **Example**: Canvas colour.

<CodeGroup>
  ```css CSS theme={null}
  {
    --color-core-canvas: #a0c3ff;
  }
  ```
</CodeGroup>

<Frame caption="Updated canvas colour">
  <img src="https://mintcdn.com/upmind/h8h5zREaX7k8Y-3x/images/fb/0d95dda242b386ab.png?fit=max&auto=format&n=h8h5zREaX7k8Y-3x&q=85&s=3126b3db9d2320c2b1d96d622147a03e" alt="Updated canvas color" className="mx-auto" style={{ width:"98%" }} width="2788" height="1354" data-path="images/fb/0d95dda242b386ab.png" />

  <img src="https://mintcdn.com/upmind/h8h5zREaX7k8Y-3x/images/fb/0d95dda242b386ab.png?fit=max&auto=format&n=h8h5zREaX7k8Y-3x&q=85&s=3126b3db9d2320c2b1d96d622147a03e" alt="Updated canvas color" className="mx-auto" style={{ width:"98%" }} width="2788" height="1354" data-path="images/fb/0d95dda242b386ab.png" />

  <img src="https://mintcdn.com/upmind/h8h5zREaX7k8Y-3x/images/fb/0d95dda242b386ab.png?fit=max&auto=format&n=h8h5zREaX7k8Y-3x&q=85&s=3126b3db9d2320c2b1d96d622147a03e" alt="Updated canvas color" className="mx-auto" style={{ width:"98%" }} width="2788" height="1354" data-path="images/fb/0d95dda242b386ab.png" />
</Frame>

* Typography scale and font families. You can change the font weight for display texts. Increase for bolder headings.

`CSS` **Example**: Font weight for display text.

<CodeGroup>
  ```css CSS theme={null}
  {
    --font-display-weight: 1000;
  }
  ```
</CodeGroup>

<Frame caption="Font weight display">
  <img src="https://mintcdn.com/upmind/2ooSxDpt6PiIGMr-/images/fb/04f4be0f88b615a9.png?fit=max&auto=format&n=2ooSxDpt6PiIGMr-&q=85&s=e9afb8f58daaa9bafb02c5d0f66e6e43" alt="Font weight display" className="mx-auto" style={{ width:"94%" }} width="2798" height="792" data-path="images/fb/04f4be0f88b615a9.png" />

  <img src="https://mintcdn.com/upmind/2ooSxDpt6PiIGMr-/images/fb/04f4be0f88b615a9.png?fit=max&auto=format&n=2ooSxDpt6PiIGMr-&q=85&s=e9afb8f58daaa9bafb02c5d0f66e6e43" alt="Font weight display" className="mx-auto" style={{ width:"94%" }} width="2798" height="792" data-path="images/fb/04f4be0f88b615a9.png" />

  <img src="https://mintcdn.com/upmind/2ooSxDpt6PiIGMr-/images/fb/04f4be0f88b615a9.png?fit=max&auto=format&n=2ooSxDpt6PiIGMr-&q=85&s=e9afb8f58daaa9bafb02c5d0f66e6e43" alt="Font weight display" className="mx-auto" style={{ width:"94%" }} width="2798" height="792" data-path="images/fb/04f4be0f88b615a9.png" />
</Frame>

* Spacing and border radius.
* Button styles and variant colour values. You can change the primary button backgrounds, main CTAs, and key accent elements. Gradients can also be updated.

`CSS` **Example**: Button primary colour.

<CodeGroup>
  ```css CSS theme={null}
  {
  	--color-primary-default: #d60e0e;
  }
  ```
</CodeGroup>

<Frame caption="Primary button colour">
  <img src="https://mintcdn.com/upmind/FQ1NhxALxjSHvvWW/images/fb/b521c59db5cc93bc.png?fit=max&auto=format&n=FQ1NhxALxjSHvvWW&q=85&s=bf86e1b857a29a28bec3ddad8d67992e" alt="Primary button color" className="mx-auto" style={{ width:"55%" }} width="808" height="1526" data-path="images/fb/b521c59db5cc93bc.png" />

  <img src="https://mintcdn.com/upmind/FQ1NhxALxjSHvvWW/images/fb/b521c59db5cc93bc.png?fit=max&auto=format&n=FQ1NhxALxjSHvvWW&q=85&s=bf86e1b857a29a28bec3ddad8d67992e" alt="Primary button color" className="mx-auto" style={{ width:"55%" }} width="808" height="1526" data-path="images/fb/b521c59db5cc93bc.png" />

  <img src="https://mintcdn.com/upmind/FQ1NhxALxjSHvvWW/images/fb/b521c59db5cc93bc.png?fit=max&auto=format&n=FQ1NhxALxjSHvvWW&q=85&s=bf86e1b857a29a28bec3ddad8d67992e" alt="Primary button color" className="mx-auto" style={{ width:"55%" }} width="808" height="1526" data-path="images/fb/b521c59db5cc93bc.png" />
</Frame>

* Badges and highlight styles. Bold promotional background for discount badges.

`CSS` **Example**: Default promo colour.

<CodeGroup>
  ```css CSS theme={null}
  {
  	--color-promo-default: #43d106;
  }
  ```
</CodeGroup>

<Frame caption="Default promo colour">
  <img src="https://mintcdn.com/upmind/1xguIfYUrfespmVI/images/fb/853f97a4296ebe47.png?fit=max&auto=format&n=1xguIfYUrfespmVI&q=85&s=4a3f97c209b4ca079d1aeeea8574ab83" alt="Default promo color" className="mx-auto" style={{ width:"59%" }} width="884" height="1532" data-path="images/fb/853f97a4296ebe47.png" />

  <img src="https://mintcdn.com/upmind/1xguIfYUrfespmVI/images/fb/853f97a4296ebe47.png?fit=max&auto=format&n=1xguIfYUrfespmVI&q=85&s=4a3f97c209b4ca079d1aeeea8574ab83" alt="Default promo color" className="mx-auto" style={{ width:"59%" }} width="884" height="1532" data-path="images/fb/853f97a4296ebe47.png" />

  <img src="https://mintcdn.com/upmind/1xguIfYUrfespmVI/images/fb/853f97a4296ebe47.png?fit=max&auto=format&n=1xguIfYUrfespmVI&q=85&s=4a3f97c209b4ca079d1aeeea8574ab83" alt="Default promo color" className="mx-auto" style={{ width:"59%" }} width="884" height="1532" data-path="images/fb/853f97a4296ebe47.png" />
</Frame>

### 4. Feature visibility and behaviour

Cart features can be enabled or disabled per context. This allows a checkout flow that feels intentional rather than generic.

Examples include:

**JSON Examples**

* Showing or hiding product images. Product images in recommendations can be hidden from the customer's view. The default is `visible`.

`JSON` **Example**: productImages visibility.

<CodeGroup>
  ```json JSON theme={null}
  {
     "@context.recommendations.productImages": "hidden"
  }
  ```
</CodeGroup>

<Frame caption="Product images hidden in recommendations">
  <img src="https://mintcdn.com/upmind/z5ofg3t7by4uN44v/images/fb/ecf0dad52d778624.png?fit=max&auto=format&n=z5ofg3t7by4uN44v&q=85&s=1a01352575edeb16f3ac01ec569f36f4" alt="Product images hidden in recommendations" className="mx-auto" style={{ width:"98%" }} width="2768" height="1530" data-path="images/fb/ecf0dad52d778624.png" />

  <img src="https://mintcdn.com/upmind/z5ofg3t7by4uN44v/images/fb/ecf0dad52d778624.png?fit=max&auto=format&n=z5ofg3t7by4uN44v&q=85&s=1a01352575edeb16f3ac01ec569f36f4" alt="Product images hidden in recommendations" className="mx-auto" style={{ width:"98%" }} width="2768" height="1530" data-path="images/fb/ecf0dad52d778624.png" />

  <img src="https://mintcdn.com/upmind/z5ofg3t7by4uN44v/images/fb/ecf0dad52d778624.png?fit=max&auto=format&n=z5ofg3t7by4uN44v&q=85&s=1a01352575edeb16f3ac01ec569f36f4" alt="Product images hidden in recommendations" className="mx-auto" style={{ width:"98%" }} width="2768" height="1530" data-path="images/fb/ecf0dad52d778624.png" />
</Frame>

* Displaying or suppressing recommendations. Change the product style to `flush` and `carded`.

`JSON` **Example**: productStyle carded.

<CodeGroup>
  ```json JSON theme={null}
  {
     "@context.recommendations.productStyle": "carded"
  }
  ```
</CodeGroup>

<Frame caption="Carded product style in recommendations">
  <img src="https://mintcdn.com/upmind/wRuKrNY12tQZY8Rr/images/fb/30f28b20613f5f16.png?fit=max&auto=format&n=wRuKrNY12tQZY8Rr&q=85&s=828766a3c90761efd3cd58db1abd9d5f" alt="Carded product style in recommendations" className="mx-auto" style={{ width:"98%" }} width="2202" height="1532" data-path="images/fb/30f28b20613f5f16.png" />

  <img src="https://mintcdn.com/upmind/wRuKrNY12tQZY8Rr/images/fb/30f28b20613f5f16.png?fit=max&auto=format&n=wRuKrNY12tQZY8Rr&q=85&s=828766a3c90761efd3cd58db1abd9d5f" alt="Carded product style in recommendations" className="mx-auto" style={{ width:"98%" }} width="2202" height="1532" data-path="images/fb/30f28b20613f5f16.png" />

  <img src="https://mintcdn.com/upmind/wRuKrNY12tQZY8Rr/images/fb/30f28b20613f5f16.png?fit=max&auto=format&n=wRuKrNY12tQZY8Rr&q=85&s=828766a3c90761efd3cd58db1abd9d5f" alt="Carded product style in recommendations" className="mx-auto" style={{ width:"98%" }} width="2202" height="1532" data-path="images/fb/30f28b20613f5f16.png" />
</Frame>

* Controlling zero-price display behaviour.

`JSON` **Example**: zeroPriceDisplay value. Zero-price products will display `0.00` globally.

<CodeGroup>
  ```json JSON theme={null}
  {
    "@context.*.zeroPriceDisplay": "numeric"
  }
  ```
</CodeGroup>

<Frame caption="Zero-price display numeric">
  <img src="https://mintcdn.com/upmind/kAlrCUxI2nwYz4_i/images/fb/1a4313b37824d2cf.png?fit=max&auto=format&n=kAlrCUxI2nwYz4_i&q=85&s=886b73f2be01e799f0f851441d1448de" alt="Zero-price display numeric" className="mx-auto" style={{ width:"59%" }} width="736" height="1530" data-path="images/fb/1a4313b37824d2cf.png" />

  <img src="https://mintcdn.com/upmind/kAlrCUxI2nwYz4_i/images/fb/1a4313b37824d2cf.png?fit=max&auto=format&n=kAlrCUxI2nwYz4_i&q=85&s=886b73f2be01e799f0f851441d1448de" alt="Zero-price display numeric" className="mx-auto" style={{ width:"59%" }} width="736" height="1530" data-path="images/fb/1a4313b37824d2cf.png" />

  <img src="https://mintcdn.com/upmind/kAlrCUxI2nwYz4_i/images/fb/1a4313b37824d2cf.png?fit=max&auto=format&n=kAlrCUxI2nwYz4_i&q=85&s=886b73f2be01e799f0f851441d1448de" alt="Zero-price display numeric" className="mx-auto" style={{ width:"59%" }} width="736" height="1530" data-path="images/fb/1a4313b37824d2cf.png" />
</Frame>

## What is configurable in the Client Portal

The **Client Portal** is where customers manage services after purchase. It shares the same architectural principles as the **Cart** but focuses on account management rather than conversion.

### 1. Branding and layout

Portal customisation includes:

* Header and navigation structure.
* Brand identity and colour system.
* Page-level layout and spacing.
* Consistent typography across account views.

This ensures continuity between checkout and post-purchase experience. You can find more details on client area templates in this [guide](/setup-and-configuration/branding/how-to-create-client-area-templates).

### 2. Features

You can configure the features in the portal:

1. **Billing history and invoices**

The portal can provide full visibility into financial history, including:

* Invoice listings with filtering and search.
* Invoice downloads (PDF or hosted views).
* Payment status indicators (paid, overdue, refunded).
* Credit notes and adjustments.
* Transaction history.

This helps reduce support requests while giving customers transparency and self-service access to financial records. For more information, follow this guide on [billings](/client-self-service/client-area/how-do-my-clients-review-billings).

2. **Subscription controls**

Customers can manage recurring services directly within the portal.

Depending on your configuration, this can include:

* Changing billing cycles.
* Applying promotional codes.
* Enabling or disabling auto-renew.
* Managing upgrades and plan changes.
* Viewing next billing dates and renewal pricing.

This gives customers confidence and control over ongoing commitments. For more details on subscription control, you can follow the guide on [auto-renewals](/using-upmind/how-subscription-cancellation-works/turning-onoff-auto-renew).

3. **Payment method management**

Customers can securely manage their payment details, including:

* Adding new payment methods.
* Updating card details.
* Removing saved methods.
* Selecting a default payment method.
* Viewing stored payment methods for active subscriptions.

All payment processing continues to be handled by Upmind’s integrated gateways, ensuring compliance and security. For more details on payment methods, follow this [guide](/client-self-service/client-area/how-do-my-clients-add-a-payment-method).

4. **Profile and security settings**

The portal can also act as a customer account centre, allowing users to:

* Update contact information.
* Manage company details.
* Configure tax or VAT information. (For the tax guide, find more information [here](/using-upmind/invoicing-and-taxes/how-to-set-sales-taxes-eg-vat-gst)).
* Change passwords. (For the security guide, find more information [here](/client-self-service/client-area/how-do-my-clients-change-account-settings)).
* Manage authentication settings (including SSO, where enabled).

This centralises account management and reduces reliance on manual support intervention.

### 3. Messaging and guidance

Portal messaging follows the same i18n-driven approach as the cart. While messaging capabilities will expand over time, current customisation is limited to text overrides rather than structural changes.

Because the Portal and Cart share the same metadata and i18n foundation, messaging remains consistent across the storefront, checkout, and customer portal.
