Point of Sale (POS)
Complete guide to the NkapBooks Point of Sale module — POS profiles, session management, modern checkout interface, payment processing, batch selection, loyalty programs, coupon codes, returns, and keyboard shortcuts.
7. Point of Sale (POS)
The Point of Sale (POS) module provides a complete retail checkout experience fully integrated with NkapBooks invoicing, inventory, and accounting systems. It is designed for shops, counters, and retail environments where fast, keyboard-driven transaction processing is essential.
| Sub-Feature | Description |
|---|---|
| POS Profiles | Configure different checkout counters with unique settings |
| POS Sessions (Shifts) | Open and close cashier shifts with cash reconciliation |
| POS Interface | Modern checkout UI with item grid, cart, and quick actions |
| Payment Flow | Process payments with multiple methods and automatic change calculation |
| Quick Actions | Toolbar for view toggle, loyalty, coupons, price lists, and item enquiry |
| Saved Invoices | Save incomplete invoices and resume them later |
| Sales Returns | Process returns and refunds directly from the POS |
| Batch Selection | Select specific batches when selling batch-tracked items |
| Keyboard Shortcuts | Full keyboard navigation for fast checkout |
| POS Profiles Grid | Manage all POS profiles from a central dashboard |
7.1 POS Profiles
A POS Profile defines the configuration for a specific checkout counter. Each profile controls which warehouse to use, which accounts to debit and credit, which user is assigned, and how the interface behaves.
Schema Overview
| Field | Type | Required | Description |
|---|---|---|---|
| Profile Name | Data | ✅ | Unique identifier for this POS configuration (manual naming) |
| Assigned User | Link → User | — | The user who has access to this profile |
| Default POS Customer | Link → Party | — | Walk-in customer used by default |
| Inventory Location | Link → Location | ✅ | Default warehouse for stock deduction |
| Counter Cash Account | Link → Account | ✅ | Cash account for this POS counter (Asset → Cash type) |
| Write Off Account | Link → Account | — | Account for cash discrepancies during shift close |
| Default Account | Link → Account | ✅ | Receivable account for POS invoices |
| POS Print Template | Link → PrintTemplate | — | Custom receipt template for this profile |
Settings
| Setting | Type | Default | Description |
|---|---|---|---|
| Can Change Rate | Check | true | Whether the cashier can modify item rates |
| Can Change Discount | Check | true | Whether the cashier can apply discounts |
| Ignore Pricing Rule | Check | false | Skip automatic pricing rules for this counter |
Barcode Configuration
These fields appear only when Enable Barcodes is turned on in Inventory Settings:
| Field | Type | Description |
|---|---|---|
| Weight Enabled Barcode | Check | Enable weight-embedded barcode scanning |
| Check Digits | Int | Number of check digits in the barcode |
| Item Code Digits | Int | Number of digits representing the item code |
| Item Weight Digits | Int | Number of digits representing the weight |
Button Colour Customisation
Each POS profile allows full customisation of action button colours:
| Button | Default Colour | Description |
|---|---|---|
| Save | Green (#86efac) | Save (hold) the current invoice |
| Cancel | Red (#f98080) | Cancel the current transaction |
| Submit | Green (#86efac) | Submit the invoice without payment |
| Held | Red (#f98080) | View held/saved invoices |
| Return | Red (#f98080) | Process a sales return |
| Pay | Green (#86efac) | Open the payment modal |
| Pay And Print | Green (#86efac) | Pay and immediately print receipt |
Available colour choices: Red, Orange, Yellow, Green, Teal, Blue, Indigo, Purple, Pink, Black (Grey).
SYSCOHADA Account Defaults
For businesses in OHADA member countries (Cameroon, Senegal, Ivory Coast, etc.), NkapBooks automatically maps POS Profile accounts to SYSCOHADA chart of accounts:
| Account | SYSCOHADA Default | International Default |
|---|---|---|
| Counter Cash Account | 571-Caisse Siege Social or 57-Caisse | Cash In Hand |
| Write Off Account | 651-Pertes Sur Creances Clients or 658-Charges Diverses | Write Off |
| Default Account | 411-Clients or 4111-Clients | Debtors |
User Access Control
- Each POS Profile can be assigned to a specific User.
- Only the assigned user (or an Administrator / System Manager) can access the profile.
- Profiles with running sessions cannot be modified — close the session first.
7.2 POS Sessions (Shifts)
A POS Session represents a cashier's shift. It tracks all transactions (invoices, payments, and shipments) that occur during the shift and provides a reconciliation mechanism at closing.
Schema Overview
| Field | Type | Description |
|---|---|---|
| Session No | Data (auto) | Auto-generated via Number Series (default prefix: POSS-) |
| POS Profile | Link → POSProfile | The profile this session belongs to |
| Status | Select | Running or Closed |
| Opening Date | Datetime | When the session was opened |
| Opening Amount | Currency | Total cash in drawer at session start |
| Closing Date | Datetime | When the session was closed |
| Closing Amount | Currency | Total cash counted at session close |
| Expected Amount | Currency | System-calculated expected amount |
| Difference Amount | Currency | Closing Amount − Expected Amount |
| Opened By | Link → User | User who opened the session |
| Closed By | Link → User | User who closed the session |
| Session Amounts | Table → SessionAmount | Breakdown by payment method (Cash, Mobile Money, Bank) |
| Invoices | Table → POSSessionInvoice | All invoices created during this session |
| Payments | Table → POSSessionPayment | All payments recorded during this session |
| Shipments | Table → POSSessionShipment | All shipments created during this session |
Session Amounts
Each session tracks opening, expected, closing, and difference amounts per payment method:
| Field | Description |
|---|---|
| Payment Method | Cash, Mobile Money, or Bank |
| Opening Amount | Cash placed in the drawer at session start |
| Expected Amount | Opening Amount + Transacted Amount during the session |
| Closing Amount | Actual amount counted at session close |
| Difference Amount | Closing Amount − Expected Amount |
Opening a Session
- Navigate to the POS Profiles Grid and select a profile.
- The Open POS Session modal appears.
- Enter the opening amounts for each payment method (Cash, Mobile Money, Bank).
- Click Submit to start the session.
Behind the scenes:
- A new
POSSessiondocument is created with statusRunning. - If a non-zero Cash opening amount is entered, a Journal Entry is automatically created:
- Debit: Counter Cash Account (from POS Profile)
- Credit: Main Cash Account
- This transfers cash from the main cash account to the POS counter's cash drawer.
During a Session
While the session is running:
- All Sales Invoices created are flagged with
isPOS: trueand linked to the session viaposSession. - All Payments are recorded with
isPOS: trueand tracked in the session's payments table. - All Shipments for stock-tracked items are created and tracked in the session's shipments table.
- Duplicate prevention: The system checks for already-recorded invoices, payments, and shipments before adding them to the session.
Closing a Session
- Click the Close Shift button in the POS interface.
- The Close POS Session modal displays all session amounts with expected values.
- Enter the closing amounts for each payment method.
- The system calculates difference amounts automatically (Closing − Expected).
- Click Submit to close the session.
Behind the scenes:
- Session amounts are validated (no negative closing amounts).
- A Journal Entry is created for the cash transfer and any write-offs:
- Cash Transfer: Debit Main Cash Account, Credit Counter Cash Account
- Cash Shortage (negative difference): Debit Main Cash Account, Credit Write Off Account
- Cash Surplus (positive difference): Debit Write Off Account, Credit Main Cash Account
- The session status changes to
Closed. - The application window is reloaded to return to the POS Profiles Grid.
7.3 POS Interface Features
NkapBooks uses a Modern POS layout with a split-panel design optimised for retail workflows.
Layout Overview
The POS screen is divided into two main panels:
| Panel | Position | Contents |
|---|---|---|
| Left Panel | Left side (≈50%) | Customer selector, cart (selected items), totals, and action buttons |
| Right Panel | Right side (≈50%) | Item search, item group filter, item grid/table, and quick actions |
Left Panel — Cart & Actions
Customer Selector
- A
MultiLabelLinkcontrol at the top allows selecting or changing the customer (Party). - The default customer is set from the POS Profile's Default POS Customer.
- Customer-specific pricing, loyalty points, and currency are loaded automatically.
Selected Items Table
The cart displays all items added to the current invoice:
| Column | Description |
|---|---|
| Item | Item name with image (if available) |
| Quantity | Editable quantity field |
| Rate | Unit price (editable if profile allows) |
| Amount | Quantity × Rate |
| Discount | Item-level discount (amount or percentage) |
Clicking on a row opens the Keyboard Modal for precise numeric editing of quantity, rate, or discount.
Totals Display
- Subtotal (Net Total before tax)
- Tax Amount (from applied tax templates)
- Grand Total (Net Total + Tax − Discounts)
Action Buttons
| Button | Action |
|---|---|
| Save | Save the current invoice as a draft (held invoice) |
| Cancel | Clear all items and reset the invoice |
| Submit | Submit the invoice without creating a payment |
| Held | Open the Saved Invoices modal |
| Return | Open the Return Sales Invoice modal |
| Pay | Open the Payment Modal and process payment + print receipt |
Right Panel — Item Selection
Item Search
- A text input field for searching items by name, barcode, or item code.
- Supports barcode scanning — scan a barcode and the item is automatically added to the cart.
- Weight-enabled barcode support: When configured in the POS Profile, the system extracts the item code and weight from the barcode automatically.
Item Group Filter
- A
Linkfield that filters items by their Item Group. - Only visible when Enable Item Group is turned on in Accounting Settings.
Item Display — Grid View vs Table View
The toggle button in the Quick Actions toolbar switches between:
| View | Description |
|---|---|
| Grid View | Visual product cards showing image, name, rate, and available quantity |
| Table View | Compact list showing item name, rate, unit, and stock quantity |
Both views display real-time stock availability for inventory-tracked items. Non-inventory items (services) are also supported.
Adding Items to Cart
Items can be added via:
- Search — Type the item name and press Enter.
- Barcode Scan — Scan a product barcode.
- Click/Tap — Click on an item in the grid or table.
- Quick Quantity — Type a number before scanning/clicking to set quantity (e.g., type "5" then scan).
Stock Validation:
- For inventory-tracked items, the system validates that sufficient stock is available at the POS Profile's inventory location.
- If stock is insufficient, a validation error is displayed.
- Non-tracked items (services) can be added without stock checks.
Batch-Tracked Items:
- When a batch-tracked item is added, the Batch Selection Modal opens automatically.
- The cashier selects the batch, and stock availability is validated per-batch.
Pricing Rules:
- Unless Ignore Pricing Rule is enabled on the profile, pricing rules are automatically evaluated and applied when items are added or quantities change.
- Free items from pricing rules are added with an
isFreeItemflag.
7.4 POS Payment Flow
The payment process in POS follows these steps:
Step 1 — Open Payment Modal
Click Pay (or Pay And Print) to open the Payment Modal. The modal pre-fills the amount with the invoice's Grand Total.
Step 2 — Select Payment Method
Available payment methods are loaded from the PaymentMethod table. Click a method to select it:
| Method Type | Additional Fields | Account |
|---|---|---|
| Cash | None | Counter Cash Account (from POS Profile) |
| Mobile Money | None | Linked account from Payment Method |
| Bank | Reference ID, Clearance Date | Linked account from Payment Method |
For Bank payments, additional fields appear:
- Reference ID — Bank transfer reference number
- Clearance Date — Expected date of fund clearance
Step 3 — Enter Amount
- The Paid Amount input is editable — the cashier can enter the exact amount paid.
- The system calculates Balance (if underpaid) or Change (if overpaid) in real-time:
- Balance = Grand Total − Paid Amount (shown when paid < grand total)
- Change = Paid Amount − Grand Total (shown when paid > grand total)
Step 4 — Submit Transaction
Two submission options:
| Button | Action |
|---|---|
| Submit | Create and submit the invoice only (no payment) |
| Pay | Create invoice + create payment |
| Pay & Print | Create invoice + create payment + navigate to print preview |
Transaction Processing Pipeline
When a transaction is submitted, the following operations occur in sequence:
- Validation — Verify invoice items, quantities, and stock availability.
- Invoice Submission — The
SalesInvoiceis synced and submitted, creating accounting ledger entries. - Shipment Creation — If any items have
stockNotTransferred, aShipmentdocument is created and submitted:- Location is set from the POS Profile's inventory.
- Serial numbers are applied if the item uses serial number tracking.
- The shipment is recorded in the POS session.
- Payment Creation — A
Paymentdocument is created with:isPOS: trueposSessionlinked to the current session- Payment method and account set based on selection
- The payment is synced, submitted, and recorded in the POS session.
- Session Recording — The invoice, payment, and shipment are recorded in the POS session tables.
- Invoice Recording — The invoice (with party and grand total) is added to the session.
- Cleanup — Cart is cleared, values are reset, and items are refreshed.
7.5 Quick Actions
The Quick Actions toolbar appears at the bottom of the right panel and provides fast access to POS features:
| Icon | Action | Condition |
|---|---|---|
| Grid/List | Toggle between Grid View and Table View | Always visible |
| File Text | Navigate to Sales Invoice list | Always visible |
| Award | Open Loyalty Program modal | Visible when Loyalty Program is enabled in settings |
| Tag | Open Coupon Code modal | Visible when Coupon Code is enabled in settings |
| Clipboard | Open Price List modal | Always visible |
| Search | Open Item Enquiry modal | Visible when Item Enquiry is enabled in settings |
Loyalty Badge
When the customer has loyalty points, a yellow badge shows the point count on the Loyalty button (capped at "99+").
Coupon Badge
When coupons are applied to the invoice, a green badge shows the coupon count on the Coupon button.
Validation
Both Loyalty and Coupon actions require:
- At least one item in the cart
- A customer selected
- (For Loyalty) Customer has loyalty points > 0
7.6 Saved Invoices
The Saved Invoice Modal allows cashiers to save incomplete transactions and resume them later.
Saving an Invoice
- Click the Save button in the cart area.
- The current invoice is synced as a draft (not submitted) with
isPOS: true. - The cart is cleared, and a new invoice is started.
Resuming a Saved Invoice
- Click the Held button (or use the keyboard shortcut).
- The modal shows two tabs:
- Saved — Draft invoices (not yet submitted)
- Submitted — Submitted POS invoices with outstanding amounts
- Use the search box to find an invoice by name.
- Click on an invoice to load it into the cart.
Invoice Table Columns
| Column | Description |
|---|---|
| Name | Invoice number (e.g., SINV-1042) |
| Customer | Party name |
| Date | Invoice creation date |
| Grand Total | Total invoice amount |
7.7 Sales Returns
The POS supports processing returns (credit notes) directly from the checkout interface.
Opening the Return Modal
Click the Return button to open the Return Sales Invoice Modal.
Selecting an Invoice to Return
- The modal shows all submitted POS invoices that are eligible for return:
- Must be
isPOS: trueandsubmitted: true - Not cancelled
- Not already fully returned
- Partially returned invoices are eligible for additional returns
- Must be
- Search by invoice name using the search box.
- Click an invoice to create a return (credit note) against it.
Return Processing
- A new Sales Invoice is created with
returnAgainstset to the original invoice. - Item quantities are negative, representing the returned goods.
- The return invoice goes through the same payment flow (refund) if needed.
- Stock is restored if inventory tracking is enabled.
Pagination
The return invoice list supports pagination (20, 40, or all items per page).
7.8 Batch Selection
When selling batch-tracked items through the POS, the Batch Selection Modal appears automatically.
How It Works
- When a batch-tracked item is added to the cart (via search, scan, or click), the Batch Selection Modal opens.
- The modal shows a
Linkfield filtered to batches associated with the selected item. - Select the desired batch and click Select.
- The item is added to the cart with the batch reference.
- Stock availability is validated against the selected batch's quantity.
Validation
- If the selected batch does not have sufficient stock, a validation error is shown.
- If the item is added again, existing items in the cart are checked — quantities are aggregated per item + batch combination.
7.9 Keyboard Shortcuts
The POS is fully keyboard-navigable for fast checkout. Shortcuts are context-aware and disabled when modals are open.
Keyboard Modal
The Keyboard Modal provides a virtual numeric keypad for editing cart item values:
| Key | Action |
|---|---|
| 0-9 | Append digit to value |
| . | Append decimal point |
| - | Toggle negative sign |
| + | Remove negative sign |
| Del | Delete last character |
| Clear | Reset value to empty |
| Save | Apply the value and close |
| Cancel | Discard changes and close |
Quick Quantity Input
The POS supports a Quick Quantity mode for rapid scanning:
- Type a number on the keyboard (e.g.,
5). - Scan a barcode or click an item.
- The item is added with the typed quantity instead of the default
1. - The quantity buffer resets after each item addition.
Rules:
- Only digit keys are captured (not when typing in search fields).
- If a modal is open, quick quantity input is paused.
- The quantity buffer accumulates until an item is added or a non-digit key is pressed.
POS-Specific Shortcuts
The POS registers the following keyboard shortcuts (via the useShortcuts composable):
| Shortcut | Action |
|---|---|
| Esc | Close any open modal, or cancel the current action |
| Enter | Confirm the current modal action |
7.10 POS Profiles Grid
The POS Profiles Grid (/pos-profiles) is the central management page for all POS configurations.
Profile Cards
Each POS Profile is displayed as a card showing:
| Information | Description |
|---|---|
| Profile Name | The unique profile identifier |
| Assigned User | User name (resolved from email to display name) |
| Inventory Location | The default warehouse |
| Session Status | Whether a session is currently Running or last session's closing info |
| Last Session | Closing date and closing amount of the most recent closed session |
| Session Count | Total number of sessions linked to this profile |
Card Actions
| Action | Icon | Description |
|---|---|---|
| Open/Continue Session | Play | Start a new session or continue the running one |
| Edit Profile | Edit | Open the profile form for editing |
| View Sessions | Clock | Navigate to the POS Session list filtered by this profile |
| Delete Profile | Trash | Delete the profile (with confirmation dialog) |
Additional Actions
| Action | Icon | Description |
|---|---|---|
| Create New Profile | Plus | Open a new POS Profile form |
| View Invoices | File | View all Sales Invoices linked to this profile's sessions |
| View Payments | Dollar | View all Payments linked to this profile's sessions |
| View Shipments | Truck | View all Shipments linked to this profile's sessions |
Permissions
| Permission | Description |
|---|---|
| Read | View the profiles grid and profile details |
| Create | Create new POS profiles |
| Delete | Delete POS profiles |
7.11 Item Enquiry
The Item Enquiry feature allows staff to log customer interest in products without adding them to the cart.
Item Enquiry Form
| Field | Type | Description |
|---|---|---|
| Item | Link → Item | The product the customer is asking about |
| Description | Text | Details about the enquiry |
| Customer | Link → Party | The customer making the enquiry |
| Contact | Data | Auto-filled from the customer's phone number |
| Similar Product | Link → Item | An alternative product to suggest |
When to Use
- Customer asks about a product that's out of stock.
- Customer wants to know when a product will be available.
- Staff wants to record demand for a product not currently in the catalogue.
7.12 Loyalty & Coupon Integration in POS
Loyalty Points
When Enable Loyalty Program is active in Accounting Settings:
- Assign a Loyalty Program to a customer (Party record).
- In the POS, select that customer.
- The loyalty point balance appears as a badge on the Loyalty button.
- Click the Loyalty button to open the Redeem Loyalty Points modal.
- Enter the number of points to redeem.
- Points are converted to a monetary discount using the program's Conversion Factor.
Validation:
- Cannot redeem more points than the customer has.
- The redeemed amount cannot exceed the invoice's Grand Total.
- Points must be greater than zero.
Coupon Codes
When Enable Coupon Code is active (requires Enable Pricing Rule first):
- Click the Coupon button in Quick Actions.
- The Coupon Code Modal opens.
- Search and select a coupon code from the
Linkfield. - The coupon is validated against its rules and applied to the invoice.
- Applied coupons are displayed in a list within the modal.
- Coupons can be removed by clicking the trash icon.
When a coupon is removed:
- All item-level discounts (amount and percentage) are reset to zero.
- Pricing rules are re-evaluated.
Price List Selection
Click the Price List button in Quick Actions:
- The Price List Modal opens.
- Select a price list from the
Linkfield. - Click Save to apply it to the current invoice.
- Item rates are updated according to the selected price list.
- Use the trash icon to remove the price list.
Best Practices
Setting Up POS for Your Business
- Create a dedicated Location for your POS counter (e.g., "Main Counter", "Store 1").
- Create a POS Profile with appropriate accounts and settings.
- Set a Default Customer (e.g., "Walk-in Customer") for quick transactions.
- Configure Payment Methods — ensure Cash, Mobile Money, and Bank methods exist.
- Set up a Print Template for receipts if you want custom-branded receipts.
Daily Operations
- Open Session at the start of the day with accurate opening cash amounts.
- Process transactions using barcode scanning and keyboard shortcuts for speed.
- Save invoices if you need to attend to another customer.
- Close Session at the end of the day, counting cash carefully.
- Review the session summary to identify and investigate any discrepancies.
Handling Discrepancies
| Scenario | Resolution |
|---|---|
| Cash shortage | The difference is automatically recorded via a Journal Entry to the Write Off Account |
| Cash surplus | Similarly recorded — investigate for potential errors |
| Missing stock | Review shipment records and check for un-recorded returns |
Accounting Impact
Invoice Submission
When a POS invoice is submitted, the standard double-entry accounting entries are created:
- Debit: Accounts Receivable (or Default Account from POS Profile)
- Credit: Income Account(s) for each item
- Credit/Debit: Tax Accounts (if applicable)
Payment Recording
When a payment is processed:
- Debit: Payment Account (Cash, Bank, or Mobile Money account)
- Credit: Accounts Receivable
- Outstanding amount on the invoice is updated.
Shipment
When stock is transferred:
- Stock Ledger Entries are created, deducting inventory from the POS Profile's warehouse.
- Inventory valuation is updated per the configured valuation method (FIFO or Moving Average).
Session Close — Cash Transfer Journal Entry
- Debit: Main Cash Account → receives the closing cash
- Credit: Counter Cash Account → empties the counter drawer
- Write-off entries for any positive or negative differences