Omnix
All docs
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](/docs/receiving-stock) — the receive flow itself
  • [Suppliers](/docs/suppliers) — supplier ledger + balances

Was this helpful?

If something is wrong or missing, WhatsApp the owner. We update the docs every time a real question comes in.