The Point of Sale module is the front-line of Vendra. It is where cashiers process transactions, accept payments, manage customer accounts, and handle returns. Every sale made at the POS automatically reduces inventory stock and creates accounting journal entries — no separate data entry required. This chapter explains every aspect of the POS, from the first time you open a session through to closing, reporting, and full terminal configuration.
The POS dashboard
The POS dashboard is the first screen you see when you open the Point of Sale module. It shows all configured terminals as cards. The default installation includes two terminals:
- Shop — A standard retail checkout terminal for general merchandise sales. Optimized for barcode scanning and rapid product selection.
- Restaurant — A full-service restaurant mode terminal with table management, floor plan layouts, self-ordering support, and kitchen preparation printer routing.
Each terminal card shows whether there is an active session running and, if so, a live count of orders taken since the session opened. You can also view the summary of the last closed session from the dashboard without opening a new session.
Opening a POS session
A session is the working period during which a terminal is active. You open one at the start of a shift and close it at the end. All transactions during that period are recorded against that session, making session-level reporting precise.
Click Point of Sale in the left sidebar to open the POS module.
Find the terminal card (Shop or Restaurant) and click the Open button. If pos_financial_security is enabled, the system will prompt for an employee PIN.
If your terminal is configured to track the opening cash float, enter the amount of cash in the drawer at the start of the shift. This becomes the baseline against which the closing cash count is compared.
The live POS interface loads. The product grid is on the right, the order list on the left. You are ready to process sales.
Processing a sale
The POS interface is designed for speed. Products are retrieved by barcode scan (with any USB or Bluetooth scanner), by typing a product name or reference code into the search bar, or by clicking category tabs and product tiles on screen.
Adding products to an order
Scan the product barcode or tap the product tile. The item is added to the order line with a quantity of 1. To change the quantity:
- Click the quantity shown on the order line and type the new amount on the numeric keypad.
- Or press the +/− buttons to increment or decrement one unit at a time.
If a product has variants (e.g., size or flavor), a variant selector popup appears after you add the product to the order. Select the specific variant before continuing. The variant's individual barcode, price, and stock are used for the transaction.
Customer lookup and loyalty
To associate a sale with a named customer, click the Customer button at the top of the order (the person icon). Search by name, phone number, or email. Select the customer from the list. Once a customer is on the order, their assigned pricelist is applied automatically if pricelists are enabled.
Customer accounts allow you to track purchase history and apply loyalty programs. If the POS Loyalty module is installed, a loyalty points balance is shown for the customer and points can be redeemed during checkout to provide discounts.
Applying discounts
Discounts must be enabled in the terminal settings before they are available in the live POS interface. The relevant setting is pos_discount_amount.
How to apply a line discount
- Add the product to the order.
- Select the order line for that product.
- Click the Disc% button (or the discount field) on the order line.
- Enter the discount percentage using the keypad.
- The line total recalculates immediately.
The maximum discount a cashier can apply is set in the terminal configuration. If a cashier attempts to apply a discount above their permitted level, the system will require a manager authorization code or PIN. This prevents unauthorized discounting while keeping the workflow fast for valid discounts.
Global order-level discounts (applied to the entire order rather than individual lines) can also be enabled. The same authorization rules apply.
Payment methods
Vendra's POS supports multiple payment methods simultaneously. A single transaction can be split across payment methods — for example, part cash and part M-Pesa. Each method is tracked separately in the session report for accurate reconciliation.
Cash
Enter the amount tendered. The system calculates change automatically. The denominations breakdown is used during session closing to count the drawer. All cash posts to the Cash journal in accounting.
Bank / Card
For card payments via a connected hardware terminal (e.g., Stripe Terminal), select Bank. The terminal initiates the card transaction. Once approved, the POS confirms automatically.
M-Pesa (manual)
The cashier enters the M-Pesa transaction code from the customer's confirmation SMS to manually record the payment. Useful as a fallback when STK Push is unavailable.
M-Pesa STK Push
The cashier enters the customer's phone number. Vendra sends a push notification to the phone. The customer enters their M-Pesa PIN. Confirmation is automatic — no manual entry needed. The fastest and most accurate mobile money method.
Customer account
For credit account customers, sales can be posted to their account balance. The invoice remains open in accounting and the customer settles it through a bank transfer or later payment.
Split payment
At the payment screen, add a first payment method and amount, then click Add Payment Method to add a second. The order is validated once the tendered total equals the order total.
M-Pesa STK Push step by step
- At the payment screen, select M-Pesa STK Push as the payment method.
- Enter the customer's M-Pesa phone number in the format 2547XXXXXXXX.
- Click Send Request. Vendra calls the Safaricom API and pushes a payment prompt to the customer's phone.
- The customer receives a notification on their phone asking them to enter their M-Pesa PIN to authorize the payment.
- The POS status changes to Pending while waiting for the customer's confirmation.
- Once the customer authorizes, the status changes to Confirmed automatically.
- Click Validate to complete the transaction. The receipt is issued and the M-Pesa transaction is logged in the M-Pesa Transactions module.
STK Push requires your Safaricom Daraja API credentials to be configured in Settings. If the API call fails or the customer declines, the cashier can fall back to M-Pesa Manual and enter the transaction code from the customer's confirmation SMS instead.
VAT receipts
When pos_vat_receipts is enabled on a terminal, every printed receipt includes:
- Your company name and address
- Your VAT / KRA PIN registration number
- A line-by-line tax breakdown showing net amount, tax rate, and tax amount
- Total tax collected
- Unique receipt number
- Cashier name and session reference
This format satisfies KRA requirements for VAT-registered businesses. Customers who request a proper VAT invoice (rather than a receipt) can be issued a full invoice from the POS — click Create Invoice during the payment step. A full invoice is then available in the Accounting module and can be sent by email.
Real-time inventory control
When pos_stock_control is enabled, every POS sale immediately deducts the sold quantity from the inventory system. This happens at the moment the payment is validated — not at session close. This means:
- If the same item is scanned at two terminals simultaneously, both deductions are processed correctly against the shared stock pool.
- The warehouse team can see live stock levels at any time during the day without waiting for session close.
- When a product stock level drops below its reorder point as a result of POS sales, the replenishment system flags it immediately.
- If a product is out of stock, the POS can be configured to warn the cashier or prevent the sale entirely.
To see current stock levels from inside the POS, the product detail view shows the available quantity. This is visible to cashiers when they long-press or hover on a product tile.
Returns and refunds
Processing a return in Vendra requires finding the original sale and creating a return order against it. This ensures full traceability — the refund is linked back to the original transaction.
How to process a POS return
- Go to Point of Sale → Orders → Orders (the back-office view, accessible from the menu inside the POS or from the main POS module menu).
- Find the original order — search by order number, date, customer name, or product.
- Open the order and click Return.
- A return dialog appears showing all products on the original order. Select the products and quantities being returned.
- Click Return to create the return order.
- The return order opens in the POS interface. Select the refund payment method — typically the same method as the original payment. For cash, the refund posts to the cash journal. For M-Pesa, it is typically refunded as cash unless a reverse payment process is used.
- Validate the return. Stock is added back to the warehouse and an accounting entry reverses the original sale entries.
Cashier management and security
When pos_financial_security is enabled, cashiers must log into the POS terminal using their employee PIN before they can process any transactions. This provides per-cashier accountability — every sale is tagged to the specific employee who processed it.
Employee PIN setup
Each employee's POS PIN is configured on their employee record. Go to Employees → [Employee Name] → HR Settings tab. Set a 4 to 6-digit PIN in the POS PIN field. The employee uses this PIN to log in at the terminal.
Switching cashiers during a session
On a shared terminal, the current cashier can log out without closing the session. The next cashier enters their PIN to take over. All subsequent transactions are recorded under the new cashier. At session close, the system shows a per-cashier breakdown of sales, payments, and discounts given.
Closing a session and Z-reports
Closing a session reconciles all payments and finalizes the accounting entries for that shift period.
How to close a POS session
- From inside the live POS interface, click the hamburger (menu) icon in the top-right corner.
- Select Close Session.
- The closing screen shows the expected closing amounts per payment method — cash, M-Pesa, card — based on the transactions recorded during the session.
- For cash, enter the actual physical cash count using the denomination grid. Count each denomination (1000, 500, 200, 100, 50, 20, 10, 5, 1 shilling) and enter the count. The system calculates the total from your counts.
- Any difference between the expected cash and your physical count is shown as a discrepancy (over or short). This is recorded in the session report.
- Review the totals for all other payment methods. These are already confirmed electronically, so no counting is needed.
- Click Close Session to finalize. The session is saved, stock levels are confirmed (if using batch stock update instead of real-time), and all accounting entries are posted.
The Z-report
After closing a session, the system generates a Z-report — the session's final summary. This report contains:
- Session opening and closing times
- Total sales revenue for the session
- Breakdown of sales by payment method (cash, M-Pesa, card, customer account)
- Total discounts applied
- Total taxes collected
- Expected vs. actual cash with the discrepancy amount
- Per-cashier sales totals (if multiple cashiers used the terminal)
- Number of orders, average order value
The Z-report feeds directly into the accounting module. The session's revenue figures post as a single journal entry — debit cash/M-Pesa/card accounts, credit the sales revenue account, credit the VAT payable account. This means end-of-day accounting is already done by the time the session closes.
POS configuration options
The full configuration for each terminal is accessible at Point of Sale → Configuration → Point of Sales → [Terminal Name]. Key configuration sections:
Restaurant mode
Enable Restaurant Mode to transform the terminal into a table-service interface. This activates:
- Floor plan selection at session open
- Table-based order management (orders are held per table)
- Kitchen preparation ticket printing (orders route to preparation printers by product category)
- Split bill functionality
- Self-ordering via QR code (customers scan a code at the table and order on their own device)
Payment configuration
- Invoicing policy — Choose whether customers receive a standard POS receipt or a full VAT invoice by default.
- Tips — Enable tip collection at the payment step. Tips are tracked separately in the session report.
- Payment methods — Select which payment methods are active on this terminal.
POS interface
- Products per page and display style (list or grid)
- Visible buttons and controls on the POS screen
- Starting screen category (opens on a specific product category)
Sales settings
- Global discount toggle (pos_discount_amount)
- Manual price override permission
- Automatic pricelist application
- Sales order creation (link POS orders to a Sales module order for post-sale tracking)
Receipts and bills configuration
- Company logo on receipts
- Custom header text (e.g., "Thank you for shopping with us")
- Custom footer text (e.g., return policy, social media handles)
- VAT number display on receipt
- Automatic print on payment
- Receipt number format
Inventory settings
- Real-time stock control on/off (pos_stock_control)
- Warehouse assignment (which warehouse's stock this terminal depletes)
POS reporting
The POS module has four dedicated reports accessible from Point of Sale → Reporting:
- Orders Report — Summary of all POS orders with filtering by date, terminal, and product category. Shows total sales, taxes, discounts, and payment method breakdown.
- Sales Details — Line-level view of what was sold. Shows per-product quantities, unit prices, and revenue. Useful for understanding which products drive the most volume and value.
- Session Report — Per-session summary covering opening and closing balances, expected vs. actual cash, total payments by method, and discrepancies. This is your primary audit tool per cashier session.
- POS Profit & Loss — Profitability report showing revenue, cost of goods sold, and gross margin per product or category. Helps identify which product lines are most profitable at the retail level.
All reports support export to Excel and PDF. Date range filters allow you to view data for any period — today, this week, last month, or a custom range.
Product variants at POS
When a product has variants (different sizes, colors, or flavors), the POS handles them in two ways:
- Barcode scan — Each variant has its own barcode. Scanning the variant's barcode adds the correct variant directly to the order with no popup needed.
- Manual selection — When a product is added by clicking the tile (without scanning a specific variant barcode), a variant selector appears. The cashier taps the correct attribute combination (e.g., Size: 500ml, Flavor: Mango) and that variant is added to the order.
Variant-level pricing, stock tracking, and tax all apply independently per variant. A 1L bottle and a 500ml bottle of the same product can have different prices, different barcodes, and separate stock levels — all managed automatically.
The POS Lot Selection feature (pos_lot_selection) enables cashiers to select a specific lot or serial number when adding a product to an order. This is used in pharmacies (to record which batch of medicine was dispensed) and for serialized electronics (to record the exact unit sold by serial number).