On this page
For cashiers, waiters, bartenders and baristas. Open Point of sale from
the sidebar (/pos). The till is touch-first: every target is at least
44 px, the catalogue is one tap per item, and nothing on the screen waits
for printers, e-mail, reports or analytics — those run in the background
after the sale is saved.
The screen
┌ header: branch · till · [Orders ▾] [Tables] [New order] ───────────────┐
│ catalogue (search, categories, item tiles) │ order cart │
│ │ lines · totals │
│ │ [Send] [Bill] [Pay] │
│ │ Hold Split Discount ⋯ │
└──────────────────────────────────────────────┴────────────────────────┘
- Catalogue — items from the menus active for this branch right now (schedules, seasons and branch menus are applied by the server; the snapshot refreshes within 30 s of a menu change). Tiles show the menu price, a sizes badge when the item has variants, and are dimmed when 86’d. Search matches name, short name and SKU.
- Cart — the current order: number, type, table/seat, lines with
modifiers and notes, subtotal, discount, service charge, tax and total.
Locked lines (already sent to the kitchen) show a lock; reducing or
removing them is a void and needs
sales.void. - Orders drawer — every open, held or billed order of the branch, live.
Starting an order
Tapping an item with no order open starts a counter order. For anything else use New order and choose the type:
| Type | Use it for | Notes |
|---|---|---|
| Dine-in | table service | pick a table; guests and seats; default service charge |
| Takeaway · Pickup · Delivery | orders leaving the venue | customer name/phone; delivery address; scheduled time |
| Counter · Café · Bar | quick service | no table; order number is the pickup reference |
| Room service | hotel rooms | room number |
| Catering · Event | functions | event code (unlocks event price rules) |
| Staff meal | staff | customer tier staff (staff pricing rules apply) |
| Complimentary | on the house | every line is zero-priced and labelled Complimentary; audited |
| Custom | anything else | you name the type; it prints on the receipt |
Every order gets a gapless number per branch (ORD-KLA-000042) and is
saved the moment it is created — a power cut never loses a started order.
Building the order
- Tap an item → added at quantity 1. Items with required choices (size, milk, spice, doneness…) open the item dialog first; optional extras, quantity, seat, course, notes and allergies are on the same dialog. Prices update as you choose.
- Tap a cart line → change quantity, seat, course, notes, allergies or modifiers; Remove deletes an unsent line.
- Seats and courses — set per line; the bill can be split by seat and the kitchen groups by course (KDS, production phase).
- Order details (⋯ → Details) — customer, guests, waiter, promo code, customer tier, notes, allergies and special instructions for the whole order. Changing the promo code, tier, event or order type re-prices every unsent line.
- Open-price items ask for the price. Typing a different price on a
normal item needs
sales.price_override(sensitive, audited). - Prices, taxes and the rules that applied are frozen on each line when it is added, so later menu edits never change a sold order.
Sending, billing and paying
- Send — releases pending lines to production (the production phase routes them to stations); the lines lock. You can keep adding lines and send again.
- Bill — marks the order billed, flags the table bill requested on
the floor plan and prints a bill (pro-forma,
BIL-…). - Pay — opens the pay screen (Payments & refunds): cash with change, mobile money, card, gift cards, house accounts, split tenders. The order closes itself when the last tender covers the total: lines are served, the table is freed (status cleaning) and the receipt and sales roll-up jobs are queued. An unpaid order cannot be closed.
- Receipt — issued once per order (or once per bill part) with a
gapless
RCT-…number and a unique reference; Reprint re-issues the same document with a reprint counter; Invoice issues a tax invoice (INV-…) with the customer’s name, TIN and address.
Holding, resuming and the orders drawer
Hold parks the order (the table stays occupied) and clears the till; Orders lists open, held and billed orders — tap one to resume. Orders update live on every till of the branch, so a colleague’s change appears without refreshing; if two tills edit the same order at once the second save is refused with “changed elsewhere — reloaded” and shows the latest version.
Discounts and service charge
Discount applies a percentage or an amount with a label. Discounts above
the business threshold (sales.discount.large_threshold_bps, default 20 %)
need sales.discount.large. The service charge comes from the dining
area’s default (or the business default for dine-in) and is recalculated on
every change. Complimentary orders cannot be discounted further.
Splitting the bill
Split offers five methods:
| Method | What happens |
|---|---|
| Equal | the total is divided into n bill parts (the last takes the rounding) |
| By amount | parts of a fixed amount; the last takes the remainder |
| Custom | named parts with amounts that must add up to the total |
| By item | ticked lines (or part of their quantity) move to a new order on the same table |
| By seat | everything on the chosen seats moves to a new order |
Bill parts (Guest 1 · 12,000) are paid one by one (Settle opens the
pay screen for that part) and each can have its own receipt; the order
closes when every part is paid. Item and
seat splits create a child order that is worked and paid separately.
Other actions (⋯)
| Action | Permission | Rule |
|---|---|---|
| Duplicate | sales.create |
new order with the same lines, re-priced now |
| Transfer | sales.transfer |
move to another table and/or waiter; the target table must be free |
| Merge | sales.transfer |
pulls another order’s lines into this one; the source becomes merged and its table is freed |
| Cancel | sales.edit |
only while nothing has been sent; the table is freed |
| Void | sales.void● |
after sending; reason required; audited |
| Reopen | sales.reopen● |
closed/cancelled/void → open again; reason required; re-seats the table if free |
| Edit | sales.edit |
header and lines while the order is open or held |
● sensitive: needs a password session (PIN sessions are asked to step up) and is written to the audit log with the reason.
Orders list and history
Orders (/pos/orders) lists the branch’s orders with filters (status,
type, day, text) and opens an order page with every line, bill part,
document and the full event history (who did what, from which till, when).
Void and reopen are also available there for managers.
Receipts
Documents are rendered for 58/80 mm thermal printers and open in a print
view (/pos/receipts/:uuid). Each carries: the business trading name, TIN
and address, the branch, document kind, number, reference
(KLA-T01-0192A4B3C7D1), order number, date, table/guests, waiter,
cashier, till, lines with modifiers and notes, subtotal, discount, service
charge, tax lines (inclusive taxes shown as incl.), total, paid and due.
Printing happens through the printing queue; if the printer is offline
the document is still issued and can be reprinted later.