Skip to main content
These tags are reused across multiple page templates.

{% component 'component_key' %}

Renders a reusable component. Every customer sees it. The component must exist in the same project as the template. Used in: Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Other pages, Cancellation reasons, Cancellation follow-up, and Subscription profile
Manage components under Customer Portal → Components.

{% placement 'placement_key' %}

Renders the first component in a placement whose conditions match the current subscription. Placements are created in the visual editor with + Component, which also adds the tag to the page. When no component matches, the tag renders nothing outside the visual editor. Used in: Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Other pages, Cancellation reasons, Cancellation follow-up, and Subscription profile

{% workflow id: 44 %}

Loads a Workflow Builder workflow into a Liquid variable without rendering markup. The variable is available only when the workflow has a published version; in the visual editor, the current draft is available for preview. Use its configured inputs to show products or other workflow details without copying them into the template. Used in: Navigation, Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Other pages, Cancellation reasons, Cancellation follow-up, and Subscription profile

{% navbar %}

Renders the shared Navigation template (navbar.liquid). Edit its HTML, Liquid, and Tailwind classes once to style the navigation on every page that uses this tag. Used in: Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Subscription profile, Other pages, Cancellation reasons, and Cancellation follow-up
Standard Customer Portal V2 page templates continue to use {% legacy_navbar %}. To opt into the shared navigation, replace that tag with {% navbar %} on each page where you want to use it. The legacy tag remains supported. The new tag takes no parameters; configure the navigation in navbar.liquid. The default has a light background, merchant branding, an active-page underline, and an account menu with logout. On mobile, the page links sit below the brand and account controls; a back link appears when the page provides one. It does not include an invoices link. To add one, include an anchor using navigation.invoices_url in the Navigation template. On the subscription selection page, navigation shows merchant branding, support when enabled, and logout. It hides subscription-specific links and the account menu. On small screens, support and logout sit below the branding. Translate label keys with | t and escape dynamic HTML attributes with | escape. Navigation has its own versions, translations, and publishing controls. Portal previews use the selected navbar version; live pages use its published content. The Navigation template cannot contain {% navbar %}, {% component %}, or {% placement %}.

{% logout_button %}

Renders a logout button with the form, DELETE method, and CSRF protection handled by Firmhouse. The label and confirmation message use the portal’s translations by default. Used in: Navigation, Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Subscription profile, Other pages, Cancellation reasons, and Cancellation follow-up

{% legacy_navbar %}

Shared top navigation. Used in: Navigation, Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Subscription profile, Other pages, Cancellation reasons, and Cancellation follow-up
The invoices overview is hidden by default. Set show_invoices to include it in the navigation:

{% shopify_storefront_access_token %}

Outputs the project’s Shopify Storefront API public access token. Use this to make client-side requests to the Shopify Storefront GraphQL API, for example to fetch product data or build custom product browsing experiences. Returns an empty string when the Shopify subscriptions app is not configured for the project. The token is cached for 1 hour to avoid repeated Shopify Admin API calls. Used in: Navigation, Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Subscription profile, Other pages, Cancellation reasons, Cancellation follow-up, and Shared head

{% shopify_store_domain %}

Outputs the Shopify store domain (for example my-store.myshopify.com) configured for the Shopify app. Use this to build Shopify Storefront API endpoints or other store-specific URLs directly in your templates. Returns an empty string when the Shopify app is not configured for the project. Used in: Navigation, Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Subscription profile, Other pages, Cancellation reasons, Cancellation follow-up, and Shared head

{% slide_out_pane %} ... {% endslide_out_pane %}

Reusable slide-out pane for custom overlays across Customer Portal templates. Used in: Navigation, Dashboard, Orders, Order details, Catalog, Offer, Offer confirmation, Subscription profile, Other pages, Cancellation reasons, and Cancellation follow-up
Manual API (no custom events required):
  • pane_id maps to the pane DOM id.
  • If omitted in API calls, the first registered slide-out pane is used.

{% subscription_files %}

Lists files attached to the subscription that are visible to the customer. The component renders nothing when there are no customer-visible files. Used in: Dashboard and Subscription profile This component has no parameters.

Translation Filter: | t

Use | t to translate strings from the self_service_center i18n namespace.
  • Keys are resolved under self_service_center (for example, dashboard.cancel_subscription maps to self_service_center.dashboard.cancel_subscription).
  • locale is optional; when omitted, the current request locale is used.
  • default is optional; when present, it is used as fallback for missing translations.
  • If a translation key is missing and no default is provided, the original key string is returned.
  • If required interpolation data is missing, the filter returns the original key with the missing argument name (for example, churn_requests.skip_next_order.skip_orders (missing interpolation: count)).
Interpolation requirement example: