{"title":"Create a POS cart print template","slug":"pos-cart-template","url":"https://support.storeconnect.com/articles/pos-cart-template","url_markdown":"https://support.storeconnect.com/articles/pos-cart-template.md","subtitle":null,"summary":"Create a cart print template to let staff print a quote or summary of the current POS cart before checkout, using Liquid and print markup.","type":"Help_Documentation","video_url":"","keywords":"cart print template, POS cart template, print cart, quote print, POS print, Liquid template, print markup, cart summary, pos-cart, print:cart action, cart template setup, thermal receipt, cart items, cart total, Pos_Action_Item, cart context, cart before checkout, layby estimate, approval document","last_modified":"2026-08-21T07:12:35+0000","body_markdown":"Cart print templates let staff print a summary of the current POS cart before an order is completed. This is useful for producing customer quotes, approval documents, or layby estimates.\n\nCart templates use the same Liquid and print markup syntax as receipt templates, but receive the current cart as their data context instead of a completed order.\n\n## Add a cart template\n\n1. Open the **StoreConnect Console**.\n2. Go to **POS Configuration** and select **POS Printer Templates**.\n3. Select **New** or open an existing template.\n4. Give the template a **Name**.\n5. In the **Printer Type** field, select **Receipt**.\n6. In the **Type** field, select **Cart**.\n7. Leave the height and width fields blank.\n8. Enter your Liquid template in the **Template** field. A sample is provided below.\n9. Select **Save**.\n\n## Sample cart template\n\n\n```liquid\n\n{%- assign qr_code_url = 'https://example.com' -%}\n{%- assign store = current_store -%}\n{%- assign logo_url = store.data.logo.thumb_url -%}\n{%- assign outlet = current_outlet -%}\n{%- assign outlet_tax_number = outlet.tax_number -%}\n{%- assign outlet_phone = outlet.phone -%}\n{%- assign outlet_address_1 = outlet.address1 -%}\n{%- assign outlet_address_2 = '' -%}\n{%- if outlet.address2 != blank -%}\n  {%- assign outlet_address_1 = outlet_address_1 | append: ', ' | append: outlet.address2 -%}\n{%- endif -%}\n{%- if outlet.city != blank -%}\n  {%- assign outlet_address_2 = outlet.city -%}\n{%- endif -%}\n{%- if outlet.state != blank -%}\n  {%- if outlet_address_2 != blank -%}\n    {%- assign outlet_address_2 = outlet_address_2 | append: ', ' | append: outlet.state -%}\n  {%- else -%}\n    {%- assign outlet_address_2 = outlet.state -%}\n  {%- endif -%}\n{%- endif -%}\n{%- if outlet.zip_code != blank -%}\n  {%- if outlet_address_2 != blank -%}\n    {%- assign outlet_address_2 = outlet_address_2 | append: ' ' | append: outlet.zip_code -%}\n  {%- else -%}\n    {%- assign outlet_address_2 = outlet.zip_code -%}\n  {%- endif -%}\n{%- endif -%}\n{%- assign date_format = '%m/%d/%Y' -%}\n{%- assign cart_notes = current_cart.data.s_c__customer_notes_long__c -%}\n{document\nword-wrap=true\n}\n{# header }\n{center}\n{%- if logo_url != blank %}\n{image\nsrc=\"{{ logo_url }}\"\nsize=40\ndither=atkinson\n}\n{%- endif %}\n{size 1}\nQUOTE\n{%- if outlet_tax_number != blank %}\nTAX#: {{ outlet_tax_number }}\n{%- endif %}\n{left}\n{rule}\n{%- if outlet_address_1 != blank or outlet_address_2 != blank or outlet_phone != blank %}\n{table\ncols=1\nmargin=1\nalign=[left]\nwidth=[*]\n{%- if outlet_address_1 != blank %}\nrow=[\"{{- outlet_address_1 -}}\"]\n{%- endif %}\n{%- if outlet_address_2 != blank %}\nrow=[\"{{- outlet_address_2 -}}\"]\n{%- endif %}\n{%- if outlet_phone != blank %}\nrow=[\"Phone: {{- outlet_phone -}}\"]\n{%- endif %}\n}\n{%- endif %}\n{rule}\n{table\ncols=2\nmargin=1\nalign=[left,right]\nwidth=[10,*]\nrow=[\"Date\",\"{{- 'now' | date: date_format -}} {{- 'now' | date: \"%l:%M:%S%p\" -}}\"]\n{%- if current_cart.contact != blank %}\nrow=[\"Customer\",\"{{- current_cart.contact.name -}}\"]\n{%- if current_cart.contact.phone != blank %}\nrow=[\"Phone\",\"{{- current_cart.contact.phone -}}\"]\n{%- endif %}\n{%- endif %}\n}\n{line}\n{# items }\n{bold}\n{table\ncols=3\nmargin=1\nalign=[left,right,right]\nwidth=[*,4,8]\nrow=[\"Item\",\"Qty\",\"Total\"]\n}\n{endBold}\n{rule}\n{%- if current_cart.items.size \u003e 0 %}\n{table\ncols=3\nmargin=1\nalign=[left,right,right]\nwidth=[*,4,8]\n{%- for item in current_cart.items %}\n{%- assign quantity = item.quantity | default: 1 -%}\n{%- assign unit_price = item.data.s_c__unit_price__c | default: 0 -%}\n{%- assign unit_discount = item.data.s_c__unit_discount__c | default: 0 -%}\n{%- assign line_total = unit_price | times: quantity | round: 2 %}\nrow=[\"{{ item.name }}\", \"{{ quantity }}\", \"{{ line_total | money }}\"]\n{%- assign saving = unit_discount | round: 2 -%}\n{%- if saving \u003e 0 %}\nrow=[\" was {{ unit_price | plus: unit_discount | money }}, saved {{ saving | money }} ea\", \"\", \"\"]\n{%- else %}\nrow=[\" {{ unit_price | money }} ea\", \"\", \"\"]\n{%- endif %}\n{%- endfor %}\n}\n{%- endif %}\n{# total }\n{center}\n{rule}\n{left}\n{size 2}\n{bold}\n{table\ncols=2\nmargin=1\nalign=[right,right]\nwidth=[*,17]\nrow=[\"TOTAL:\",\"{{ current_cart.total | money }}\"]\n}\n{endBold}\n{size 1}\n{%- if cart_notes != blank %}\n{line}\nNote:\n{{- cart_notes -}}\n{%- endif %}\n{center}\n{line}\nFind us online\n{qrcode data='{{ qr_code_url }}' level='m' model='2' size=6}\n```\n\n\n## Explanation of cart template code by section\n\n### Variable setup\n\nIdentical to the receipt template — reads store and outlet data into named variables and builds the address lines conditionally. Replace `https://example.com` with your store's URL.\n\n`cart_notes` is assigned from `current_cart.data.s_c__customer_notes_long__c` so the notes section can check it in one place.\n\n### Header\n\nDisplays the store logo, \"QUOTE\" heading, tax number (if set on the outlet), and the outlet address and phone. Layout is the same as a receipt.\n\nTo resize the logo, change the `size` value on the `{image}` block. The value is a percentage of the printable width — `40` prints the logo at 40% width, `80` at 80%, and so on.\n\n### Cart info\n\n\n```liquid\n\nrow=[\"Date\",\"{{- 'now' | date: date_format -}} {{- 'now' | date: \"%l:%M:%S%p\" -}}\"]\n```\n\n\nShows the current date and time. Customer name and phone are shown if a contact is linked to the cart.\n\nThere is no cashier or register field in the cart context.\n\n### Items table\n\n\n```liquid\n\nrow=[\"{{ item.name }}\", \"{{ quantity }}\", \"{{ line_total | money }}\"]\nrow=[\" {{ unit_price | money }} ea\", \"\", \"\"]\n```\n\n\nLoops through `current_cart.items` and prints each product with quantity and line total. A second row shows the unit price. If a discount is applied to an item, it shows the original price and saving instead.\n\nLine totals are calculated by multiplying the unit price by quantity. The cart does not provide a tax breakdown — only the overall total is available.\n\n### Total\n\n\n```liquid\n\nrow=[\"TOTAL:\",\"{{ current_cart.total | money }}\"]\n```\n\n\nShows the cart total calculated from all items. Unlike a completed order, there is no tax line or payments section in a cart context.\n\n### Notes\n\n\n```liquid\n\n{%- if cart_notes != blank %}\n{line}\nNote:\n{{- cart_notes -}}\n{%- endif %}\n```\n\n\nPrints any notes entered on the cart, only if present. Notes are accessed via `current_cart.data.s_c__customer_notes_long__c` — there is no `notes` shorthand on the cart context.\n\n### QR code\n\nSame as the receipt template. Set `qr_code_url` at the top of the template to your store's URL.\n\n## Liquid context variables\n\n| Variable | Description |\n|----------|-------------|\n| `current_cart.id` | Cart token |\n| `current_cart.items` | Collection of items in the cart |\n| `current_cart.item_count` | Total quantity across all items |\n| `current_cart.total` | Cart total (including tax) |\n| `current_cart.sub_total` | Cart subtotal (excluding tax) |\n| `current_cart.contact` | Contact assigned to the cart (may be blank) |\n| `current_cart.contact.name` | Customer name |\n| `current_cart.contact.phone` | Customer phone |\n| `current_cart.data.s_c__customer_notes_long__c` | Notes entered on the cart |\n| `current_store` | The current store |\n| `current_outlet` | The current outlet |\n\n## Add a Print Quote button to the manage cart menu\n\nThe active cart's **Manage** menu loads additional actions from an action group with the identifier `manage_cart_additional_actions`. To add a Print Quote button there:\n\n### 1. Create the action group\n\nCreate a `Pos_Action_Group__c` record with these values:\n\n| Field | Value |\n|-------|-------|\n| Name | Cart: Manage Additional Actions |\n| Identifier (`s_c__Identifier__c`) | `manage_cart_additional_actions` |\n| Type | `list` |\n| Rows | `1` |\n| Columns | `1` |\n\n:::note\nIf an action group with identifier `manage_cart_additional_actions` already exists in your org, skip this step and add the action item to the existing group.\n:::\n\n### 2. Create the action item\n\nCreate a `Pos_Action_Item__c` record inside the group:\n\n| Field | Value |\n|-------|-------|\n| Name | Print Quote |\n| Type | `action` |\n| Display Name | `Print Quote` |\n| Parent Action Group | the group created above |\n| Action (`s_c__Action__c`) | `print:cart` |\n| Params | leave blank to use the default cart template configured in POS Settings |\n\n![Print Quote button in the POS manage cart menu](https://res.cloudinary.com/hzkr6fi81/image/upload/v1781064903/media/POS_print_cart_template.png)\n\n### Using Params to override the default template\n\nThe `Params` field is only needed if you want to use a specific template instead of the default cart template configured in POS Settings. If left blank, the action uses the default.\n\nSupported parameters, separated by a semicolon if using both:\n\n- `print_template_sfid=\u003cSalesforce record ID\u003e` — use a specific template instead of the default. The value must be the 15 or 18 character Salesforce record ID of the cart print template, found in the URL when viewing the template record in Salesforce.\n- `cart_sc_id=\u003cCart SC ID\u003e` — print a specific parked cart; if omitted, prints the current active cart\n\n:::note\nThe cart must be active in POS for printing to work. If no cart is loaded and no `cart_sc_id` is provided, the action exits silently.\n:::"}