dashboard.liquid tags are grouped by default vs optional usage.
- Default components are already present in the shipped
dashboard.liquidtemplate. - Optional components can be added or used to replace parts of the default layout.
{% legacy_navbar %}.
Default components
{% simple_next_billing_date_with_confirm %}
Inline editable next billing date control.
| Parameter | Type | Default |
|---|---|---|
show_label | Boolean | false |
{% simple_plan_switch_with_confirm %}
Inline plan switch select with confirmation modal.
| Parameter | Type | Default |
|---|---|---|
label_format | String ("frequency", "plan_name", "both") | "frequency" |
label_format: "both" combines plan name and frequency:
{% manage_products %}
Primary CTA to manage existing products.
| Parameter | Type | Default |
|---|---|---|
size | String ("small"/"large") | "small" |
button_text | String | "Manage products" |
{% product_quantity_progress %}
Progress and status widget for plan-based product quantity rules.
This component only renders when the active plan has a minimum and/or maximum product quantity configured.The default
dashboard.liquid already includes this tag, and you can move or add it elsewhere in the template.
| Parameter | Type | Default |
|---|---|---|
rail_background_color | String (CSS color) | #E5E7EB |
rail_fill_color | String (CSS color) | nil (auto based on state) |
ready_fill_color | String (CSS color) | #16A34A |
pending_fill_color | String (CSS color) | #F59E0B |
over_limit_fill_color | String (CSS color) | #EF4444 |
{% product_listing %}
Main list of active ordered products.
| Parameter | Type | Default |
|---|---|---|
show_delete_button | Boolean | true |
show_quantity_selector | Boolean | true |
show_swap_button | Boolean | true |
{% next_order_price_overview %}
Core upcoming-order summary card.
| Parameter | Type | Default |
|---|---|---|
items | String or Array | recurring_subtotal,one_time_subtotal,discount,shipping,total |
show_discount_code_entry | Boolean | true |
{% add_product %}
Secondary CTA to browse catalog and add products.
| Parameter | Type | Default |
|---|---|---|
size | String ("small"/"large") | "large" |
button_text | String | "Add product" (size: "large"), "Add products" (size: "small") |
Optional components
{% latest_orders %}
Recent orders list.
| Parameter | Type | Default |
|---|---|---|
limit | Number | 3 |
{% next_order_preview %}
Upcoming order preview card.
{% product_listing_filtered %}
Filtered product list card (for segmented subscriptions).
| Parameter | Type | Default |
|---|---|---|
filter_by | String | nil |
filter_value | String | nil |
title | String | nil |
show_add_button | Boolean | false |
add_button_text | String | nil |
show_manage_button | Boolean | false |
manage_button_text | String | nil |
show_delete_button | Boolean | true |
show_quantity_selector | Boolean | true |
show_swap_button | Boolean | true |
Dynamic groups based on ordered product metadata
If yourfilter_value should adapt to subscriber-specific metadata (for example names like "Veronika" or "Michiel"), you can build the group list from subscription.ordered_products and then render product_listing_filtered in a loop.
How are dynamic values fetched?
You can do this directly indashboard.liquid; no custom backend endpoint is required.
subscription.ordered_productsis available in SSCv2 Liquid context.- Each
ordered_productincludesmetadata. - Reading
ordered_product.metadata.groupgives the current subscription’s group value for that ordered product (or useordered_product.metadata.personif your project still uses the legacy key). - Pass
filter_bywith the same metadata key (grouporperson) that produced the value. - Looping over ordered products lets you discover all group values present on the active subscription at render time.
- hardcoded sections stay explicit (
Add-ons,Gifts,One-time extras) - dynamic sections include only metadata values currently present on the subscription
- hardcoded values are excluded from the dynamic loop
- exclusions and de-duplication are done case-insensitively (
downcase)
ordered_product.metadata.group (and optional ordered_product.metadata.person fallback) with your key and pass that same key to filter_by.
{% next_shipment_date %}
Localized next shipment date text.
{% minimum_contract_duration %}
Commitment/contract duration block.
| Parameter | Type | Default |
|---|---|---|
variant | String ("full", "label", "date") | "full" |