POS printer templates define what is printed on receipts and labels at the point of sale. Templates are created in Salesforce and then selected from within the POS hardware settings.

StoreConnect supports three printer template types:

| Type | Used for |
|------|----------|
| **Receipt** | Transaction receipts, layby dockets |
| **Label** | Product labels, barcode labels |
| **Document** | PDF documents generated via jsPDF Liquid tags |

Templates also have a **context** that determines when they can be selected. Most templates have the **product** context. Cart templates are a special context described below.

## Create a printer template

Templates are created in Salesforce on the Store record.

1. Open your store in StoreConnect.
2. Go to the **Additional Relationships** tab.
3. In the **Store Printable Templates** section, select **New** or open an existing template.
4. Complete the template fields:
   - **Name** — a descriptive name you will recognize in the POS template selector
   - **Printer Type** — select **Receipt** or **Label**
   - **Type** — select **Product** for most templates
   - **Template** — enter the template code using Liquid and print markup
5. Select **Save**.

For a full receipt template example with code explanations, see [Create or update a POS receipt template](pos-receipt-template).

## Template syntax

Templates use a combination of Liquid (for dynamic data) and print markup tags (for layout and formatting).

**Print markup tags** control layout:

| Tag | Description |
|-----|-------------|
| `{document}` | Opens the document with optional settings (e.g. `word-wrap=true`) |
| `{center}` / `{left}` | Text alignment |
| `{bold}` / `{endBold}` | Bold text |
| `{line}` | Blank line |
| `{rule}` | Horizontal rule |
| `{table cols=N ...}` | Multi-column table layout |
| `{image src="..." size=N}` | Image (e.g. outlet logo) |
| `{qrcode data="..."}` | QR code |

**Liquid variables** provide transaction data. Common examples:


```liquid
{{ current_order.total | money }}
{{ current_order.contact.name }}
{{ outlet.name }}
{% for item in current_order.items %}
  {{ item.product.name }} x{{ item.quantity }}
{% endfor %}
```


## Select a template in the POS

Once a template exists in Salesforce, select it from within the POS:

1. In the POS, go to **Settings > Hardware**.
2. Select the printer type (**Receipt** or **Label**).
3. Choose the template from the list. A green tick confirms it is selected.
4. Select **Test print** to verify the output before starting a shift.

See [POS hardware setup](pos-hardware-setup) for the full hardware configuration walkthrough.

## Cart templates

Cart templates let you print the contents of the current cart before an order is placed — for example, to produce a quote or cart summary for a customer.

To use cart templates:
1. Create a printer template in Salesforce with the **context** set to **Cart** (instead of Product).
2. In the POS, go to **Settings > Printer Templates** and select the template under **Cart template**.
3. Add a **print:cart** action to a POS layout button to allow staff to print at any time.

### Liquid context for cart templates

Cart templates receive the root variable `current_cart`:

| Variable | Description |
|----------|-------------|
| `{{ current_cart.id }}` | Cart token |
| `{{ current_cart.total }}` | Calculated cart total |
| `{{ current_cart.item_count }}` | Total quantity across all items |
| `{{ current_cart.contact.name }}` | Assigned customer name (if any) |
| `{{ current_cart.items }}` | Collection of cart items |
| `{{ item.name }}` | Item name (in a `{% for item in current_cart.items %}` loop) |
| `{{ item.quantity }}` | Item quantity |
| `{{ item.data.s_c__unit_price__c }}` | Item unit price (raw field via `item.data.*`) |

:::note
Cart templates use the same printer type (Receipt, Label, or Document) as other templates. The `print:cart` action routes to whichever printer type the selected template specifies.
:::

## Label templates

Label templates follow the same structure as receipt templates but are assigned **Printer Type: Label**. Labels are typically used for product or barcode printing.

Label printing can also be triggered by a POS layout action button, allowing staff to print a label directly from a record in a custom layout. See [POS customization and design](pos-customization-and-design) for layout action configuration.

## Document templates (PDF)

Document templates generate PDFs using jsPDF. Instead of print markup tags, document templates use a set of Liquid tags that map directly to jsPDF methods. All document tags must be wrapped in a `{% pdf %}...{% endpdf %}` block.

### Structure


```liquid
{% pdf orientation: "portrait", unit: "mm", format: "a4" %}
  {% set_font "helvetica", "normal" %}
  {% set_font_size 12 %}
  {% text "Hello, world!", 20, 20 %}
{% endpdf %}
```


The `{% pdf %}` tag accepts any jsPDF constructor options as keyword arguments (`orientation`, `unit`, `format`). Only one `{% pdf %}` block is allowed per template.

### Available tags

All tags take arguments that match the corresponding [jsPDF method](https://artskydj.github.io/jsPDF/docs/jsPDF.html) signature.

**Text**

| Tag | jsPDF method |
|-----|-------------|
| `{% text %}` | `text()` |
| `{% text_with_link %}` | `textWithLink()` |
| `{% set_font %}` | `setFont()` |
| `{% set_font_size %}` | `setFontSize()` |
| `{% set_text_color %}` | `setTextColor()` |
| `{% split_text_to_size %}` | `splitTextToSize()` |

**Drawing**

| Tag | jsPDF method |
|-----|-------------|
| `{% circle %}` | `circle()` |
| `{% ellipse %}` | `ellipse()` |
| `{% line %}` | `line()` |
| `{% lines %}` | `lines()` |
| `{% rect %}` | `rect()` |
| `{% rounded_rect %}` | `roundedRect()` |
| `{% triangle %}` | `triangle()` |

**Color and style**

| Tag | jsPDF method |
|-----|-------------|
| `{% set_draw_color %}` | `setDrawColor()` |
| `{% set_fill_color %}` | `setFillColor()` |
| `{% set_line_width %}` | `setLineWidth()` |
| `{% set_line_cap %}` | `setLineCap()` |
| `{% set_line_dash %}` | `setLineDash()` |
| `{% set_line_dash_pattern %}` | `setLineDashPattern()` |
| `{% set_line_join %}` | `setLineJoin()` |
| `{% stroke %}` | `stroke()` |
| `{% fill %}` | `fill()` |
| `{% fill_stroke %}` | `fillStroke()` |
| `{% fill_even_odd %}` | `fillEvenOdd()` |

**Page**

| Tag | jsPDF method |
|-----|-------------|
| `{% add_page %}` | `addPage()` |
| `{% delete_page %}` | `deletePage()` |
| `{% set_page %}` | `setPage()` |
| `{% move_page %}` | `movePage()` |

**Image**

| Tag | jsPDF method |
|-----|-------------|
| `{% add_image %}` | `addImage()` |
| `{% add_svg_as_image %}` | `addSvgAsImage()` |

**Path**

| Tag | jsPDF method |
|-----|-------------|
| `{% path %}` | `path()` |
| `{% move_to %}` | `moveTo()` |
| `{% line_to %}` | `lineTo()` |
| `{% curve_to %}` | `curveTo()` |
| `{% clip %}` | `clip()` |
| `{% clip_even_odd %}` | `clipEvenOdd()` |
| `{% discard_path %}` | `discardPath()` |

**State**

| Tag | jsPDF method |
|-----|-------------|
| `{% save_graphics_state %}` | `saveGraphicsState()` |
| `{% restore_graphics_state %}` | `restoreGraphicsState()` |
| `{% scale %}` | `scale()` |
| `{% set_current_transformation_matrix %}` | `setCurrentTransformationMatrix()` |

**Link and annotation**

| Tag | jsPDF method |
|-----|-------------|
| `{% link %}` | `link()` |
| `{% create_annotation %}` | `createAnnotation()` |

**Document properties**

| Tag | jsPDF method |
|-----|-------------|
| `{% set_properties %}` | `setProperties()` |
| `{% set_document_properties %}` | `setDocumentProperties()` |
| `{% pdf_comment %}` | `comment()` |

## Quest Airpay TAP receipts

Quest Airpay TAP payment receipts can be printed using the `print:quest_receipt` action with the `order_sc_id` parameter. This action prints the receipt data returned by the Quest terminal and does not use a configurable template.

To customize Quest payment output on a receipt, use a standard `print:receipt` action with a custom template and access the Quest receipt data via `payment.gateway_receipt`:


```liquid
{% for payment in order.payments %}
  {% if payment.gateway_receipt %}
    {{ payment.gateway_receipt }}
  {% endif %}
{% endfor %}
```


:::note
Printer template changes made in Salesforce are reflected in the POS the next time the template list is loaded in hardware settings. No POS restart is required.
:::