# POS actions reference

Source: https://support.storeconnect.com/articles/pos-actions-reference · Last modified 21 August 2026

## Overview

POS actions are named operations that control the behavior of the StoreConnect POS — adding items to the cart, navigating screens, printing receipts, and more. Every button in the POS UI corresponds to an action.

Actions can be triggered in three ways:

- **Action items** — Salesforce records (POS Action Items) assigned to action groups. Configured through the StoreConnect console.
- **`scAction()` JavaScript function** — a global function available in custom views and Liquid templates rendered by the POS.
- **Liquid `{% action %}` tag** — triggers an action inline within a Liquid template.

## Triggering actions

### Via action items

Action items are configured in Salesforce under POS Action Groups. Set the **Action** field to the action identifier and the **Params** field to a semicolon- or ampersand-separated key-value string.

### Via scAction()

The `scAction()` function is available globally within the POS browser context:

```javascript

scAction(action, params)
```

| Argument | Type | Required | Description |
|----------|------|----------|-------------|
| `action` | String | Yes | Action identifier (e.g. `'cart:add_product'`) |
| `params` | Object | No | Key-value pairs of action parameters |

**Example:**

```javascript

scAction('cart:add_product', { product_code: 'SKU123', quantity: 2 })

scAction('cart:discount', { discount_type: 'percentage', discount_amount: 10 })
```

### Via Liquid templates

Use Liquid to pass context variables from the current record into action parameters:


```html

<button onclick="scAction('print:receipt', { order_sc_id: '{{ record.id }}' })">
  Print receipt
</button>
```


## Parameter format

Parameters in the **Params** field of a POS Action Item can use semicolons or ampersands as separators:

```
product_code=SKU123&quantity=2&unit_discount=5
product_code=SKU123;quantity=2;unit_discount=5
```

Liquid template variables are resolved before the action runs:


```
order_sc_id={{ record.id }};print_template_sfid=a2cMn00003s4X88IAE
```


## Action chaining

An action item can have a **Next Action Item** configured. When the first action completes, the next action runs automatically. Some actions pass context to the next action — for example, `cart:add_product` passes `{{ cart_item_sc_id }}` so a follow-up action can reference the newly added item.

---

## Cart actions

### cart:add_product

Adds a product to the current cart.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `product_id` | String | No* | Product Salesforce ID |
| `product_code` | String | No* | Product code (alternative to `product_id`) |
| `quantity` | Number | No | Quantity to add (default: 1) |
| `unit_price` | Number | No | Override unit price. Locks the price — prevents repricing if the customer changes. |
| `unit_discount` | Number | No | Apply a unit discount |
| `name` | String | No | Override the product name on the cart item |
| `serial_numbers` | String | No | Comma-separated serial numbers |
| `pending` | Boolean | No | Mark the item as pending (default: false) |
| `pay_now` | String | No | Deposit mode: `"all"`, `"none"`, a dollar amount, or `"N%"` |

*Either `product_id` or `product_code` is required.

If the product has variants, variable pricing, is a rental, or uses voucher assets, the product selection modal opens before the item is added.

**Next action context:**

```
product_id        — product Salesforce ID
cart_item_sc_id   — SC ID of the new cart item
```

**Example:**

```
product_code=SKU123&quantity=2&pay_now=50%
```

---

### cart:item:update

Updates an existing cart item. Can change quantity, price, discount, name, serial numbers, pending status, or swap the product entirely.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `cart_item_sc_id` | String | Yes | SC ID of the cart item to update |
| `quantity` | Number | No | New quantity (must be ≥ 1) |
| `unit_price` | Number | No | New unit price (non-negative) |
| `unit_discount` | Number | No | New unit discount (non-negative) |
| `name` | String | No | Override display name |
| `serial_numbers` | String | No | Comma-separated serial numbers |
| `pending` | Boolean | No | Set pending status (`"true"` or `"false"`) |
| `product_id` | String | No† | Product Salesforce ID to swap to |
| `product_code` | String | No† | Product code to swap to |
| `pay_now` | String | No | Deposit mode: `"all"`, `"none"`, a dollar amount, or `"N%"` |

†For product swapping, provide exactly one of `product_id` or `product_code`. Cannot swap to rental products, products with variants, or asset-backed vouchers. If the item is linked to a fulfillment, that fulfillment is flagged for reconfirmation.

**Example (swap product from a layout record):**


```
cart_item_sc_id={{ record.id }};product_id=01tXXXXXXXXXXXXXXX
```


---

### cart:item:remove

Removes a cart item. Cleans up any associated rental asset holds and fulfillments.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `cart_item_sc_id` | String | Yes | SC ID of the cart item to remove |

---

### cart:add_contact

Assigns a customer to the current cart.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `contact_sc_id` | String | Yes | SC ID of the contact to assign |

---

### cart:remove_contact

Removes the customer from the current cart. Takes no parameters.

---

### cart:discount

Applies a cart-wide discount, distributed across eligible items.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `discount_amount` | Number | Yes | Discount value |
| `discount_type` | String | Yes | `"amount"` or `"percentage"` (legacy: `"dollar"` or `"percent"`) |

Discounts that exceed the user's permitted maximum or the product minimum sell price rules are rejected with an alert.

**Example:**

```
discount_amount=15;discount_type=percentage
```

---

### cart:deposit:set

Sets pay-now deposit amounts across all items in the current cart.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pay_now` | String | Yes | `"all"`, `"none"`, a dollar amount (e.g. `"50"`), or a percentage (e.g. `"25%"`) |

| Value | Effect |
|-------|--------|
| `"all"` | Pay full price on all items |
| `"none"` | Pay nothing now on all items |
| `"25%"` | Each item's deposit is 25% of its discounted unit price |
| `"50"` | Distributes $50 proportionally across all items |

Individual product minimum deposit rules are respected.

---

### cart:resume

Resumes a previously saved (parked) cart. If the cart is already linked to an existing order, an alert is shown and the cart cannot be resumed.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `cart_sc_id` | String | Yes | SC ID of the cart to resume |

---

### cart:toggle

Toggles the cart panel open or closed. If the POS is not on the home screen, navigates home first, then opens the cart. Takes no parameters.

---

### cart:item:cancel

Cancels a cart item on a cart linked to an open order. Sets the item's quantity to 0, which mirrors to the linked order line and stamps it cancelled for the audit trail. Cancelled items remain visible (muted/struck-through) but contribute zero to totals; restoring the quantity reverses the cancellation.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `cart_item_sc_id` | String | Yes | SC ID of the cart item to cancel |

---

### cart:new

Parks the current cart and makes a fresh empty cart active. Does not create or touch any order record. To start a cart linked to a new open order, use `cart:new:open_order`. Takes no parameters.

---

### checkout:start

Starts checkout from a cart, mimicking a click of the cart's "Pay" button. Runs the same validation the Pay button uses (empty cart, pending/expired items, customer-required rules, discount limits, etc.) and shows an explanatory alert without navigating if a check fails. When nothing is owed (a pure refund or fully-deposited cart), it creates the order immediately and navigates to the order record instead of the payment screen.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | No | Salesforce ID of an existing order to check out (additional payment or refund capture). Takes precedence over `cart_sc_id`. |
| `cart_sc_id` | String | No | Salesforce ID of the cart to check out. Defaults to the active cart; if different, that cart is resumed first. |

---

## Order actions

### order:return

Processes a return for an existing order. Loads returnable items into the cart as refund lines and navigates to the home screen.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | Salesforce ID of the order to return |
| `order_item_sc_ids` | String | No | Comma-separated order item Salesforce IDs to return. Omit to return all returnable items. |
| `quantities` | String | No | Comma-separated quantities per item (parallel to `order_item_sc_ids`). Defaults to full remaining quantity. |
| `amounts` | String | No | Comma-separated amounts per item — `"N%"` or a dollar value. |
| `new_cart` | String | No | `"true"` to park the current cart and start fresh |

Items with pending fulfillments or zero remaining quantity are skipped automatically.

**Example (return specific items at partial amounts):**

```
order_sc_id=abc-123;order_item_sc_ids=id1,id2;quantities=1,3;amounts=100%,50%
```

---

## Open order actions

Open orders are editable Order records (`s_c__pos_order_type__c = "OPEN"`) linked to a cart, used outside the standard checkout flow (for example, hospitality tabs). **These actions require the store variable `pos.open_orders.enabled` to be set.** All of them work offline — changes are enqueued and sync to Salesforce on reconnect.

### cart:new:open_order

Creates a new open order. If the current cart is empty, the order is linked to it; otherwise the current cart is parked and the order is linked to a fresh cart. The order is created as a shell (no payments or fulfillments).

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | String | No | Short note saved on the order (max 80 characters); shown as a banner on the cart |

---

### cart:update:open_order

Converts the current active cart into a new open order and links it, preserving the cart's items and customer. Errors if the cart is already linked to an order — use `open_order:update` to edit a linked order instead.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | String | No | Short note saved on the order (max 80 characters) |

---

### open_order:submit

Commits the active cart to its linked open order (the hospitality "submit to the kitchen" action). Reprices and transmits the full order as an idempotent upsert keyed on each line's `sc_id`, splits multi-quantity lines into individual units, and creates fulfillments for newly-submitted lines. Commit only — it does not clear the cart (pair with `cart:new` for a "Submit & clear" button). Requires the active cart to be linked to an open order. Takes no parameters.

---

### open_order:update

Edits the memo of the open order already linked to the active cart (saves immediately). Only the memo can be changed this way.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | String | No | New memo (max 80 characters). Omit the parameter entirely to no-op; pass a blank value to clear the memo. |

---

### order:cancel

Cancels an open order so it no longer appears in the Open Orders list. If the cancelled order is the one currently loaded in the cart, a fresh cart is started automatically.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the open order to cancel |

---

### order:resume

Resumes an open order for continued editing by making its linked cart the active cart (the previously active cart is parked, not discarded). Does not navigate — the caller is responsible for navigation.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the open order to resume |

---

## Navigation actions

Navigation actions change the active screen. They do not take effect if the POS is in a state that prevents navigation (e.g. an active modal blocking the UI).

### Screen navigation

| Action | Description |
|--------|-------------|
| `nav:home` | Navigate to the home screen |
| `nav:checkout` | Navigate to the checkout screen |
| `nav:authentication` | Navigate to the authentication screen |
| `nav:register` | Navigate to the register selector |
| `nav:settings` | Navigate to settings |
| `nav:labels` | Navigate to the barcode label printing interface |

### List views

| Action | Description |
|--------|-------------|
| `nav:customers` | Navigate to the customers list |
| `nav:products` | Navigate to the products list |
| `nav:orders` | Navigate to the orders list |
| `nav:carts` | Navigate to the carts list |
| `nav:fulfillments` | Navigate to the fulfillments list |
| `nav:suppliers` | Navigate to the suppliers list |
| `nav:stock_adjustments` | Navigate to stock adjustments |
| `nav:stock_requests` | Navigate to stock requests |

### Record views

| Action | Parameters | Description |
|--------|------------|-------------|
| `nav:customers:record` | `customer_id` | View a customer record |
| `nav:customers:create` | — | Open the customer creation form |
| `nav:customers:update` | `customer_id` | Open the customer edit form |
| `nav:orders:record` | `order_id` | View an order record |
| `nav:carts:record` | `cart_id` | View a cart record |
| `nav:products:record` | `product_id` | View a product record |

### Fulfillment and station views

| Action | Parameters | Description |
|--------|------------|-------------|
| `nav:fulfillments:record` | `fulfillment_id` | View a fulfillment record |
| `nav:fulfillment_stations` | `register_id` (optional) | Navigate to the fulfillment stations overview |
| `nav:fulfillment_stations:record` | `station_id` | View a fulfillment station record |
| `nav:station_fulfillments` | `station_id`, optional `view`, `statuses`, `sort` | Open a station's ticket workspace |
| `nav:outlet_stations` | — | Navigate to the outlet stations screen |

Each action above has an `open:*` counterpart (e.g. `open:station_fulfillments`) that opens the same target as a pushed sub-page — see [Open actions](#open-actions). For `nav:station_fulfillments`: `view` is `grid` (default), `rail`, `double-rail`, `flex-grid`, `rows`, or `list`; `statuses` is a comma-separated subset of `requested`, `preparing`, `ready_for_pickup`, `complete` (default `requested,ready_for_pickup`); `sort` is `field:direction` where `field` is `updated` or `status` (default `status:asc`).

### Custom layouts and views

| Action | Parameters | Description |
|--------|------------|-------------|
| `nav:layout` | `layout` or `layout_sc_id`, optional `record_id` | Navigate to a custom POS layout |
| `nav:view` | `view` or `view_sc_id`, optional `record_id`, `object_name` | Navigate to a custom POS view |

### Session management

| Action | Parameters | Description |
|--------|------------|-------------|
| `nav:session_end` | — | End the current shift |
| `nav:session_add_user` | — | Add a user to the session |
| `nav:session_start_user` | `user_id` | Start session for a specific user |
| `nav:session_start_balance` | `user_id`, `amount` | Start session with an opening balance |
| `nav:disconnect_register` | — | Navigate to the register disconnection screen |

---

## Open actions

Open actions display a standalone full-screen page, separate from the main POS navigation stack.

| Action | Parameters | Description |
|--------|------------|-------------|
| `open:customers:create` | — | Open the customer creation form as a standalone page. Does not assign the customer to the cart. |
| `open:customers:record` | `customer_id` (required) | Open a customer record as a standalone page |
| `open:customers:update` | `customer_id` (required) | Open the customer edit form as a standalone page |
| `open:orders:record` | `order_id` | Open an order record as a standalone page |
| `open:fulfillments:record` | `fulfillment_id` | Open a fulfillment record as a standalone page |
| `open:fulfillment_stations` | `register_id` (optional) | Open the fulfillment stations overview as a standalone page |
| `open:fulfillment_stations:record` | `station_id` | Open a fulfillment station record as a standalone page |
| `open:station_fulfillments` | `station_id`, optional `view`, `statuses`, `sort` | Open a station's ticket workspace as a standalone page |
| `open:outlet_stations` | — | Open the outlet stations screen as a standalone page |
| `open:layout` | `layout` or `layout_sc_id`, optional `record_id` | Open a custom POS layout as a standalone page |
| `open:view` | `view` or `view_sc_id`, optional `record_id`, `object_name` | Open a custom POS view as a standalone page |

---

## Modal actions

### modal:close

Closes the topmost modal. Takes no parameters.

---

### modal:open

**Deprecated.** A generic modal opener that dispatches to a specific modal action based on the parameters supplied (`url` → `modal:open:url`, `layout_identifier` → `modal:open:layout`, `alert` → `modal:open:alert`, otherwise `modal:open:view`). Use the specific `modal:open:*` action instead.

---

### modal:open:alert

Opens an alert modal.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `alert` | String | Yes | Alert content or identifier |

---

### modal:open:email_receipt

Opens a modal to send an email receipt for an order. Pre-fills the recipient address with the contact's email if available.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the order |

---

### modal:open:pay_by_link

Opens a modal to email a payment link for an order with an outstanding balance. Includes a QR code option for a scannable payment link.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the order |

---

### modal:open:return

Opens an interactive return modal for an order, allowing the user to select items and quantities before processing.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the order |

---

### modal:open:url

Opens a modal displaying a custom URL. Liquid context variables are resolved before the URL is rendered.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `url` | String | Yes | URL to load in the modal |

---

### modal:open:view

Opens a custom POS view inside a modal. Additional parameters are merged into the Liquid context for the view.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `view_identifier` | String | Yes | Identifier of the view to display |
| *(additional)* | * | No | Any extra parameters become Liquid context variables |

---

### modal:open:layout

Opens a custom POS layout inside a modal. Context from the action chain is available to the layout's Liquid templates.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `layout_identifier` | String | Yes | Identifier of the layout to display |

---

### modal:open:action_group

Opens a POS Action Group as a modal drill-in grid, rendering the group's action items.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `group_id` | String | Yes | Salesforce ID of the Action Group to render |
| `name` | String | No | Header label for the modal (defaults to the group's name) |

---

### modal:open:cancel_order_confirm

Opens a confirmation modal for cancelling an open order. On confirm, dispatches `order:cancel`; the modal stays open on failure so the user can retry.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the open order to cancel |

---

### modal:open:new_open_order

Opens a confirmation modal for creating a new open order, with an optional memo input. On confirm, dispatches `cart:new:open_order` with the entered memo.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | String | No | Pre-fills the modal's memo input (max 80 characters) |

---

### modal:open:station_ticket

Opens a station ticket in a modal, looked up from the live sync stream.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `fulfillment_id` | String | Yes | SC ID of the fulfillment/ticket to display |
| `select_mode` | Boolean | No | `"true"` to open in the line-selection view |
| `select_order_item_id` | String | No | Order item to preselect (used with `select_mode`) |

---

## Station actions

Actions for managing fulfillment stations and their tickets. The `*:confirm` and `*:picker` variants open a modal to gather input before performing the operation. Most take an optional `station_name` used only for the confirmation message or snackbar.

### station:activate

Sets a fulfillment station's status back to active (restored).

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station to activate |
| `station_name` | String | No | Display name used in the confirmation message |

---

### station:activate:confirm

Opens a confirmation modal for activating a station. On confirm, dispatches `station:activate`.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station |
| `station_name` | String | No | Display name shown in the modal |

---

### station:degrade

Sets a fulfillment station's status to degraded.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station to degrade |
| `station_name` | String | No | Display name used in the confirmation message |

---

### station:degrade:confirm

Opens a confirmation modal for degrading a station. On confirm, dispatches `station:degrade`.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station |
| `station_name` | String | No | Display name shown in the modal |
| `fallback_station_name` | String | No | Name of the fallback station shown in the modal |

---

### station:cover

Starts covering a station from the active register. Shows a confirmation snackbar.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station to cover |
| `station_name` | String | No | Display name shown in the snackbar |

---

### station:cover:picker

Opens the picker modal for choosing stations to cover. Takes no parameters.

---

### station:cover:confirm

Opens a confirmation modal for covering a station. On confirm, starts covering it.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station |
| `station_name` | String | No | Display name shown in the modal |

---

### station:stop-cover

Stops covering a station from the active register. Shows a confirmation snackbar.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station to stop covering |
| `station_name` | String | No | Display name shown in the snackbar |

---

### station:move

Bulk-moves the given fulfillments (tickets) to another station.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | No | SC ID of the source station |
| `destination_station_id` | String | Yes | SC ID of the destination station |
| `destination_name` | String | Yes | Destination display name (shown in the confirmation alert) |
| `fulfillment_ids` | String | Yes | Comma-separated fulfillment SC IDs to move |

---

### station:move:picker

Opens the bulk-move picker modal. Three entry modes: with `station_id` + `fulfillment_ids`, jumps straight to the destination picker; with `station_id` only, opens at ticket selection; with `station_ids` (comma-separated), opens at the source picker.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | No | Source station to lock |
| `fulfillment_ids` | String | No | Comma-separated fulfillment SC IDs to pre-select |
| `station_ids` | String | No | Comma-separated station SC IDs to offer as sources |
| `station_name` | String | No | Display name shown in the modal |

---

### station:assign-register

Assigns a fulfillment station to a register, or unassigns it when `register_id` is blank. The change is queued as an unsaved change against the station record, so it works offline. The previous register stops auto-printing for the station as soon as the change syncs, and the new register picks up the station's pending tickets once it is online with a fulfillment printer. Shows a confirmation snackbar.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station to reassign |
| `register_id` | String | No | SC ID of the register to assign. Leave blank to unassign the station. |
| `station_name` | String | No | Display name shown in the snackbar (defaults to "Station") |
| `register_name` | String | No | Register name shown in the snackbar (defaults to "register") |

---

### station:assign-register:picker

Opens the register-assignment picker modal. Three entry modes: with `station_id`, opens straight at register selection for that station; without `station_id`, opens at a station-picker first step; with `intent` set to `unassign`, opens straight at the unassign confirmation. On confirm, dispatches `station:assign-register`.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | No | SC ID of the station to assign |
| `station_name` | String | No | Display name shown in the modal |
| `current_register_id` | String | No | SC ID of the station's current register, used to preselect it |
| `intent` | String | No | `unassign` to open at the unassign confirmation step |

---

### station:auto-print:on

Turns on auto-printing of new tickets for a station the active register is covering. Tickets already held for the station count as historical and are not printed; only tickets created after the switch-on point print automatically. Shows a snackbar when `station_name` is supplied.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station |
| `station_name` | String | No | Display name shown in the snackbar. Omit to suppress the snackbar. |

---

### station:auto-print:off

Turns off auto-printing of new tickets for a covered station. Shows a snackbar when `station_name` is supplied.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station |
| `station_name` | String | No | Display name shown in the snackbar. Omit to suppress the snackbar. |

---

### station:printer:picker

Opens the printer picker modal for a station.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `station_id` | String | Yes | SC ID of the station |
| `station_name` | String | No | Display name shown in the modal |

---

### station:reprint

Reprints a station ticket using the same print-and-mark pipeline as auto-print. Requires a connected register.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `fulfillment_id` | String | Yes | SC ID of the ticket (fulfillment) to reprint |

---

## Print actions

All print actions require a printer to be connected and configured in POS settings. Errors are displayed as alerts if the template or printer cannot be resolved.

### print:receipt

Prints an order receipt using the configured receipt template, or an override template.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the order |
| `print_template_sfid` | String | No | Salesforce ID of a receipt-context print template to use instead of the settings template |

---

### print:cart

Prints the current cart contents using the configured cart template, or an override template.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `cart_sc_id` | String | No | SC ID of the cart to print. Defaults to the active cart. |
| `print_template_sfid` | String | No | Salesforce ID of a cart-context print template to use instead of the settings template |

---

### print:labels

Prints product labels using the configured label template, or an override template.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `product_sfids` | String | Yes | Comma-separated list of product Salesforce IDs |
| `quantity` | Number | No | Labels to print per product (default: 1) |
| `print_template_sfid` | String | No | Salesforce ID of a label-context print template to use instead of the settings template |

**Example (from a product layout record):**


```
product_sfids={{ record.sfid }};quantity=2
```


---

### print:quest_receipt

Prints the Quest Airpay TAP transaction receipt for an order. Uses a hardcoded template. For a customized receipt, use `print:receipt` with a custom template that accesses `payment.gateway_receipt`.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `order_sc_id` | String | Yes | SC ID of the order |

---

### print:template

Prints using any print template directly, regardless of context type. Additional parameters are passed as Liquid context to the template. Supports all printer types — thermal receipt, PDF document, and label.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `print_template_sfid` | String | Yes | Salesforce ID of the print template to use |
| *(additional)* | * | No | Any extra parameters become Liquid context variables in the template |

**Example:**


```
print_template_sfid=a1b2c3d4e5f6g7h8;order_id={{ record.id }}
```


---

## Sync actions

### sync

Performs an incremental sync, downloading only records that have changed since the last sync. Does nothing if a sync is already in progress. Takes no parameters.

---

### sync:full

Performs a full re-sync, re-downloading all data. Can optionally target a single object.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `object` | String | No | Object to re-sync. Accepts Salesforce API names (e.g. `product2`, `s_c__cart__c`) or legacy aliases: `orders`, `stores`, `fulfillments`. Omit to re-sync everything. |

---

### sync:pause

Pauses syncing for all objects currently syncing. In-progress page requests complete before stopping. The paused state persists across page reloads. Takes no parameters.

---

### sync:resume

Resumes syncing for paused objects and re-syncs them immediately.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `object` | String | No | Object to resume. Accepts the same values as `sync:full`. Omit to resume all paused objects. |

---

### sync:clear

Deletes local records then re-downloads them from Salesforce. Unlike `sync:full` (which only resets the cursor), `sync:clear` removes the local rows first, so stale records no longer in scope are cleared out. Certain records the running app still needs are preserved (current outlet, register, shift, user, the active price book, and any orders not yet pushed). A confirmation modal is shown before executing.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `object` | String | No | Object to clear. Accepts a sync object API name (e.g. `product2`, `s_c__cart__c`) or a legacy alias (`orders`, `stores`, `fulfillments`). Omit to clear every table. |

---

## Record actions

These actions create, update, or delete records in the POS local database (IndexedDB). The target table must use `s_c__sc_id__c` as its primary key.

### record:save

Creates or updates a record. An SC ID is auto-generated if not provided.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `object_name` | String | Yes | API name of the object/table |
| *(additional)* | * | No | Any extra parameters become field values on the record |

---

### record:delete

Deletes a record from a local database table.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `object_name` | String | Yes | API name of the object/table |
| `record_sc_id` | String | Yes | SC ID of the record to delete |

---

## System actions

### lock

Locks the POS to the session screen, requiring users to re-authenticate before continuing. Takes no parameters.

---

### close

Closes the current view or modal by popping it from the page stack. If the closed entry is a non-modal page with a modal behind it, both are closed. Takes no parameters.

---

### cash_drawer:open

Sends an open command to the connected cash drawer via the receipt printer integration. Takes no parameters.

---

### printer:remove

Removes a paired printer from POS settings.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `printer_id` | String | Yes | ID of the printer to remove |

---

## Unsaved changes actions

Actions for managing the local persistence queue of unsaved changes (**Settings → Advanced → Manage data → Unsaved changes**). Retrying is disabled while offline.

### unsaved_changes:retry

Resets a single unsaved change to `pending` and re-sends it immediately rather than waiting for the next automatic retry.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `change_id` | String | Yes | The `changeId` of the unsaved change to retry |

---

### unsaved_changes:retry_all

Resets every non-succeeding unsaved change (stalled, exhausted, invalid) to `pending` and re-sends them all immediately. Blocked changes are left alone — they clear on their own once the change they depend on succeeds. Takes no parameters.

---

### unsaved_changes:discard

Discards a single unsaved change, removing it from the queue so it is never sent. The optimistic local value is not reverted — it remains until the next server sync overwrites that record.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `change_id` | String | Yes | The `changeId` of the unsaved change to discard |

---

## Follow StoreConnect

- [Email Newsletter](https://getstoreconnect.com/c/lp-newsletter)
- [LinkedIn Newsletter](https://www.linkedin.com/build-relation/newsletter-follow?entityUrn=7444956928444862464)
- [YouTube](https://www.youtube.com/channel/UCngKdP2x8l1wcbAKW3tvU8g)
- [LinkedIn](https://www.linkedin.com/company/storeconnect)
- [X / Twitter](https://x.com/storeconnecthq)

## Popular Links

- [Partners](https://getstoreconnect.com/partners)
- [News](https://getstoreconnect.com/articles/news)
- [Events](https://getstoreconnect.com/articles/events)
- [Feature Comparison](https://getstoreconnect.com/how-we-compare)
- [Download a free trial](https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000FMkeKUAT)
- [Book a Demo](https://getstoreconnect.com/contact)

## Documentation

- [Help documentation](https://support.storeconnect.com/help-documentation)
- [AI agents](https://support.storeconnect.com/ai)
- [Videos & tutorials](https://support.storeconnect.com/videos-tutorials)
- [Developer reference](https://support.storeconnect.com/developer-reference)
- [Release notes](https://support.storeconnect.com/release-notes)
- [Troubleshooting](https://support.storeconnect.com/troubleshooting)
- [Trust Center](https://trust.getstoreconnect.com/)
- [Status Page](https://status.storeconnect.com/)

## Contact

- info@getstoreconnect.com
- US +1 415 745 3230
- AUS +61 2 8365 2308

100 S Ashley Dr, Suite 600-2461
Tampa FL 33602-600 USA

Level 22, Sydney Place
180 George Street
Sydney, NSW, 2000, AUS

---

StoreConnect Support — https://support.storeconnect.com/articles/pos-actions-reference