Skip to content

Expenses & purchase orders

Expenses and purchase orders sit on the buy side alongside payables. An expense posts to the ledger when approved; a purchase order is a procurement document that posts nothing until it becomes a bill.

  • Core object — an expense against a vendor and an expense GL account, with tax, accounting dimensions (cost center / department / branch / project) and optional attachments.
  • An approved expense posts to the general ledger and, when it is paid through a bank-linked account, mirrors into the bank book so it can be reconciled.
  • An expense can be flagged billable against a customer, with a markup percentage. Nothing yet pulls a billable expense onto a customer invoice: UNBILLED marks one as awaiting invoicing, and nothing sets INVOICED today. Bill it by adding the line to an invoice yourself.

The expense lifecycle is a transition graph, not a flat set of labels:

From Can be moved to
DRAFT PENDING_APPROVAL, CANCELLED
PENDING_APPROVAL APPROVED, REJECTED, CANCELLED
APPROVED UNBILLED, NON_BILLABLE, REIMBURSED, CANCELLED
UNBILLED NON_BILLABLE, REIMBURSED
NON_BILLABLE REIMBURSED
REJECTED DRAFT — a rejected expense is reworked, not dead
INVOICED terminal, and not settable by hand
REIMBURSED, CANCELLED terminal

UNBILLED is only legal for an expense flagged billable. Where an approval process covers the expense, the move to APPROVED is gated on its latest approval request; approving that request advances the expense (and posts it) in the same transaction, straight from DRAFT if that is where it was submitted.

Cancelling a posted expense is not a relabelling — it undoes the expense in the books, symmetric with an invoice or bill void:

  • The bridged bank-book row is removed first, because it is the step that can refuse. If that row is already matched to a statement line or tied to a reconciliation, the cancellation is rejected — unmatch the line, and reopen a completed reconciliation, before trying again.
  • The GL journal is then reversed, dated today rather than on the original entry date, so a closed period cannot strand the reversal.

Both happen inside one transaction, so an expense is never left half-undone. Only DRAFT, REJECTED and CANCELLED expenses can be deleted outright.

  • Core object — a purchase order to a vendor with priced, taxed lines.
  • A PO does not post to the ledger. Converting it to a bill creates the payable that posts. A bill can only be attached to the PO for the same vendor, and doing so advances the PO toward partially billed or billed.
  • A PO renders as a branded PDF you can download from the document itself; emailing it to the vendor is API-driven today, so SENT is a status you set once the PO has gone out. See Delivery.
From Can be moved to
DRAFT PENDING_APPROVAL, APPROVED, CANCELLED
PENDING_APPROVAL APPROVED, DRAFT, CANCELLED
APPROVED SENT, CANCELLED
SENT CLOSED, CANCELLED
PARTIALLY_BILLED CLOSED
BILLED CLOSED
CLOSED, CANCELLED terminal

PARTIALLY_BILLED and BILLED are billing-driven — they are recomputed from the live bills that reference the PO, not set by hand — which is why the only move out of them is to CLOSED. Cancelling or voiding a bill releases the coverage it claimed and the PO drops back accordingly. A PO that still has live bills against it cannot be cancelled; cancel the bills first.

  • Capture expenses with tax and dimensions, route them for approval, and pay them.
  • Flag an expense billable to a customer with a markup, and track it as UNBILLED until it has been invoiced.
  • Cancel an approved expense and have the ledger and bank book unwound with it.
  • Raise purchase orders, mark them sent, and bill them off in full or in part.
  • General ledger — approved expenses and the bills raised from POs post here.
  • Receivables & payables — POs become vendor bills, and those bills drive the PO’s billed status.
  • Reports — expenses-by-category summarizes expense spend per account.