Purchase orders are non-posting transactions: they do not create journal entries or affect general ledger balances. Along with sales orders, they are DualEntry’s two non-GL transaction types. GL impact happens only when the PO is converted to a bill, which posts to accounts payable and the referenced expense or asset accounts.Use purchase orders when you need to record a spend commitment, run it through approval, and match it to a receipt and bill later, without hitting the ledger until the bill is booked. Open PO amounts still appear in cash flow forecasts and budget consumption views as committed (but not yet posted) spend.
Creating a purchase order
Navigate to Money Out → Purchase Orders and select New purchase order, or send aPOST to /public/v2/purchase-orders/. A purchase order requires a vendor, an order date, and at least one line item. Each line item includes a description, quantity, unit price, account, and optional classification dimensions.
You can attach supporting documents (quotes, contracts, scope of work) via the UI or the /public/v2/purchase-orders/{id}/attachments/ endpoint. Attachments follow the same immutability rules as bill attachments.
DualEntry validates required fields at submission. The vendor must be active, the order date cannot fall in a period locked for A/P, and each line item must reference a valid expense or asset account. A PO that will not save late in the close is usually hitting the period lock rather than a field-level problem. If your organization uses budgeting, the system can also check whether the PO amount fits within the remaining budget for the selected account and period.
PO approval and receiving
Purchase orders support dedicated approval workflows with thepurchase_order record type. A common pattern is to require department head approval for POs under a threshold and executive approval above it.
Once all approval stages pass, the PO status moves to approved and it becomes available for receiving and billing. Rejected POs return to the requester with reviewer comments. Email defaults for the PO itself, the subject and message used when you send it to a vendor, are set under Settings → Organization → Purchase Orders.
When goods arrive, record receipt against the PO with Create Item Receipt (shown as Receive Inventory on the PO). Each receipt line references a PO line and specifies the quantity received, so you can see what is still outstanding against the order.
Partial receipts are supported. If a vendor ships in multiple batches, record a receipt for each delivery. Item receipts are inventory records and are listed under Accounting → Inventory → Item Receipts.
Matching a bill back to its PO
DualEntry links a bill to the purchase order it came from, and tracks how much of the order has been billed. A purchase order carries one of three billed states:- Unbilled: no bill has been created against the order yet
- Partially billed: some value has been billed and a balance remains open
- Billed: the full ordered value has been billed
Converting a PO to a bill
When you are ready to record the vendor’s invoice, you can convert an approved PO directly into a bill. Open the PO and select Create bill, or use the API to create a bill that references the PO ID. DualEntry pre-populates the bill’s line items from the PO, adjusted for any receiving variances. The resulting bill enters the standard bill approval workflow. The link between PO and bill is preserved, so reporting can trace spend from commitment through payment. You can convert a PO to a bill in full or in part, billing only the received lines and leaving the remainder on the PO for a future bill. If the vendor’s invoice differs from the PO (for example, a price increase or additional charges), edit the bill after conversion. Nothing blocks the difference automatically, so the bill’s approval workflow is where that variance should be caught.PO status tracking
Purchase orders move through these statuses:- Draft - created but not yet submitted for approval.
- Submitted - in the approval workflow.
- Approved - approved and available for receiving.
- Partially received - at least one item receipt recorded, but not all lines are fulfilled.
- Received - all ordered quantities have been received.
- Billed - the full ordered value has been billed.
- Closed - fully received and billed, or manually closed.
- Voided - cancelled before receiving.
record_status parameter to monitor open commitments. Billed status is tracked separately from record status, so filter on it when you want the billing picture rather than the approval picture. The PO list also supports filtering by vendor, date range, and amount, which is useful when reconciling outstanding commitments at period end. For cash flow forecasting, open POs feed into the budgeting and forecasting module as uncommitted spend.
Related resources
- Bill management - the downstream record created from POs
- Vendor payments - paying the bills that originate from POs
- Approval workflows - configuring PO approval routing
- Budgeting and forecasting - using PO commitments in cash flow projections

