Ringing Up a Sale
Overview
This page covers the product POS screen — the main selling screen where your cashiers build a basket, attach a customer, and take payment. It's the screen the app opens on for a register set to charge by product (a register set to charge by amount opens a simpler amount-entry screen instead).
The flow is always the same: pick products → (attach a member) → take payment. This page walks the whole screen end to end, including the trickier corners — custom items, variants and modifiers, parked baskets, vouchers and discounts. For the loyalty side of a sale — what members earn and how staff redeem it — see At the Counter.
Register-driven
Most of what a cashier sees is set by the register (till) they logged in to, plus the outlet's order settings. Column count, default order mode, which payment tiles appear, whether service charge shows — all come from that configuration, fetched at login and refreshed on pull-to-refresh. See Registers & Shifts.
What it looks like
The selling screen has three regions:
- Category strip (top) — a horizontal row of category tabs, the active one underlined, plus a grid icon that opens the full ALL category menu.
- Product grid (centre) — the products in the chosen category. The number of columns and the product-name font size are configurable per register (see below).
- Basket panel (right on tablet; a separate Basket screen on phone) — the running cart, totals, and the Pay actions.
Above the categories, program-type shortcut buttons (such as a loyalty product catalogue) appear whenever no search is active — a quick jump to special product sets.
Finding products
The grid and categories
Tap a category tab to show its products. Tap a product to add it: a plain product drops straight into the basket, while a product with variants, modifiers, or a bundle opens Product Detail first. The grid icon toggles the ALL view — every category at once.
The grid adapts to the register. You (or your staff) can change two things on the tablet itself, under Settings → Outlet Register:
| Setting | What it does |
|---|---|
| Product Number of Columns | How many columns the grid shows — 2 to 6. |
| Product Name Font Size | Product name text size — 12 to 28. |
Products are also filtered by the current order mode — an item marked dine-in-only won't show in Take out, and vice versa.
Search
The search box filters products as you type. It matches three things, case-insensitive:
- Name — any part of the product name.
- Code — the product code (begins-with).
- Tag — product tags (begins-with).
If exactly one product matches and you submit the search, it's added to the basket straight away — handy for a quick code lookup. On tablet the search box sits in the header; on phone it sits above the grid.
Scanning
There are two ways to scan:
- Hardware barcode scanner — an attached scanner adds the matched product straight to the basket ("{name} added to basket", with a notification sound). If the scanned product has modifiers or a bundle, it routes to Product Detail instead ("{name} has modifiers or bundle"). No match shows "Product not found".
- Camera scan — the scan icon opens the camera scanner. This needs camera permission on the device.
Order mode
The header carries an order-mode toggle — Dine in (shown as Eat in on retail registers) versus Take out. The active mode is highlighted, and it sets the mode for the whole basket. The register's Default Order Mode decides which one a new basket opens in.
You can change mode at three levels:
- Whole basket — tap the other mode in the header.
- Bulk — long-press either mode button to "Change all items to takeout" / "Change all item to Eat-in".
- Per item — flip a single line from its item popover (see The basket). A mismatched line shows a small restaurant/bag badge.
Custom and open-price items
Custom item
When the outlet allows it, a tray-plus icon opens the Custom item modal to add an ad-hoc line that isn't in your catalogue:
- Product Name — required.
- Product Price — required.
- Description — optional.
- Tags — optional.
Tick Add this to product master to also save it permanently to your catalogue. That reveals more fields — Product code, an Is track quantity toggle with an Inventory count, a category dropdown, POS/Customer visibility toggles, and Is Dine-in / Is TakeOut order-mode toggles.
Custom item is a setting
The tray-plus icon only appears when Allow Open Item is enabled in the outlet's order settings. If you don't see it, that's why.
Open-price products
A product flagged as open-price opens Product Detail with a Price field — the operator types the price before adding. The Add button stays disabled until a non-zero price is entered. (On iOS a Clear/OK keyboard accessory appears.)
Parking baskets (QSR tabs)
On retail/QSR registers the basket header shows numbered basket tabs with a + to open a new one. Each basket keeps its own items and its own attached customer — park one half-built order, start another, and switch back without losing anything. Switching to a tab restores that basket's member; a brand-new basket starts with no member.
Variants, modifiers and bundles
Products with options open Product Detail before they reach the basket.
Variants
Pick a variant combination — price and stock update as you choose. If the chosen variant is inactive or deleted, the Add button disables and the price falls back to the base product. Selected variants show as chips on the basket line.
Modifiers
Modifier groups show their items with quantity steppers and add-on prices.
- Min/max rules gate the group. The quantity auto-bumps to
1once all mandatory modifiers are first satisfied. - Reset Choice clears the current selections.
- A mandatory modifier that's left unfulfilled later blocks checkout and highlights the basket line in red — "⚠ Modifier not fulfilled". Fix the line before you can pay.
Bundles and combos
A bundle shows grouped sub-product lists, each with its own min/max quantity ("Min quantity(n)"), steppers, and per-sub-item modifiers. A group that hasn't met its minimum disables Add. An out-of-stock component blocks a quantity increase unless negative inventory is allowed. A display-config control toggles how the bundle's contents are shown.
Remarks, special requests and best-before
Product Detail also carries:
- Remarks — a free-text box.
- Special requests — if the product defines request levels, a Select Level chip row appears, then Special Requests chips (e.g.
Less Sugar) that combine into the remarks. - Best Before Info — a note field on applicable items.
Remarks and best-before show on the basket line and print on the kitchen chit.
The footer shows the computed total and an Add button — or Update when you're editing a line that's already in the basket.
The basket
The basket panel lists each line with its image, name, variant chips, tags, unit price, line total, a quantity stepper (− / editable field / +), and a delete (X) icon. Free items read "Free" or "Fixed price". An empty basket shows "Empty basket".
- Quantity — use the stepper or type into the field. An out-of-stock product blocks an increase ("{name} out of stock").
- Delete — removes a plain line immediately. (On a line already sent to a table order, deleting opens a Deleted Reason modal — a reason is required, and you must remove any linked voucher first.)
- Edit — tapping a non-table line reopens Product Detail to edit it.
- Discount — long-press a line to open the per-item discount modal.
The item popover
Tapping a confirmed table line opens a popover with Dine In/Takeaway, Tag, Edit, Keep (bottle keep), Reprint, Rush (reprints the line marked Rush), and Delete. A non-table line shows Dine In/Takeaway, Tag, Edit, and Delete. Tag opens a tag-selection modal — chosen tags render as chips on the line.
BCRS deposit
Singapore only
The BCRS beverage container deposit is part of Singapore's container-return scheme and appears only on eligible beverage items at SG outlets.
Eligible beverage lines (and bundle sub-items) show a tappable +$0.10 BCRS toggle — orange when on, struck-through grey when off. The total appears as BCRS Deposit in the footer. Toggling BCRS on a table item updates the live order and clears any line discount on that line.
The basket footer
The footer is the running breakdown:
| Line | What it shows |
|---|---|
| Total pieces | The item count. |
| Sub total | The basket before charges and discounts. |
| Discounts | Each discount as a removable line (name/percent + remarks). |
| Voucher payments | Allocations from payment-linked vouchers. |
| Svcs (service charge) | Hidden when the outlet's service-charge type is none. Shows a Member badge when auto-removed for a member, or a manual Remove/Add-back toggle when the register allows it. |
| Tax / GST | Inclusive or exclusive; one or more named taxes. |
| BCRS Deposit | The container deposit total (SG). |
| Total | The grand total. |
| Description | An order-level note box (saved when you tap away). |
Members and service charge
Attaching a member with an active membership auto-removes the service charge and re-prices the whole basket — products, modifiers, vouchers and discounts — at the member's tier price. The Member badge on the Svcs line shows when this has happened.
Attaching a customer
To earn or redeem loyalty, the customer must be attached. Tap the customer button in the basket header.
The Select User screen opens. Search by phone or username, or scan a member QR/card. Matches list name and phone; a guest shows as "(Guest)".
No match? Tap "+ Add '{query}' as a new customer" to open the create form:
- Phone (with country code) — required.
- Email, First name, Last name, Birthday (date picker), Gender (M by default), Password + confirm.
Which fields show and which are required is set by your merchant signup-field configuration. After creating, the customer is attached to the sale.
Tap the attached customer to open their card — avatar, name (or "(Guest)"), active tier ("{Tier} member"), email, phone, Point balance, store Credit, and (if enabled) Post-pay remaining credit. Remove detaches them (and clears member vouchers and free items); Bottles views their kept bottles.
For the full loyalty walk-through — points, redemption, what the member sees — see At the Counter.
Vouchers and discounts
Vouchers
Tap Voucher to open the Vouchers modal. With a member attached there are two tabs — Member Vouchers (their available vouchers, searchable) and Search by Code (enter or scan a code). Without a member, only the code-search box shows. Voucher cards show name, code, image, and expiry ("Unlimited" if none); used, expired, or claimed-by-another vouchers are disabled ("ALREADY USED").
Many voucher types are supported — cash/gift, percent discount, free item or fixed-price item, item cash, item discount, free modifier, combo-lowest-item-free, mix & match, and payment-linked (used as a tender at payment). Free-item vouchers prompt you to pick the free product. Payment-linked vouchers add a Voucher Payment balance you spend on the Payment screen.
One voucher or many
When the outlet's stack-voucher setting is single, only one voucher can be applied per sale. See Vouchers for the types and rules.
Discounts
Tap Discount for a modal with three tabs:
- Amount — a flat amount off, via a numpad.
- Percent — a percentage off, capped at
100. - Programs — your pre-built discount programs.
Apply a discount to the whole order, or long-press a line to apply it to that one item. A discount can't exceed the discounted subtotal (you'll see "X greater than discounted (Y)"). Items flagged Excluded from discount are skipped and labelled on the line.
Discounts are permission-gated
The Amount/Percent tabs need the Open Discount permission and the Programs tab needs the Program Discount permission. A cashier with neither sees "No permissions". Grant these per role in Roles & Permissions.
When a member is attached (QSR) or an order is confirmed (table service), Rewardly also auto-applies the best eligible discount for you — the server recomputes the final amount.
Taking payment
The checkout actions sit at the bottom of the basket as two swipeable pages:
- Page 1 — clear basket, Discount, Voucher, then Pay $X and an optional default quick-pay button (e.g. Cash $X, pre-rounded).
- Page 2 — Pay (no printing) and the default payment without printing a receipt.
Pay routes to the payment screen. Before it does, a few guards run:
- The shift must be open — otherwise "Shift closed! Open a shift?".
- Any unfulfilled mandatory modifier blocks the sale.
- A member is required for loyalty/program products — "Must select user for program products".
Tapping cash on an empty cart just opens the cash drawer for manual handling. The default quick-pay tile is whichever payment method is flagged as default, and its cash amount is rounded by the outlet's rounding rule.
Offline checkout is limited
With no connection, only plain products can be paid (cash). Anything needing the server — program products and vouchers — is blocked: "Sorry, there is a product in the cart that cannot be purchased offline."
For tenders, split payments, and the payment screen itself, see Payments. For dine-in tables, confirming to the kitchen, and splitting the bill, see Table Service.
Related
- At the Counter — the loyalty walk-through for a sale.
- Payments — tenders, split payment, and the payment screen.
- Table Service — dine-in tables, confirming, and split bills.
- Vouchers — voucher types and stacking rules.
- Discounts — building the discount programs that show on the Programs tab.
- Registers & Shifts — the register settings that drive this screen.