Skip to main content

POS Shared Saved Carts

Purpose​

POS Shared Saved Carts adds Hold Cart and Held Carts to Point of Sale. A cashier can save an unpaid cart privately, share it with a store team, or direct it to an authorized terminal or user. A claim temporarily gives one terminal control, while transfer history records the handover.

A hold is a saved snapshot. It creates no payment, invoice, finalized POS order or stock reservation. The customer pays through the normal POS checkout after the cart is recalled.

Before you start​

Install corvus_pos_shared_held_cart for your exact Odoo major version. The reviewed 19.0 package depends on Point of Sale and Bus and requires the Python package xlsxwriter for its export functionality. Its dependencies do not require Enterprise; the package is intended for Community and Enterprise installations with those native addons. Use hosting that permits server addons, such as Odoo.sh or a private server.

This guide is based on source review, primarily 19.0. The practice workflow has not been executed in this documentation review. Back up before installation or upgrade, and verify pending POS transactions before refreshing a terminal.

Access and roles​

A Point of Sale User uses the cashier workflow within an authorized POS session. Visibility depends on company, ownership, sharing group and directed recipient; being able to open POS does not make every saved cart visible.

A Point of Sale Administrator/Manager maintains sharing groups, opens the backend Held Carts and reporting menus, and exports analysis. Manager access does not erase cart visibility restrictions. Cart snapshots and events are read-only records: use the POS actions to change their state.

Setup and menu​

  1. As a POS manager, open Point of Sale → Configuration → Held Cart Sharing Groups. Create a group for one company and add its Authorized POS Terminals. Add Additional Authorized Users when needed.
  2. Choose Team Shared or Directed Transfers Only as the group visibility policy.
  3. Open each participating POS configuration and find Shared Held Carts. Enable it and select the Held Cart Sharing Group.
  4. Set Held Cart Expiry (hours) and Claim Lease (minutes). The source defaults are 24 hours and 5 minutes. A lease is temporary control, separate from the cart's expiry.
  5. Decide whether to allow Offline Local Holds and Manager Take Over. Both options are enabled by default in the reviewed source; set them deliberately for the store's process.

The sharing group's terminals must belong to its company. A directed recipient must be in the allowed sharing scope.

Workflow​

  1. Build a non-empty cart with no payment lines. Choose Hold Cart from the POS controls.
  2. Enter a Cart name, select Private, Team shared or Directed terminal, and add a note. For a directed cart, choose an Authorized recipient. Confirm Hold Cart. An online save produces a hold code and removes the held order from the active checkout workflow.
  3. On an authorized terminal, open Held Carts, search by code or customer, and choose Refresh if necessary. The queue shows the owner, source terminal, total and claim status.
  4. Choose Claim. If another terminal has an active claim, the server refuses a competing claim. Choose Release when you no longer need control. Use Transfer with a recipient and reason to hand the cart over; the recipient can Accept, Reject, or Return to Sender. Rejection and return require a reason.
  5. Choose Reconcile & Recall. Review captured and current quantities, prices and taxes. For each line choose Use current, Keep captured when offered, or Remove line. An unavailable product cannot simply be recalled as eligible stock. Choose Apply Resolutions to rebuild the cart.
  6. Check the resulting cart and finish the normal POS payment workflow. Native order processing validates the saved-cart reference and links the checkout to its source cart. The backend keeps the snapshot and events for audit.

Managers can inspect Held Carts, print a Hold Ticket, and use Reporting → Held Cart Conversion & Aging. Export Held Cart Analysis provides CSV or XLSX output for the selected scope.

Practice scenario​

In an authorized test database, create fictional terminals “Harbor Counter” and “Harbor Collection” in one sharing group. Save a two-item cart as “Mira collection” with team visibility. Claim it at Collection, then try claiming it from Counter while the lease remains active. The expected result is a claim refusal at Counter. Release and reclaim it, then review the reconciliation choices before completing a test checkout. This is a source-derived exercise, not a recorded test result.

Troubleshooting and limitations​

Hold Cart is unavailable: use a non-empty cart without payment lines and check that the POS configuration enables the feature.

No cart appears: check the company, sharing group, recipient and current session. A private cart or an offline local hold is not a team queue entry.

The claim or revision changed: refresh before trying again. A manager may use Manager Take Over with a reason when that setting is enabled; it is not a way to bypass company or sharing scope.

Offline / Not Shared: an allowed local hold stays on that browser until reconnection. Native queued POS transactions synchronize before publication. Use Retry native queue, then held carts when an error requires retry. Do not clear browser storage to resolve this condition.

The module does not reserve stock, collect deposits, share payments, synchronize restaurant tables, or transfer carts across databases or companies. If recall reports a missing product, tax or changed unit, resolve the catalogue or terminal data issue before checkout.

Catalogue-qualified versions are 15.0, 16.0, 18.0, 19.0 and 20.0. The 15.0 package also depends on base_sparse_field; 15.0–16.0 use older POS controls and configuration layouts. The 20.0 package uses Odoo's newer access-definition format. These differences were inspected, but the complete cashier workflow was reviewed only for 19.0. This guide does not establish 17.0 availability or cross-version runtime results.