Who can use this: Owner, Manager, Accountant. URL / Route:
/finance/ap/purchase-orders(finance.ap.purchase-orders.index). Detail:show,create,store,edit,update,destroy. Actions:approve,receive,convert-to-bill,send-email. Plan / feature gate:feature:enable_purchase_orders(premium). Permissions:purchase_orders.view,purchase_orders.create,purchase_orders.edit,purchase_orders.approve,purchase_orders.receive,purchase_orders.convert,purchase_orders.delete.
Purpose
A Purchase Order (PO) is a commitment to buy from a supplier. It is the procurement counterpart of a Sales Order: it records what you intend to buy before the supplier bills you. A PO does not hit the General Ledger — it is a planning and control document. When goods arrive and the supplier sends a bill, you convert the PO into a Bill.
Step by step
Create a purchase order
Route: finance.ap.purchase-orders.create / store. Permission: purchase_orders.create.
- Open Purchases ▸ Purchase Orders ▸ New purchase order.
- Pick the Supplier.
- The PO number comes from the active sequence — see Settings.
- Set the Order date and an optional Expected date.
- Add line items: product/service, description, quantity, unit price, tax.
- Save as draft, or Save and submit if approvals are on.
Approve a purchase order
Route: finance.ap.purchase-orders.approve. Permission: purchase_orders.approve.
When PO approvals are enabled (enable_po_approvals), a PO must be Approved before it can be received or converted. Approvers see pending POs in the Approval queue.
Receive goods
Route: finance.ap.purchase-orders.receive. Permission: purchase_orders.receive.
If goods receiving is enabled (enable_po_receiving), record partial or full receipts against the PO. Receiving updates the received-quantity on each line and, for stocked items, can feed Inventory.
Convert to a bill
Route: finance.ap.purchase-orders.convert-to-bill. Permission: purchase_orders.convert.
When the supplier's invoice arrives, convert the PO to a Bill. The bill inherits the supplier, lines, and amounts; you then post and pay it normally. With 3-way match enabled (enable_3_way_match), the bill is checked against the PO and the recorded receipt before posting.
What posts to the GL
A PO is procurement, not accounting — it never writes a journal at any stage:
| Stage | Journal? |
|---|---|
| Draft / Pending Approval / Approved | No journal |
| Receive goods (partial or full) | No journal — only the received-quantity counters update |
| Convert to bill | A draft bill is created — still no journal |
| Post that bill | Journal posted (see Bills — How the journal looks) |
This is why a PO does not need a period to be open, does not age in AP, and does not surface on financial reports. It is a planning and control document. The cost only hits the books when the supplier's bill is actually posted.
With 3-way match (feature:enable_3_way_match): converting a PO to a bill verifies that the bill's quantities and amounts match the PO and the goods receipt before posting is allowed. Mismatches block posting until you reconcile them.
Lifecycle
Draft ──Submit (approvals on)──▶ Pending Approval ──Approve──▶ Approved
Approved ──Receive──▶ Partially Received / Received
Approved / Received ──Convert──▶ Bill
Common mistakes
- "3-way match blocked the bill." With
feature:enable_3_way_matchon, the bill's quantities and amounts must match the PO and the recorded goods receipt before posting. Open the bill side-by-side with the PO + receipt to find the variance — fix either side, then re-post. - Partial receipt then convert. Converting a PO with only a partial goods receipt creates a bill for the received quantities only. The PO stays open for the remainder until you receive (or close) it.
- Cancelled PO with received goods. You cannot cancel a PO that has received stock — the inventory has already moved. Convert to a bill for the received portion first, then cancel the remainder.
- Currency drift. A PO carries the supplier's currency. When converting to a bill, the bill takes the rate at the bill date, not the PO date — see Multi-currency.
Behaviour and rules
- No GL impact. A PO never posts journal entries. Only the resulting Bill does.
- Premium feature. Purchase Orders require the
enable_purchase_ordersplan feature. If it is off, the menu item is hidden. - Optional sub-features. Approvals, receiving, and 3-way match are each separately switchable.