User guide · Modules

POS terminal

The touch till for the restaurant and the bar: shifts, tables, tickets, modifiers, sending to the kitchen, voids, discounts, split bills and tenders including charge-to-room.
Whole guide

Purpose and who uses it

Restaurant MgrAccountantHotel Manager

Waiters and bar staff ring up orders; a manager approves the sensitive ones with their PIN; managers open and close shifts.

The POS terminal is the screen a server stands at. Each hotel has one or more outlets (a restaurant, a bar; a small hotel has just the one) with their own menu, tables and service-charge rate. An outlet is a menu and a bill; where the work is done is the station on the dish, kitchen or bar. The till shows every menu at once, so a table's food and its drinks go on one ticket and each line reaches the board that makes it. A sale is a ticket of lines; lines are sent to the kitchen, adjusted, voided with a reason, discounted, split, and finally settled by one or more tenders, cash, mobile money, card, or a charge to an in-house guest's room folio. Several orders stay open side by side: the Open orders strip under the outlet switch lists every open ticket in the hotel (naming the outlet when more than one has orders open), and a tap brings it back onto the panel, so a waiter can work three tables at once.

The terminal sits under the Restaurant permission module. Anyone with Restaurant at Can edit (a Waiter, a Chef, the Receptionist) can ring, send and print the bill; Restaurant at View only sees the ticket and totals but no buttons. Settling a bill (taking cash, mobile money, card or a room charge) is Restaurant at Full: the Cashier, the Restaurant Manager and the managers. A waiter sees Print billwhere Pay would be and takes the bill to the cashier. Cancelling an order that already went to the kitchen, editing the menu and closing a shift also need Restaurant at Full. A flagged discount or a refund asked for by somebody without that level opens an Approve dialog: pick a manager from the list and they tap their own four-digit approval PIN. Nobody signs out, and the audit row names both people. Voiding a line the kitchen already has needs no manager: anyone who can ring gives a reason, and the audit log records who voided it and why.

Screen anatomy

Outlet and shift bar on top, category rail on the left, menu grid in the middle, the ticket on the right.

POS terminal
1234567
  1. 1
    Menu switch and shift chip
    All menus, then one button per outlet (fork icon for restaurants, glass for bars). The button that is lit says whose menu the grid is showing; tapping an outlet also moves the ticket, its shift and its tables to it, and the outlet you are on keeps a thin ring while All menus is up. When a shift is open a chip shows its code and “Shift open · <opener>”. New ticket sits at the right end.
  2. 2
    Menu grid
    One tile per item from every menu the hotel sells: name, the section it comes from (“Bar · Beers”) while searching, “N options” when it has modifier groups, price, a star if popular. Sold-out dishes leave the grid; a “N sold out” chip next to the search shows them greyed. 24 tiles a page.
  3. 3
    Ticket head
    Pick table (or the assigned table number), the TKT-… code, a badge with “N to send” or the kitchen status, Covers stepper, and a Room · guest banner when the ticket belongs to an in-house room.
  4. 4
    Ticket lines
    Name, modifiers, kitchen note, quantity stepper, a Kitchen or Bar tag when the ticket holds both, the stage once fired, the red void bin, and the line total with unit price.
  5. 5
    Totals and actions
    Discount select, Split, then Subtotal · discount · Service N% · VAT · Total due, and the two big buttons Send (N) and Pay (Print bill for a waiter, who does not settle).
  6. 6
    Search
    The search finds a dish or a drink by any word of its name, section or description, and the count of matches sits beside it. The menu it searches is the one the switch at the top has chosen.
  7. 7
    Category rail
    Popular (starred items) and All items first, then every section grouped under the menu it belongs to, each with its item count. Typing in the search box overrides the rail.

If the hotel has no outlet the page shows “No POS outlet configured for this hotel.” Outlets, tables and menus are seeded per hotel; the per-outlet service % and the discount and void-reason lists are edited in Settings → Ops config.

Shifts

Restaurant MgrAccountant

One open shift per outlet; the shift report totals tenders, discounts and voids at close.

A shift (code SHF-…) is opened per outlet with an opening float and closed with an optional cash count. Only one shift can be open per outlet at a time, the server locks the outlet while it checks, and a database constraint backs it up, so two managers opening at once get one shift, not two.

  1. 1
    Open
    Open shift (Restaurant · Full access, next to the outlet chips) asks for the opening float, the cash in the drawer before the first sale. The terminal then shows the green shift chip with the code and who opened it; without one it reads “No shift open”.
  2. 2
    Trade
    Every ticket that closes on the outlet is stamped with the shift. By default the till still sells without a shift; Settings → Hotel → “Require an open shift to take money at the till” makes cash, card and mobile money refuse (“No shift is open on this outlet”) until one is opened.
  3. 3
    Close
    Close shift opens the drawer count: a row per note (50,000 down to 100 shillings) with a count, plus closing notes. If tickets are still open the close is refused and offers “Close the shift anyway”, in which case their money rolls to the next shift and the report says so.
  4. 4
    Read the Z-report
    Tickets (and refunds), gross sales, discounts, voids, a line per tender method, the opening float, the cash expected in the drawer (float plus the net cash taken, change and refunds already netted), the cash counted, and Balanced / Over / Short. The same report is stored with the shift and audited.

Building a ticket

Restaurant Mgr

Tap items to add them, pick a table or room, set covers, adjust quantities; a ticket is created the first time you need one.

  1. 1
    Start
    Tap a menu tile, click Pick table, or click New ticket. If no open ticket is selected, the first tap creates one (TKT-…, 1 cover) on the current outlet. The terminal reopens the most recent open ticket for the outlet when you return.
  2. 2
    Table or walk-in
    Pick table opens the floor by zone; each tile shows the number, seats and status. Choose a table, or Walk-in / no table. The table turns “open”; moving the ticket elsewhere frees the old table.
  3. 3
    Room service
    A ticket created against an in-house room (roomId) is linked to that guest's booking and shows a Room N · guest banner. The link is also made at payment time if you choose Charge to Room.
  4. 4
    Add items
    Tapping a plain item adds one straight away (“Added <name>”). Items with options open the modifier sheet.
  5. 5
    Quantities
    Use the − / + stepper on a line (1–99). Taking an unsent line to zero deletes it; taking a sent line to zero opens the void dialog instead.
  6. 6
    Covers
    The Covers stepper (1–20) sets how many guests; it also decides how many ways Split evenly divides the bill.

The modifier sheet

Titled with the item name and “Choose options · UGX … base”. Each modifier group is a row of chips; a group marked · required must have a choice (single-choice required groups preselect the first option), · choose any allows several. Price deltas show as +2K / −1K on the chip. Below is theKitchen / bar note (“e.g. allergy, no peanuts”), a quantity stepper and the running unit × qty price. Add to ticket stays disabled until every required group has a choice.

Sending to the kitchen and voiding

Restaurant Mgr

Send fires every unsent line and starts the kitchen ticket; voiding a sent line needs a reason and is audited.

Send

  1. 1
    Check the badge
    The ticket head shows “N to send” in purple while unsent lines exist; once everything is fired it shows the kitchen status instead.
  2. 2
    Click Send (N)
    All unsent, non-voided lines are marked sent; the ticket's kitchen status moves from new to preparing if it was new. Toast: “N items sent to kitchen”. The kitchen sees it on the Restaurant order board immediately.
  3. 3
    Add more later
    New lines start unsent; Send fires just those. A second course on an order the kitchen already marked Ready or Served puts the ticket back into Cooking on the kitchen display. Send is disabled when nothing is waiting (“No unsent lines” if forced).
  4. 4
    Watch each line come back
    Every sent line carries a word from the pass: in kitchen, ready or served; the header badge reads “2 of 3 ready” until the last plate is up, then the ticket's kitchen status. The open-orders strip shows “ready” on a ticket whose food is all up. Print bill prints the same word beside each item.

Void a line

Click the bin icon on a line (or step a sent line to zero). The Void item dialog shows “2 × Chicken curry · UGX 48,000” and the reason list from Settings (defaults: Guest changed mind · Wrong item rung · Item sold out · Quality complaint · Duplicate entry · Manager comp).Keep item cancels; Void item confirms.

Discounts and split bills

Restaurant Mgr

Whole-ticket percentage discounts, some needing a manager's PIN; split evenly by covers or move items to a new ticket.

Discounts

The select under the lines lists the hotel's discounts (defaults: No discount · Staff meal 30% (auth) · Happy hour 20% · Loyalty member 10% · Manager comp 100% (auth)). A discount applies to the whole ticket subtotal and shows as a red line with its label; the ticket copies the label and % so later edits to the list do not change old tickets.

  1. 1
    Pick a discount
    Ones without “(auth)” apply immediately, and so do the flagged ones when you hold Restaurant at Full yourself.
  2. 2
    Ask a manager
    Ones marked “(auth)” open the Discount authorisation dialog. Approved by lists everyone who may sign this off and has an approval PIN set, and the field below takes their PIN. Approve sends the name and the PIN with the request.
  3. 3
    Server check
    The approver must be an active user of this hotel holding Restaurant, Payments or Settings at Full access, and the PIN must be theirs. On success the toast says “Discount applied”; the audit row names you and them.

Merge bills

Merge (next to Split) lists every other open ticket in the hotel, the same table or room first: the bar's tab, a second kitchen ticket, room service. Tick the ones that belong to this guest and they fold into this bill with their lines, sent state and station intact; the other tickets are cancelled with the note “Merged into TKT-…”. A ticket that already has money on it cannot be merged until its tenders are removed. One bill, one receipt, one payment.

Split bill

Split opens “Split bill · TKT-… · table · UGX … due” with three modes.Evenly asks for the number of guests (it starts at the covers, 2 to 20, and can differ from them) and divides every line that many ways, creating one child ticket per extra guest with the same table, room and discount; guest 1 stays on the original, which keeps the odd shillings. By amount lists guest 2 onwards with an amount box each (Another guest adds a row, Equal shares fills them evenly): every amount becomes a ticket of its own carrying one “Share of TKT-…” line, and guest 1 keeps the food and whatever is left, shown live at the top; the amounts must leave something for guest 1. By item lets you tick lines and Move to new ticket; the panel shows what goes and what stays. Each child is a normal ticket paid separately; a share ticket cannot be edited, only paid or cancelled, and it pays only once the pass has marked the parent's food ready.

Taking payment

Restaurant MgrAccountant

Pay opens the tender drawer; a bill can be taken in several tenders, and the ticket closes on its own when the balance reaches zero, printing the receipt, depleting stock and, for room charge, posting to the folio.

Pay (enabled once the ticket has a live line) opens the Take payment drawer. With the hotel settingTake money only after the kitchen marks the food ready (on by default) the drawer first lists any kitchen dish that is unsent or still cooking, and the server refuses the tender (“2 items not ready: … still in the kitchen”) until the pass marks them ready; drinks never hold a bill, and Restaurant · Full access may take the money anyway, which is written to the audit log. The drawer shows: “TKT-… · table · outlet”, the bill card (total, paid so far, balance due), the tenders already taken on this bill, four tender tiles, and a right-hand panel that changes with the tender. The amount defaults to the balance; type a smaller figure to take part of it, and the drawer reads “Take UGX … · UGX … left”.

Tender types (as offered by the terminal)
FieldTypeNotes
CashUGX drawerQuick-cash chips 10K · 20K · 50K · 100K · 200K, Exact and Half, plus a numpad. Cash above the balance is change: the button reads “Settle · change UGX …”, the tender is stored net and the change is printed on the receipt.
Mobile MoneyMTN / AirtelProvider select (MTN Mobile Money · Airtel Money), Reference / phone (at least 3 characters) and the amount pad. Never above the balance.
CardVisa · MastercardCard auth reference (“Auth code or last 4 digits”, at least 3 characters) and the amount pad. Never above the balance.
Charge to RoomPosts to folioCharge to room select listing every in-house room as “Room N · guest”. Takes the whole balance, so it is greyed out once another tender is on the bill. “Posts the whole balance to the guest folio as an F&B charge. It settles at check-out.”
Pay laterOn an accountFor somebody the hotel lets pay later: a regular who pays next week, a company, or the manager whose guests eat “on him”. Choose the account (each shows what it already owes), or “+ Open a new account…” right there: a name, what kind, a phone, an optional limit and how many days they have to pay. Takes the whole balance like a room charge. It is not money in the drawer: it goes on the account's folio and is paid off later from Restaurant › Pay later (Receive payment), where the cash book counts it. A bill that would take the account over its limit is refused, saying how much room is left; only a manager can raise a limit or close an account.
  1. 1
    Choose the tender, the amount and fill its field
    The button stays disabled until the tender's rule is met. A partial amount reads “Take UGX … · UGX … left”.
  2. 2
    Take UGX …
    A tender row is written for what was applied to the bill (never more than the balance), the ticket stays open with the balance on the panel, the audit log gets pos.tender.taken, and the drawer lists the tender under “Taken on this bill” with an × to remove it if it was a slip.
  3. 3
    Settle UGX …
    The tender that brings the balance to zero closes the ticket: its table goes to “needs bussing”, the audit log gets pos.ticket.closed with method, total and the number of tenders. Two guests paying their halves are simply two tenders.
  4. 4
    Print the bill first
    Print bill on the ticket panel opens the ticket as a BILL (not yet paid) to take to the table; nothing is settled by printing. The Restaurant page's Tickets tab has the same Bill or Receipt button on every row, plus a Download that saves the PDF.
  5. 5
    Receipt
    The receipt PDF opens in a new tab (/api/pos/tickets/<id>/pdf), laid out for the paper set in Settings (an 80 mm roll by default): the hotel and its TIN, the outlet, the ticket code and time, table or room, covers, Served by (whoever opened the ticket) and Cashier (whoever settled it, when that is someone else), each line with its unit price, discount, service, VAT, total, every tender and the change, then the hotel's own footer. A second print says Reprint. Toast: “Bill settled” or “Posted to guest folio”.
  6. 6
    Stock
    Every live line with a recipe depletes its stock items. Stock never goes below zero: the decrement is clamped to what is on hand, the movement records what was actually taken, and any shortfall raises the notification “Stock short: <item>” (“TKT-… needed 6 but only 4 was on hand · count and adjust”). The sale itself is never blocked.

Ticket, kitchen and table statuses

A ticket is open or closed; its kitchen status runs new → preparing → ready → served; tables carry their own status.

Ticket status
Ticket statusBalance reaches zeroCancel (no money taken)OpenClosedCancelled
  • Open → Closed (Balance reaches zero)
  • Open → Cancelled (Cancel (no money taken))

Every edit, lines, covers, table, void, discount, split, send, needs the ticket to be Open; a closed ticket answers “Ticket is closed”. Cancel on the ticket head cancels an open order nothing has been paid on: anyone who can ring up may cancel a ticket the kitchen has not seen; once items were sent, only Restaurant at Full may, and every sent line is voided with the reason. A cancelled ticket keeps its code and disappears from the open orders strip. Closing a ticket with a kitchen status of new moves it topreparing so the kitchen still sees it. The kitchen flow itself (new → preparing → ready → served) is driven from the Restaurant & kitchen boards.

Table statuses
FieldTypeNotes
freeNo ticket. Grey border in the picker.
seatedGuests sat, no ticket opened yet (blue).
openA ticket is attached to the table (purple). Set when a ticket is created on or moved to the table.
billThe ticket has been settled (amber). Set when the ticket closes.
dirtyNeeds clearing before reuse (red).

The terminal itself only writes free, open and bill; seated and dirtyexist for the floor picker's colours and for seeded data.

Ticket and line fields

What a ticket and a line carry, and the limits the server enforces.

Ticket
FieldTypeNotes
Outlet *Chosen in the top bar; fixes the menu, tables and service %.
TableOptional; from Pick table. One outlet's tables only.
Room / bookingOptional; links the ticket to an in-house guest for room charge and the Room banner.
Covers1–20Default 1. The starting number of guests for Split evenly, which can be changed in the dialog.
Note≤ 300 charsTicket-level note (API).
DiscountOne of the configured discounts; label and % are copied onto the ticket.
Line
FieldTypeNotes
Menu item *Must be on sale (not sold out). Name and price are copied at the time of adding.
Qty1–99Line total = (price + modifier deltas) × qty.
ModifiersLabel and price delta per chosen option; required groups enforced on the sheet.
Note≤ 200 charsKitchen / bar note printed on the receipt and shown on the kitchen card.
Void reason *≤ 200 charsRequired when voiding; chosen from the Settings list.

Permissions

The terminal is guarded by the Restaurant module: View to look, Can edit to ring and settle, Full for shifts, tender removal, fired-line voids and refunds.

Restaurant, Kitchen and Settings levels per role (default)
RoleRestaurantKitchenSettings
Super AdminFullFullFull
Hotel ManagerFullFullEdit
ReceptionistEditNoneNone
AccountantViewNoneNone
Housekeeping MgrNoneNoneNone
MaintenanceNoneNoneNone
Restaurant MgrFullFullNone
HR ManagerNoneNoneView
SecurityNoneNoneNone
WaiterEditViewNone
ChefViewEditNone
HousekeeperNoneNoneNone
CashierFullViewNone
None No accessView View onlyEdit Can editFull Full access
  • See the terminal, menu, tables, tickets, shift and receipts: Restaurant · View only.
  • New ticket, add/adjust/remove unsent lines, table, covers, Send, void any line with a reason, discount, split, merge, Print bill, cancel an unsent ticket: Restaurant · Can edit (the Waiter).
  • Settle a bill (Pay: cash, mobile money, card, room charge), open and close shifts, remove a tender, cancel a sent ticket, rename or resize tables, refund a closed ticket: Restaurant · Full access (the Cashier, the Restaurant Manager, the managers). A refund can also be approved by somebody who holds it, with their PIN.
  • Kitchen status (Start cooking / Mark ready / Mark served): Kitchen · Can edit or Restaurant · Can edit.
  • Approve an “(auth)” discount: the name picked in the dialog needs Restaurant · Full, Payments · Full or Settings · Full, and an approval PIN set in Staff → Accounts.
  • Approve a refund: the name picked needs Restaurant · Full (the Restaurant Manager, the Cashier, a manager).
  • Edit discounts, void reasons and outlet service %: Settings · Can edit, in Settings → Ops config.

Tips

Popular tab, search, live refresh, receipts and the audit trail.

Errors you may see

Every message the POS API can return, verbatim.

409Ticket is closed
Why
You edited a ticket that has already been settled.
Fix
Start a New ticket; closed tickets are read-only.
409Ticket already closed
Why
Pay was pressed twice, or another till settled the same ticket.
Fix
Nothing to do; reprint the receipt if needed.
4092 items not ready: 2 x Chips still in the kitchen; Tilapia not sent to the kitchen. Ask the pass to mark the food ready before taking payment
Why
The hotel takes money only after the kitchen has marked the food ready, and a kitchen dish on this bill is unsent or cooking.
Fix
Send the lines, then have the pass mark them ready; the outlet manager can take the money anyway, on record.
409This is a share of a split bill; cancel the ticket instead
Why
A share line (from a split by amount) was edited or removed.
Fix
Cancel the share ticket and split the parent again.
400Every guest's amount must be more than zero
Why
A split by amount had an empty or zero box.
Fix
Type an amount for every listed guest, or remove the row.
400Add items before closing
Why
Every line on the ticket is voided or the ticket is empty.
Fix
Add at least one live line, or abandon the ticket.
400Menu item unavailable
Why
The item is sold out or was deleted.
Fix
Put it back on sale in Restaurant → Menu, or ring a different item.
409Line is voided
Why
Quantity change on a voided line.
Fix
Add the item again as a new line.
409Line already voided
Why
Void requested twice on the same line.
Fix
Nothing to do.
409Use void-line for sent items
Why
A sent line was removed with the stepper instead of the void dialog (the screen normally routes this for you).
Fix
Use the bin icon and give a reason.
400No unsent lines
Why
Send was called with nothing waiting.
Fix
Add lines first; the button is disabled in this state.
400Unknown discount
Why
The discount was deactivated in Settings while your terminal was open.
Fix
Reload; pick one of the current discounts.
403That approval PIN was not accepted
Why
Wrong PIN, or the name picked may not sign this particular action off.
Fix
Re-enter it, or pick another name. The list only offers people who may approve, so a wrong PIN is the usual cause.
429Too many wrong approval PINs. Try again in 15 minutes
Why
Ten wrong taps against the same name inside fifteen minutes.
Fix
Ask somebody else on the list, or wait out the window.
400Unknown approval action
Why
The terminal asked for an approver list for something that is not a gated action.
Fix
Reload the till.
400No active lines to split
Why
Split on an empty or fully voided ticket.
Fix
Add lines first.
400lineIds required for by_item split
Why
Split by item with nothing ticked (the button is disabled on screen).
Fix
Tick at least one line.
400No matching lines
Why
The ticked lines were voided or moved by another till in the meantime.
Fix
Reload and split again.
409Cannot move KDS from <from> to <to>
Why
Kitchen status can only advance one step: new → preparing → ready → served.
Fix
Advance step by step on the Restaurant board.
400Select the mobile money network
Why
Mobile Money tender without a provider.
Fix
Choose MTN or Airtel.
400Room or booking required for room charge
Why
Charge to Room without a room selected.
Fix
Pick a room in the Charge to room select.
409No checked-in guest in that room
Why
The chosen room has no checked-in booking (guest left, or not yet arrived).
Fix
Choose another room or a different tender.
400Booking required for room charge
Why
Neither room nor booking could be resolved (API).
Fix
Send a roomId or bookingId.
409No open folio for this booking. Check the guest in first
Why
The guest is checked in but has no open folio, or checked out already.
Fix
Check the guest in, or settle by cash, mobile money or card.
409Folio is closed
Why
The folio closed at check-out before the charge posted.
Fix
Settle by another tender; hand the receipt to Payments if it must be billed later.
409Shift SHF-… is already open for this outlet
Why
One open shift per outlet.
Fix
Close the open shift first (it shows in the terminal chip).
409Shift already open for this outlet
Why
Two opens raced; the database constraint refused the second.
Fix
Use the shift that won.
409Shift already closed
Why
Close called twice.
Fix
Read the report from /pos/shifts/:id/report.
400outletId required
Why
The current-shift query was called without an outlet (API).
Fix
Pass the outlet id.
403Your role (<role>) has "View only" on Payments; this action needs "Can edit".
Why
Your Payments level is too low for the button.
Fix
See User Roles; ask a Restaurant Manager or Accountant.

Terms

Outlet, ticket, cover, sold out, tender, room charge, shift.

Outlet
A selling point (restaurant, bar) with its own menu, tables, service % and shifts.
Ticket
One bill (TKT-…): lines, discount, totals, one tender. Open until settled.
Cover
A guest at the table; sets how many ways Split evenly divides.
Sold out
Off the menu for now (kitchens call it 86'd). A sold-out dish cannot be rung and is hidden on the till until it is back on sale.
Tender
How a ticket is settled. The terminal offers Cash, Mobile Money, Card and Charge to Room; the shared tender enum also lists cash, momo, card, room, voucher, staff for reporting.
Room charge
A tender that posts the ticket to the in-house guest's open folio; settled at check-out.
Shift
An opened/closed trading period per outlet (SHF-…) with a float and a close report.

Refunding a closed ticket

Restaurant Mgr

A cash, card or mobile-money ticket that closed by mistake is reversed from the Restaurant tickets table; Restaurant Full only.

Rung twice, wrong table, a guest who sent the dish back after paying: the bill has to come back out of the till, and the books have to show it. Restaurant → Tickets shows a Refund button on every closed ticket that was paid at the till.

  1. 1
    Click Refund
    The dialog “Refund TKT-…?” asks for a Reason (required, it goes on the audit trail and the receipt) and whether to Return the ingredients to stock (ticked by default; untick when the food actually left the kitchen).
  2. 2
    Confirm “Refund UGX …”
    Every tender on the ticket is mirrored as a negative tender of the same method, the ticket is stamped refunded with who did it, and the toast reads “TKT-… refunded”. The row shows a Refunded badge and the ticket drops out of Sales today, the reports and the night audit.
  3. 3
    Hand the money back
    The receipt (Print) now carries a REFUNDED band and the negative tender rows; give it to the guest with the cash. A shift cash-up nets the refund against the day's cash.