POS & cashier
The POS is a standalone cashier experience for tablets and Windows kiosk PCs. Cashiers sell, return, hold carts, split payments, print receipts, and close Z-reports without walking the full ERP UI.
Clients
| Client | Notes |
|---|---|
| Android / iOS | Camera barcode scan + USB/Bluetooth HID |
| Windows desktop | LAN thermal printers, HID scanners, close-to-tray cashier shell |
Routes (mobile): /business/:businessId/pos and /business/:businessId/pos/settings.
Cashier flow
- Pick products from category tabs, search, scan, or HID entry.
- Edit quantities and line/invoice discounts in the cart.
- Choose walk-in or a named customer.
- Split tenders across payment methods.
- Pay & Print persists a durable outbox sale (
client_sale_id), posts to the API when online, then prints and opens the drawer. - Hold / Recall parks and restores carts; Z-report totals by method and compares expected vs counted cash.
Hardware
Configure under POS hardware settings:
- Receipt printer — prefer LAN ESC/POS at
host:9100; Windows can also use installed RAW USB printers. - Cash drawer — kick pulse over the printer transport after Pay & Print.
- Barcode scanner — HID keyboard-wedge (all platforms) or camera (mobile).
- Scale / customer display / card terminal — seams exist; scale and terminal are manual today.
Use Test print before going live on a station.
Offline behavior
POS sales and Z-report closings land in the Drift sync_outbox. The shared client_sale_id keeps retries idempotent. Posted sales mirror into local invoices so the invoice workspace stays coherent while sync catches up.
On Windows, minimizing the cashier window keeps a background sync timer alive; leave the tray process running on the station.
Related
- Offline sync
- Sales
- Deep dive in the repo:
docs/pos-mobile.md