Billing
Ring up a sale in CloudPOS. Add products, pick a customer, set delivery, discount and payment, then confirm, print or send by WhatsApp.
Billing is the main sales screen. You add products to the cart, choose a customer, set delivery, discount and payment, and then confirm the order. Most sales staff land here after sign-in.
You open it from the side menu:
- Home opens the standard billing screen (permission
menu.home.main.access). - Billing opens the same screen in supermarket mode (permission
menu.supermarket.main.access).
Sales executives (sales_executive) land on Billing after sign-in. Users with the restaurant_sales role see the restaurant layout instead. See Restaurant and kitchen.

*Home / Billing: the new-order screen with an empty cart*
Quick start: sell two buckets to a new customer
This is the demo sale used across these docs. Store "متجر النجمة Store", counter 11, prices in SAR.
- Scan or search classic chicken bucket. Tap it twice, or set Qty to 2. The price is 220.00 each.
- Add crispy chicken bucket once. The price is 218.00.
- Check the totals panel: net 658.00, tax 100.37.
- Open the customer picker. Tap Add New Customer and create Layla Al-Harbi (see Customers). She is selected automatically.
- Open payment. Enter card 400 and cash 300. The screen shows 42.00 excess. Leave Excess Amount off, so 42.00 is returned as change.
- Press F6 (Confirm and Print) or open Finalize Order and press Confirm Order (F2).
- The app prints the receipt
2-11-261027-0003. The server creates order ORD-004851, status CONFIRMED, payment Paid.

*Billing with two items: tax-inclusive prices, per-line tax amount, totals panel (net, tax, total payable, paid, balance)*
Screen layout (desktop and tablet)
The billing screen has four areas.
Area | What it holds |
|---|---|
Header | New Order / Edit Order title, customer field (Enter mobile number), customer balance, B2B/B2C selector (only when the |
Product entry | Search products box, Barcode field, category panel, product grid |
Cart | The order lines table |
Right panel | Tabs Products and Orders, the totals panel and the action buttons |
Product views
The product area has three views. Switch with the view buttons.
- Grid view: large tiles with image, name and price.
- List view: one row per product with more detail.
- Compact view: small tiles, more products per screen.
Each tile shows stock state. Out of stock means quantity 0. Low stock means the stock is at or under the reorder level.
Use Collapse categories / Expand categories to hide or show the category panel. Tap a category to show only its products.
Cart columns
Column | Meaning |
|---|---|
# | Line number |
Item Name | Product name (in the current language) |
Item Code | Only when |
Unit | Sale unit. You can pick another unit (pack, box) when |
Qty | Quantity. Decimals are allowed for weighed items |
Tax (%) | Tax rate. Shown only when |
Tax Amt | Tax inside the line total. Shown only when |
MRP | Maximum retail price. Shown only when |
Price | Unit selling price, tax included |
Total | Price × Qty, tax included |
Actions | View details, purchase history, remove |
In the demo cart the lines read: classic chicken bucket, Qty 2, Price 220.00, Tax Amt 67.12, MRP 250, Total 440.00; crispy chicken bucket, Qty 1, Price 218.00, Tax Amt 33.25, MRP 230, Total 218.00.
Totals panel
The totals panel shows:
- Subtotal and Net Total (tax included).
- Tax (the tax already inside the prices).
- Discount (when a discount or coupon is applied).
- Delivery Charge (or Free).
- Total Payable.
- Total Paid and Balance (change or amount still due).
For the demo cart: net 658.00, tax 100.37, total payable 658.00. See Payments and tax for the maths.
Adding products
Search
- Click Search products (or press Ctrl+S).
- Type part of the name, barcode or item code.
- Press Enter or tap a result to add it.
Search works on the products cached on this device, so it works offline. If no products show, use Resync Products in Settings.
Barcode scan
- Focus the Barcode field (Ctrl+A when barcode entry is enabled).
- Scan the label. The product is added with quantity 1.
- Scan again to add one more.
When BARCODE_SALES is on, the screen is tuned for scanning. If the code is not found you see "Product with barcode … not found".
Weighed and counted items (embedded barcodes)
Scale labels carry the quantity inside the barcode. The app reads two formats. Both start with 000 and end with a 5-digit payload.
Length | Layout | Use |
|---|---|---|
12 digits |
| Current format |
14 digits |
| Older format |
- For items sold by KG, the payload is grams.
01500means 1.5 kg.00725means 0.725 kg. - For other items, the payload is a piece count.
00003means 3 pieces.
Example: barcode 000123401500 adds product code 1234 with quantity 1.500 kg.
The app looks up the product code the same way as a normal barcode. To load products into the scale, use the Weigh machine download page. It exports products that have an SKU as PLU.csv. See Products and stock.
Quick tiles and Select Price
The Orders tab of the right panel shows your saved orders on top and quick-access products below. Quick-access products are products marked for quick access in the catalogue.
Tapping a quick tile opens Select Price for the product. It shows fixed quick prices: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15 and 20 (in your currency). Pick one and the product is added at that price.

*Select Price dialog: quick price buttons shown when a quick-pick product is configured with price options*
Variants, units and stock batches
- When
PRODUCT_VARIANT_ENABLEDis on, a product with variants opens Select variant. Pick one to add it. - When one product has several stock batches with different prices, a stock picker asks which batch to sell. Which fields split batches is set by the
STOCK_GROUPING_FIELDSmaster data (default: price and unit). - Change the Unit of a line to sell a pack or box. The price follows the unit's price.
Zero-price and custom items
Use Add Product (or Add Item on the product entry row) to add a line with your own name, Quantity and Unit Price. The dialog title is Set Price & Quantity.
Stock limits and oversell
ALLOW_OVERSELLis on by default. You can sell more than the stock on hand.- When it is off, quantity is limited to stock. Going over opens Oversell approval required. A user with approval can press Approve & Add to Cart.
- When
POS_HIDE_NONSTOCK_PRODUCTis on and stock tracking is enabled, products with zero stock are hidden.
Editing the cart
- Change Qty with the steppers, or focus the row and press + or -.
- Edit Price by clicking the price cell (or Ctrl+P). Users with
billing.product.editcan also edit the product itself. - Remove a line with the remove icon or Delete.
- Open product details with View details (needs
billing.product.view). - Clear Cart (F1) empties the order.
Security key for clearing
When POS_AUTHENTICATE_CLEARCART is on, clearing the cart, removing a line or deleting a saved order asks for a key. The dialog is Security Key Required: "Enter the 4-digit security key to …". The key is set by your admin in that setting's value.
Customer
Every confirmed order needs a customer.
- Click the customer field, or press F3 in Finalize Order.
- Search by name or phone ("Search by name or phone number...").
- Pick a customer. The card shows B2C or B2B, phone and balance.
- To add a new one, press Add New Customer.

*Customer picker: search by name or phone, B2C/B2B badge, selected customer panel and Add New Customer*
After you submit the form, the new customer is selected straight away.

*New customer Layla Al-Harbi selected automatically, showing her phone and SAR 0.00 balance*
Notes:
AUTO_ASSIGN_DEFAULT_CUSTOMERselects a walk-in customer by phone for you. WithHIDE_DEFAULT_PHONEon (default), that phone is masked on prints.SKIP_CUSTOMER_SELECTIONskips the customer step in checkout.
Customer purchase history
When SHOW_CUSTOMER_LAST_BUYED_PRICE_LIST is on, each cart row has a history icon. Click it, or focus the row and press H. Customer purchase history lists the last prices this customer paid for this product. Press Use This to apply an old price, or Use Current Price to keep the price.
History is not shown for the default walk-in customer.
Finalize Order
Finalize Order is the checkout dialog. It opens when you confirm (unless the skip settings are on). It has four steps, each with a function key.
Step | Key | What you set |
|---|---|---|
Customer | F3 | The customer (see above) |
Delivery | F4 | Delivery method, address, car number, date, comment |
Discount | F10 | Flat, percentage or coupon |
Payment | F5 | Payment methods and amounts |
The right side shows the Order Summary: items, net, tax, discount, delivery, previous balance and total payable.

*Finalize Order: customer (F3), delivery (F4), discount (F10), payment (F5), order summary with previous balance, and Confirm / Confirm and Print / Confirm & Whatsapp*
Use Next, Back and Skip to move between steps. Each step shows Configured or Not Configured.
Delivery (F4)
- Pick a method. The demo store has Toyou, Door Delivery, Store Takeaway, Car Delivery, Third Party logistics, Hungerstation and Dine In.
- Each method shows its price or Free.
- Fill extra fields when asked:
- Car Number: for car delivery.
- Choose an address: or Address: for door delivery. Pincode is required when
ECOMMERCE_ENABLEDis on. - Delivery Date: and Delivery Time: when
ASK_DELIVERY_DATEis on.
- Add a Comment: for special instructions.

*Delivery methods in Finalize: Toyou, Door Delivery, Store Takeaway, Car Delivery, Third Party logistics, Hungerstation, Dine In (with price or Free) and an order comment*
DEFAULT_DELIVERY_METHOD preselects a method. The demo order used Store Takeaway.
Delivery charges apply only when FREE_DELIVERY_MINIMUM_AMOUNT is enabled. See Payments and tax.
Discount and coupon (F10)
The Discount & Coupon panel is shown when DISCOUNT_AND_COUPON is on.
- Enter a Flat Discount, or a Percentage Discount (%), or pick a coupon under Select Coupon ("Search by code or name...").
- Check Net Total:, Discount Amount: and Total after Discount:.
- Press Apply Discount. Use Skip to move on, or clear the values to remove the discount.

*Discount & Coupon panel: flat discount, percentage discount or a coupon, with live total after discount*
Rules:
- A flat discount cannot be negative and cannot exceed the cart total.
- A percentage cannot be negative or above 100%.
- Coupons follow validity dates, limits and min/max order amounts. Lines with an offer are excluded.
Payment (F5)
The payment dialog lists the methods from the PAYMENT_METHOD master data (the demo has Cash, Card and others). Sell on Credit is always added.
- Tick one or more methods. Each method has a shortcut: Ctrl+1 to Ctrl+5 select or focus methods 1 to 5.
- Type the amount received for each one ("Enter received amounts"). Exact cash fills the remaining amount in cash.
- Enter a Transaction Reference for card or online payments if needed (Ctrl+6).
- Watch Remaining Amount and Excess Amount.
- Press Apply Payment Methods.

*Payment dialog: split payment (card 400 + cash 300) with keyboard shortcuts, sell-on-credit remainder and 42.00 excess that can be kept as customer credit*
Split payment example
Total 658.00. Card 400 + cash 300 = 700.00. The excess is 42.00.
- With Excess Amount off, the dialog says "SAR 42.00 will be returned as change unless customer credit is enabled." This is what the demo did.
- Turn Excess Amount on (Ctrl+7) to keep 42.00 on the customer's account as credit ("Will be created as customer account credit"). Ctrl+8 jumps to the credit amount field. This is the Add To Customer Account option. The opposite is Return As Change.
The Posting Preview shows what will be saved: Cash Posted:, Card Posted:, To Customer Credit: and Cash Balance:.
Sell on Credit
Tick Sell on Credit to post the unpaid part to the customer's account. The amount is auto-calculated ("Amount Due (will be added to customer account)"). You can mix it with a part payment, for example 300 cash and 358 on credit.
You cannot use Sell on Credit and Add To Customer Account together.
Pine Labs
When PINELAB_PAYMENT is on, a terminal method shows Pay with Pine Labs. The sale continues only after the terminal approves ("Paid with Pine Labs ✓").
After payment, the header chip shows the method. With two methods it reads Multi. Total Paid and Balance update. Change is shown in red.

*Ready to confirm: customer Layla Al-Harbi, Multi payment, paid 700.00 against 658.00 with 42.00 change shown in red; history icon shows the customer's last purchase price*
Confirming the order
Button | Key | What it does | Hidden when |
|---|---|---|---|
Confirm Order | F2 | Confirms without printing |
|
Confirm and Print / Confirm & Print | F6 | Confirms and prints the receipt |
|
Confirm & Whatsapp | – | Confirms and sends the receipt by WhatsApp |
|
Save Order | F8 | Holds the order without confirming | Never |
Clear Cart | F1 | Empties the cart | Never |
SKIP_CHECKOUT_ON_CONFIRMandSKIP_CHECKOUT_ON_CONFIRM_AND_PRINTconfirm straight away, without opening Finalize Order. The default delivery and payment are used.POS_PRINT_DOUBLE_BILLprints two copies.- Open cash drawer (Alt+D) kicks the drawer through the receipt printer.
What happens after confirm
The demo order produced:
- Receipt number
2-11-261027-0003, printed at once. - Order ORD-004851, status CONFIRMED, payment Paid.
- Invoice INV-OR1002060, created automatically, ZATCA status NOT SENT.
- Receipt RCP1001953 for the payment.
Find the order in Sales → Orders. See Sales and orders.
Save Order (held orders)
Save Order keeps the order without payment. Use it when a customer will come back.
- Press Save Order (F8). You see "Order Saved Successfully".
- The order appears in the Orders tab of the right panel.
- Tap it to load it back ("Order loaded for editing"). The header changes to Edit Order.
- Change items, then confirm as usual.
F9 is Save / Offline Print: online it saves the order; offline it saves and prints. F7 (Create New Order) starts a fresh order.
A saved order can be printed (Print saved order) or deleted (Delete saved order).
Shift not opened
When COMPULSORY_SHIFT_OPEN is on, billing checks for an open shift. If none is open you see Shift Not Opened: "You must open a shift before starting sales." Press Open Shift to open one, or Go Back. See Day close and shifts.
When COMPULSORY_DAY_CLOSE_REGISTER is on, the app asks at store selection whether to close a past business day that is still open (Yes opens Day Close, No continues to the app).
Keyboard shortcuts
Press Ctrl+H for the full list.

*Keyboard Shortcuts (Ctrl+H): global, billing, cart, add-product, shared navigation and checkout shortcuts, plus the keyboard focus outline switch*
Group | Key | Action |
|---|---|---|
Global | Ctrl+H | Open this help |
Global | Ctrl+K | Show or hide the on-screen keyboard |
Global | Ctrl+D | Focus the cart (first row, Item Name) |
Global | Alt+D | Open cash drawer |
Global | Ctrl+A | Focus the barcode input (when enabled) |
Global | Ctrl+S | Focus product search |
Billing | F1 | Clear Cart |
Billing | F2 | Confirm Order |
Billing | F6 | Confirm and Print |
Billing | F7 | Create New Order |
Billing | F8 | Save Order |
Billing | F9 | Save / Offline Print |
Billing | F12 | Sidebar keyboard mode (Tab to cycle, Esc to exit) |
Cart | Delete | Remove the focused line |
Cart | + / - | Change quantity |
Cart | Ctrl+U | Focus Unit |
Cart | Ctrl+Q | Focus Qty |
Cart | Ctrl+P | Focus Price |
Cart | H | Customer purchase history |
Checkout | F3 / F4 / F10 / F5 | Customer / Delivery / Discount / Payment step |
Checkout | F2 / F6 | Confirm Order / Confirm & Print |
Checkout | F8 / F9 | Save Order / Save and Print |
Add product | F9 / F8 | Save / Save & Create |
Add product | F4 | Close |
Shared | Tab, Shift+Tab, arrows, Enter, Esc | Move, select, close |
Payment dialog | Ctrl+1…5, Ctrl+6, Ctrl+7, Ctrl+8 | Methods, reference, excess toggle, credit amount |
Phone layout
On phones, billing uses a bottom bar with four tabs:
Tab | Shows |
|---|---|
Market | Products and categories |
Billing | Barcode and quick entry |
Order | Saved orders and quick tiles |
Cart | The cart, totals and Proceed to Payment |
The checkout steps and rules are the same as on desktop.
How it works
Receipt numbers
Each confirmed sale gets a receipt number on the device before it is sent:
store-counter-YYMMDD-sequence
storeis the store id (2 for "متجر النجمة Store").counteris the POS counter number, two digits (11). Set it in Settings → POS Counter Identity. It must be unique in the store.YYMMDDis the business date (261027 = 27 Oct 2026).sequenceis the daily sequence for this counter, four digits (0003).
The sale also gets a hidden client_sale_id (UUIDv7). The server uses it to avoid duplicates. The receipt number is never replaced by the server order number (ORD-…).
Offline-first and online-first
The POS_OFFLINE_SALES setting decides how Confirm Order works.
Mode | Setting | What happens |
|---|---|---|
Offline-first |
| The sale is saved on the device with its receipt number. The receipt prints at once. The app sends it to the server once in the background. |
Online-first |
| The app waits for the server. If accepted, the cart clears and the receipt prints. If rejected, the cart stays so you can fix it. If the answer is unclear, the cart clears without printing and the sale is flagged for review. |
Sales that did not reach the server appear in Sales → Confirmed Orders. There is no automatic retry. Open that list and press Sync with Database. See Sales and orders.
Settings that change billing
Setting | Effect |
|---|---|
| Barcode scan mode |
| Extra cart columns |
| Which confirm buttons show |
| Confirm without Finalize Order |
| Customer step |
| Preselected delivery and payment |
| Delivery fields and charges |
| Discounts, offers, rounding |
| Stock limits |
| Security key for clear and remove |
| Shift and day close gates |
| Offline-first or online-first confirm |
| Two receipt copies |
| Pine Labs terminal |
| B2B/B2C selector and B2B printer profile |
Full list with defaults: Settings reference.