Skip to main content
Checkout turns a basket into a finalized sale: it settles the amount due over one or more tenders, applies any declared discounts, and records the ticket (POST /v1/checkout/finalize).

Server-side re-pricing

The backend re-prices the cart on finalize. It does not trust the amounts the till sends — it recomputes them against its own price authority and rejects a mis-priced or forged cart (a 422 business-rule failure). This is the line that keeps a tampered basket from being rung up.

Tenders and settlement

A sale settles over one or more tenders. The tender engine models the methods and tracks what remains due until the sale is fully settled.
  • Cash rounding — cash settlement applies the legal rounding rule, injected from the backend configuration, so the tolerance is consistent.
  • Foreign currency — a foreign-currency tender discloses the foreign amount and the rate used, shown on the sold recap.
Card / PSP capture is deferred for the pilot: tender methods are modelled and settle in the engine, but there is no live payment-terminal integration yet — the terminal port is a mock.

Discounts and manager override

Declared discounts are threaded onto the finalize request, and the backend re-derives them. A discount that needs authority is gated by a manager elevation token, consumed server-side on finalize.

After the sale

When the sale is finalized, the till shows a recap of the real finalized ticket (the sold panel). From there you can move to the receipt to print or reprint. The sale also books cash into the open register drawer and lands in the day-book and the sales read model.