POS screens
POS is mostly a single till SPA. Each section below explains what the screen is for, why it exists, and how cashiers use it.
For the full keyboard map and day-open procedures, see POS/docs/POS-OPERATOR-GUIDE.md in the repo. Amount entry usually has no decimal key: type minor units (e.g. 4300 = £43.00 on 2-decimal shops).
Admin counterparts
Routes
6 pages in this section.
What
POS has a small set of real URLs. Almost everything after device binding happens inside `/pos/[shopId]` as modes and dialogs — not separate pages.
Why
A single till SPA keeps keyboard focus, hardware bridge state, and drawer accountability continuous across a shift. Separate routes exist only when a different window or first-run setup is required.
How
First launch opens Register setup. After lock, later launches jump straight to the till. Customer display and card-reader UIs open as companion windows from the till header.
POS root redirect
/
If the device already has a shop binding, redirects to `/pos/{shopId}`. Otherwise opens device setup to claim a register.
Device setup
/device-setup
What: first-run (or reconfigure) Register setup screen. Why: a PC/EXE must be permanently tied to one shop and printer so cashiers cannot switch stores mid-shift. How: enter the store slug/id from Admin → Settings → General, configure the receipt printer, then Finish / lock. Later changes require Unlock with admin PIN (owner/admin/manager). Open till resumes the bound register.
Select shop
/pos/select-shop
Choose which shop the register should open when more than one shop is available to the device/user.
Till (main)
/pos/[shopId]
What: the single-page till SPA at /pos/[shopId]. Why: keeping sale, drawer, and hardware state in one focused window matches programmable keyboards and avoids losing strip focus. How: article grid + scan strip + black status panel + yellow total. Modes (READY, ENTER CASH, DRAWER, SUSPENDED SALES, …) change the strip placeholder and valid keys — follow the status line.
Customer display
/customer-display/[shopId]
What: companion window at /customer-display/[shopId] showing Your Order, line items, and Ready for payment / totals. Why: shoppers should see the basket without reading the operator UI. How: open from the till header (Open customer display). Mode web/vfd/none is configured on the register; the till pushes cart state to this view.
Card reader display
/card-reader/[shopId]
Companion UI for card-present flows when a dedicated reader display is used.
Sell & cart
5 pages in this section.
What
The sale cart is the default till mode: scan or search products, adjust quantity/price/VAT on lines, attach a customer, and watch the black status panel for the next valid key.
Why
Cashiers need a keyboard-first surface that mirrors programmable till keyboards. The status panel (READY, ENTER CASH, DRAWER, …) is the source of truth for which chords are legal.
How
Scan a barcode into the strip and press Enter. Use QUANTITY before a scan to multiply. Line discounts and VAT overrides may require a manager PIN depending on Admin policy.
Sale cart
/pos/[shopId] · cartMode: sale
What: default cartMode:sale — lines appear under ART.NR / ART.DESC / PC / PRICE. Why: cashiers build a basket before tender; line-level corrections must stay distinct from abandoning the sale. How: scan barcode · Enter; QUANTITY arms multiply; -30/-50/-75% and PRICE OVERRIDE hit the last line (manager PIN if Admin policy requires). CLEAR backs one step; ERROR CORRECT undoes last entry; CANCEL SALE is DRAWER · 6.
Customer lookup
Till dialog · Customer
Search customers from Admin’s directory and attach them so loyalty and receipts show the shopper. Profiles are managed under Admin → Customers.
Send cart
Till dialog · Send cart
Transfer the open cart to another register/lane in multi-lane setups instead of suspending globally.
Online orders (till)
Till dialog · Online orders
Cashiers can view and act on incoming online/pickup work without leaving the register. Admin Live orders remains the back-office board.
Sale complete
Till · Sale complete
Post-payment confirmation showing change and triggering receipt print according to Admin receipt + local printer settings.
Payments
4 pages in this section.
What
Payment modes take the amount due through one or more tenders — cash (SUBTOTAL), card, gift card — until the balance is zero and a receipt can print.
Why
Retail checkouts often split cash + card or redeem gift balance first. The till must keep an audited running due amount and only complete the sale when tenders cover it.
How
SUBTOTAL opens cash entry (type minor units, e.g. 4300 = £43.00). Underpay prompts a split. CARD / GIFT CARD consume remaining due. TOTAL finalises when cash ≥ due.
Cash payment
Till · Payment (cash / SUBTOTAL)
What: SUBTOTAL (Ctrl+Alt+T) opens ENTER CASH AMOUNT with due shown on the strip. Why: cash drawers need an explicit counted tender and change due before the sale completes. How: type minor units (4300 = £43.00) · Enter · TOTAL when cash ≥ due. Underpay → SPLIT PAYMENT for the remainder via card/gift. Esc cancels the open tender without voiding accepted split cash.
Card payment
Till · Card payment
Waits on the card provider/reader. Cashback (when enabled in Admin → POS cashback) pays out from the drawer and is reported in POS reports.
Gift card tender
Till · Gift card
Scan or enter a gift card issued from Admin → Gift cards. Remaining balance after partial redeem can be finished with cash/card split.
Split payment
Till · Split / remaining balance
Appears after a partial tender. Complete the remainder with another method until the balance is zero.
Suspend
2 pages in this section.
What
Suspend parks the open basket with a reference and clears the till. Recall lists parked sales so a cashier can resume later — or Admin can resolve exceptions after day-end.
Why
Customers step away, another lane needs the register, or a manager must take over. Parking preserves prices and lines without completing payment.
How
F9 with items → SALE SUSPENDED + reference. F9 on an empty cart → SUSPENDED SALES list → number · Enter to restore. Stale parks appear under Admin → Suspended sales.
Suspend sale
Till · F9 with items
What: F9 with a non-empty cart parks the basket and shows SALE SUSPENDED with reference, item count, and total. Why: frees the register without losing prices or lines. How: after suspend the till returns to READY/empty; recall with F9 when empty. Exceptions after day-end/timeout are handled in Admin → Suspended sales (restore original prices, cancel, or archive).
Parked sales recall
Till · F9 empty cart
What: SUSPENDED SALES list on the status panel (F9 on empty cart). Why: cashiers must resume the exact basket the customer left. How: press the list number · Enter to restore lines and totals; L/Back dismisses. Each row shows reference, amount, till id, and time.
Drawer & day control
7 pages in this section.
What
The DRAWER (NO SALE) menu owns float, mid-day count, day-end close, returns shortcut, void/cancel, and drawer kick — the accountability layer around the cash drawer.
Why
Without opening float and day-end counts, POS reports cannot reconcile expected vs counted cash. These steps also gate sales when a previous day was left open.
How
NO SALE / F7 → DRAWER → number · Enter. Opening float runs once per day after any pending day-end is settled. Day end asks for counted cash against expected.
Opening float
NO SALE · 1
What: OPENING FLOAT prompt after any pending day-end is settled — type float digits on the strip. Why: expected cash for the day is baseline + sales − change − cashback; without a float, drawer reports cannot reconcile. How: DRAWER · 1 (or auto-prompt) · type amount (1050 = £10.50) · Enter once per trading day.
Mid-day cash count
NO SALE · 2
Interim count without closing the day — used for pickups or variance checks.
Day end / close drawer
NO SALE · 3
What: DAY END asks for counted cash against expected (yellow banner if a previous day was left open). Why: closes the accountability period so the next shift can open a float and POS reports show variance. How: DRAWER · 3 · type counted cash · Enter close (P print if offered). Sales stay blocked until a stale day-end is settled.
Returns lookup (NO SALE)
NO SALE · 4
Shortcut into returns lookup (also available from CODE menu). Scan a receipt/order to start a return or exchange cart.
Void item mode
NO SALE · 5
Arm void mode, then scan the line to remove. Distinct from ERROR CORRECT on the last line.
Cancel sale
NO SALE · 6
Clears the in-progress sale per till policy. May require manager approval depending on shop settings.
Kick drawer (no sale)
NO SALE · 0
Hardware kick for non-sale drawer access. Audited as a no-sale open where reporting supports it.
CODE menu & lock
3 pages in this section.
What
CODE covers register security: lock, log out, and refund entry. Manager approval dialogs interrupt a sale when policy requires a supervisor PIN.
Why
Tills sit on the counter. Locking between cashiers and gating voids/discounts protects cash and margin without abandoning the open sale context.
How
CODE · 1 locks (employee # · PIN to resume). CODE · 2 logs out. Restricted actions show MANAGER APPROVAL — manager employee # then PIN. Staff PINs are set in Admin → User management.
Lock register
CODE · 1
Secures the register between cashiers. Unlock with staff credentials created in Admin → User management.
Log out
CODE · 2
Ends the current POS staff session. Next user must authenticate again.
Manager approval
Till dialog · Manager PIN
Appears when an action exceeds cashier permissions (voids, discounts, refunds). Manager PINs are staff credentials with elevated rights.
Returns
1 page in this section.
What
Returns and exchanges look up a prior receipt/order, then switch the cart into return or exchange mode so refunded lines and restocks stay linked to the original sale.
Why
Blind refunds break inventory and tender reports. Lookup keeps VAT, tenders, and returned quantities auditable in Admin → Orders / Returns and POS reports.
How
DRAWER · 4 or CODE · 6 → scan receipt/order → confirm lines → complete tender. Void item (DRAWER · 5) removes a middle open-basket line by barcode instead.
Returns / exchange
Till · cartMode: return | exchange
After lookup, the cart switches to return or exchange mode. Completed returns appear in Admin orders/returns and POS reports.
Hardware
3 pages in this section.
What
Hardware surfaces include the customer display window, card-reader companion UI, local printer selection (bridge), and in-till shortcut help.
Why
Shoppers need a facing total; printers differ per register; ESC/POS RAW printing goes through a local bridge. Layout branding stays in Admin → POS receipt.
How
Open customer display from the till header. F7 / Drawer & reports also reaches drawer tools. Ctrl+K shows Learn keyboard. Each till picks its Windows Generic/Text printer only.
Till printer settings
Till · Printer settings (F7)
Each register chooses its Generic/Text printer. Layout comes from Admin → POS receipt; the bridge (port 6315 in browser mode) sends RAW ESC/POS.
Learn keyboard
Till · Ctrl+K
In-app key map for sale, keylock, and PC chords. Full reference lives in `POS/docs/POS-OPERATOR-GUIDE.md`.
Register setup unlock
Till · Admin PIN unlock
After device setup locks the register, changing shop binding or certain hardware settings requires an admin/manager unlock.