Core
Purchase orders
Full PO lifecycle: draft → approval → sent → partial → received. Three-way match, mixed currency, reverse-GRN, approval threshold.
A purchase order is a contract — yours, with the supplier. Omnix tracks every state transition so when something goes wrong (price drift, short delivery, currency dispute) you have the receipts.
States
``
draft
↓
pending_approval (only if total >= approval threshold)
↓
approved
↓
sent (sent to supplier — stock starts arriving)
↓
partial → received (driven by GRN cumulative quantities)
↓
[paid]
``
cancelled is reachable from any state. Once a PO is cancelled no further GRNs can be applied against it.
Approval threshold
Settings → Purchasing → Approval Threshold. Default is KES 100,000. POs with a total at or above the threshold transition through pending_approval instead of going straight to sent. An owner or admin clicks Approve — Omnix records the approver + timestamp.
You can disable the gate entirely (Settings → Purchasing → Required = off) for businesses that don't need a separation-of-duties workflow.
Three-way match
Three-way match compares PO total ↔ GRN total ↔ supplier-invoice total. Tolerance defaults to 1% (Settings → Purchasing → Tolerance). When you mark a PO as paid, Omnix runs the match and refuses if any pair drifts beyond tolerance. To unblock: reverse a GRN and re-receive at the right quantity, edit the supplier invoice total to match what you actually received, or override (recorded with a written reason in the audit log).
Mixed currency
When you create a PO with a foreign supplier, set the PO currency (USD, EUR, CNY, etc.) and the exchange rate. Line items stay in foreign currency on the PO. The moment goods are received Omnix snapshots the rate at GRN time and writes cost-of-goods into batches.buying_price in your base currency (KES). So your P&L stays correct even if the rate moves between order and delivery.
The original foreign-currency line item is preserved on the GRN for audit. The base-currency cost goes into the books.
Partial receipts
POs frequently arrive in batches. Open the PO, click Receive, set received quantity per line — for lines that haven't fully arrived just enter the quantity that did. Omnix flips the PO status to partial. Receive the rest later; status flips to received once all lines are at-or-above their ordered quantity.
See also
- Receiving stock — the receive flow itself
- Suppliers — supplier ledger + balances
Something missing?
If a step is wrong or unclear, tell us — we update the docs when a real question comes in. Book a demo for a walkthrough, or email support@omnix.co.ke.
More in Core
Point of sale
The full checkout workflow — search, scan, holds, returns, split payments, M-Pesa, card, and the customer display.
Inventory & variants
Add products, manage variants (sizes and weights), bulk-import from CSV, run stock takes, and track batches and expiry.
Cloud backup & restore
Turn on encrypted offsite backups, schedule them, and restore your database on a new machine.
Receiving stock
Manual receive vs PO-receive vs reverse-GRN. How batches get created, when stock_qty updates, what each path means for your books.