Held Carts Across Registers
Hyvä POS is in closed beta
Hyvä POS is currently in a closed beta (pilot phase) with a small group of merchants. It is not yet generally available: the App Store release follows the pilot, and features and configuration may still change - possibly in backwards-incompatible ways - before the general release. Want to take part? Sign up at hyva.io/pos.
A customer forgot their wallet, or wants to grab one more thing while a queue builds behind them. The cashier parks the sale, serves the next customer, and resumes the parked cart when the customer returns - at the same counter, or with PRO at any register of the location.
What Held Carts Do
Tapping Hold in the cart parks the sale mid-transaction, with an optional note ("forgot wallet, back in 10"). The parked cart keeps everything: every line as scanned, applied discounts, and the customer if one was attached. Resuming loads it back into the register and checkout continues where it stopped.
On the free tier the parked cart lives only on the device that parked it. PRO shares held carts across the location: park a sale at counter 1, and when the customer comes back to find a queue at that counter, counter 2 recalls the cart and finishes it. Only one register can resume a given cart - recalling removes it from the shared list in a single atomic step, so two counters can never both complete the same sale.
Where the Data Lives
- On the device. Every parked cart is written to an encrypted file on the device the moment it is held, so it survives an app restart or a drained battery. On the free tier, this is the whole story.
- In Magento (PRO with sharing on). Each parked cart is mirrored to its own row in the
hyva_pos_held_carttable: the full cart payload, plus the summary Magento displays - location, who parked it, customer name, item count, total, the note, and timestamps. When a register recalls a cart, Magento marks the row as recalled (by whom, and when) in the same database operation that hands the cart over. That is what guarantees single recall, even when two cashiers tap the same cart in the same second.
Admins can review and clean up parked carts across all locations under POS → Held Carts in the Magento admin: a grid with location, staff, customer, item count, total, note and timestamps, including bulk delete for rows nobody is coming back for. Deleting a location removes its held carts with it.
Configuration
Sharing is off by default. Three places control it:
- Magento: Stores → Configuration → Hyvä POS → General → Share Held Carts (config path
hyva_pos/general/share_held_carts, configurable per website). "When enabled, held carts are shared between all terminals at the same location via the POS API." - The register: the same switch lives under Settings → Store Configuration → PRO Features → Share Held Carts on the device, so a single-store setup can enable sharing without touching Magento.
- Enforcement: to make Magento the single source of truth, enable Stores → Configuration → Hyvä POS → Lock Settings → POS Field Enforcement → Lock Held Cart Sharing. The Magento value is then enforced on every terminal: the app toggle shows a Managed by Magento badge, is disabled, and a footnote explains that the setting is managed by the Magento administrator. This is the same lock pattern every pushed setting supports - see global settings.
Sharing requires PRO with a location assigned to the terminal; the location is what defines "the same store". Without a location, or with sharing off, PRO registers keep the device-local behavior. Configuration changes reach devices through the terminal heartbeat, within minutes rather than instantly.
What the Cashier Sees
- Hold in the cart parks the sale; a prompt takes the optional note.
- The Held Transactions list shows each parked cart with who parked it, the customer, item count, total, the note, and when it was held. With sharing on, the list covers the whole location and refreshes when opened and periodically in the background.
- Visibility follows roles: staff see the carts they parked themselves (on whichever register), admins see every cart at the location.
- Resuming re-checks prices against the register's catalog cache, so a cart parked before a price change resumes at current prices.
- If another counter resumed the cart first, the cashier sees "This cart has already been recalled by another user." instead of a silent duplicate.
Offline
Parking and resuming device-local carts needs no connection at all. With sharing enabled:
- A cart parked while offline is stored on the device immediately and syncs to Magento when the connection returns; until then, only the register that parked it can see it.
- The shared list shows the last state the register managed to fetch, and quietly retries in the background.
- Recall conflicts that build up while a register was offline resolve on reconnect: the cart belongs to whoever recalled it first on the server, and the other register is told so.
Nothing about a parked sale is lost to a network drop - the device copy is always written first.