Skip to content

Front of house

Point of sale

Taking orders, seats and courses, sending, billing, splitting and receipts.

6 min read

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.