Work snippet 19 / 34Purchasing + approvals

Airtable purchase orders into Xero, with approval levels and an audit trail

How I'd approach purchase orders for a high-end builder with a dozen live sites, so every order is approved before it is placed, checked against the cost code budget, matched to the delivery and the bill, and recorded in a log that stands up to audit.

Work snippet with example figures.

Area
Purchasing + approvals
Tools
Airtable · Xero · Make
Typical scope
US$3,000–5,000
Timeline
About 6 weeks · 4 fixed milestones

01Context

A high-end builder working across residential and commercial fit-out, with a dozen live sites, project managers, site managers, an accounts team and two directors. Orders are raised on site and by project managers, and the accountant wants to know who approved what and when.

The systems in play

In the example, purchase orders are raised by email and a shared sheet, bills arrive in Xero days later, and the budget by cost code is checked after the fact. The company wants approvals before the order, and a record that stands up to an audit.

Table 1Who uses what
SystemWhat it does for the business
Airtable baseJobs, cost codes with budgets, suppliers, purchase orders, receipts and the approvals log. Where orders are raised and approved.
XeroThe ledger, suppliers and bills. Receives approved purchase orders and the bills that match them.
Sync flowsCreate or update the Xero purchase order when approval is complete, and read back bills that carry a PO reference. Make in the example.
Site and project managersRaise orders and record deliveries.
Directors and finance leadApprove above their thresholds and verify new suppliers.
AccountantReads the approvals log at year-end and during audit.

02Problem

What the owner sees

  1. Orders placed before anyone approved them
  2. Budgets that are overspent before the bill arrives
  3. Supplier bills with no purchase order behind them
  4. No answer to "who approved this, and what did it say when they did?"

A purchase order is a promise to pay. When it lives in email, the amount can change after approval, the approver can be forgotten and the budget is only checked when the bill lands. The fix is a short, strict process and a log that cannot be quietly edited.

Table 2Where the drift starts
Everyday situationWhat goes wrong
Order raised by phoneThe supplier delivers and the PO is written afterwards
Value changed after approvalThe approved amount and the amount ordered are no longer the same
Budget not checkedA cost code is overspent and nobody sees it until the bill
Part deliveryThe bill is for part of the order and the rest is forgotten
New supplier or changed bank detailsA payment goes to the wrong account
Approver awayOrders wait, or someone approves on their behalf by email

03Approach

Four steps, in this order. Each one ends with a result that is checked.

  1. LookA read-only review of 12 months of purchase orders, bills and the budget sheet. Orders with no approval trail and bills with no order are counted.
  2. Agree the rulesApproval levels, budget checks, tolerance on bills, change rules and supplier checks are written down.
  3. Build and connectThe Airtable base is built around those rules. Approved orders reach Xero as purchase orders. Bills are read back and matched.
  4. CheckScripted scenarios, a three-way match on past orders and a review of the log with the accountant before go-live.
Table 3Approval rules agreed in writing (example settings)
Order value (US$)ApproverExtra condition
Under 2,500Site managerWithin the cost code budget
2,500 to 14,999.99Project managerWithin the cost code budget
15,000 to 49,999.99Project manager and a directorBoth approve, in that order
50,000 and overTwo directorsFinance lead confirms the budget
Any value over budgetA directorA budget transfer or a reason, recorded
New supplierFinance leadTax ID and bank details checked before the first order
Rise of more than 5% or 500 after approvalThe same approvers againThe order returns to approval as a new version

04What the setup includes

What the setup includes, and why each piece is there. The detail of how it is configured is agreed in the scoping call.

Show the setup, layer by layer
Table 4The setup, layer by layer
LayerWhat is set up and why
Jobs and cost codesEach job carries its budget by cost code, with committed and billed amounts worked out from the orders and bills, so the remaining budget is always visible.
Purchase order formRaised against a job and cost code, with lines, a supplier, a delivery date and a version number. A number such as J2217-0045 ties it to the job.
Approval engineWorks out the approvers from the value, the budget check and the supplier status. Nothing reaches Xero before the last approval.
Approvals logAn append-only table: each action creates a row with the order, version, action, person, time, value and comment. Rows are never edited. A nightly export is stored outside Airtable.
ReceiptsDeliveries recorded against order lines, in full or in part, so the bill can be matched to what arrived.
Supplier controlNew suppliers and bank detail changes are held for the finance lead, who confirms them by calling a known number.
Xero syncApproved orders are created or updated in Xero as purchase orders. A cancelled order is cancelled in both places.
Bill matchingBills in Xero with a PO reference are read back and compared to the order and the receipt, with a tolerance.

How the data moves

  1. Order raised against job and cost code
  2. Budget check
  3. Approvals in order
  4. Approved order in Xero
  5. Delivery recorded
  6. Bill arrives in Xero
  7. Three-way match
  8. Exceptions list

05Edge cases

These are agreed with the finance lead and the directors and tested with scripted scenarios.

Table 5Edge cases and how each is handled
SituationHow it is handled
Value rises after approvalWithin the limit, the change is logged. Above it, the order returns for approval as a new version and the Xero order is updated only after that.
Approver awayA named delegate is set in advance with a start and an end date, and each delegated action is labeled in the log
Approver is also the person who raised the orderNot allowed. The next level approves.
Order split to stay under a thresholdOrders to the same supplier for the same job and cost code within seven days are added together for the approval level
Part deliveryThe order stays open for the balance. A bill for part is matched to the receipt, not the order.
Bill with no orderHeld on the exceptions list and not paid until a director approves a retrospective order
Bill above the orderMatched within the tolerance. Above it, the bill is held and the difference is explained or the order is revised.
Supplier credit noteMatched to the original order and receipt and shown on the job
Order cancelled after approvalCancelled with a reason in both systems, and its amount returns to the budget
Deleted or edited log rowsThe log is append-only by design, and a nightly export makes a change visible
Urgent order out of hoursA short form with a director’s approval by message, recorded in the log within one working day

06Worked example

The tables below use one job and five orders with example figures. They show the shape of the checks, not a client result.

Table 6Budget check for one order, cost code 03 Concrete (example data, US$)
ItemAmount
Budget for the cost code120,000.00
Committed on approved orders96,500.00
Billed so far61,200.00
Remaining budget not yet committed23,500.00
New order PO J2217-004528,000.00
Over budget by4,500.00
OutcomeA director approves, with a budget transfer from cost code 09 Contingency
Table 7Approvals log for PO J2217-0045 (example data)
VersionActionPersonWhenValue (US$)Comment
1RaisedSite managerDay 1, 08:1428,000.00Slab pour, level 2
1Budget checkSystemDay 1, 08:1428,000.00Over budget by 4,500.00
1ApprovedProject managerDay 1, 11:0228,000.00Within project manager level
1ApprovedDirectorDay 1, 16:4028,000.00Transfer 4,500.00 from 09 Contingency
1Sent to XeroSystemDay 1, 16:4128,000.00Purchase order created
2Change raisedProject managerDay 4, 09:2030,100.00Rise of 7.5%, returns for approval
2ApprovedDirectorDay 4, 13:0530,100.00Additional pump hire
2Updated in XeroSystemDay 4, 13:0630,100.00Purchase order updated
Table 8Three-way match on five orders (example data, US$)
OrderOrderedReceivedBilledResult
J2217-004530,100.0030,100.0030,100.00Matched
J2217-00469,600.009,600.009,840.00Held: billed 240.00 (2.5%) above the order, tolerance is 2%
J2217-00474,200.003,150.003,150.00Matched to the receipt; 1,050.00 stays open
J2217-004815,500.0015,500.00Received, not yet billed: on the unbilled receipts list
No order2,250.00Held: bill with no order

07How the result is checked

The checks prove two things: the process cannot be bypassed, and the log tells the truth. They run on scripted scenarios before go-live and on a regular schedule afterwards.

Table 9Checks and pass conditions
CheckHowPass condition
Approval levelsA scripted order at each threshold and over budgetThe right approvers are required, in the right order, every time
No bypassAn unapproved order, an edited value and a self-approval attemptNothing reaches Xero and each attempt appears in the log
Log integrityNightly export compared to the live logNo row changed or removed
Xero agreementApproved orders in Airtable compared to purchase orders in XeroEqual in number, supplier and value
BudgetCommitted and billed by cost code compared to the orders and billsEqual to the cent
Past ordersThree-way match run over 12 months of historyEvery difference explained or on the list
Supplier changesBank detail changes in the last quarterEach confirmed by the finance lead with a note
Accountant reviewA read-through of the log and a trace of five orders from request to billEach trace complete without asking anyone

08Scope and milestones

A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.

Table 10Scope: what a project like this covers
AreaIncluded
AuditRead-only review of 12 months of orders, bills and the budget sheet, a 45-minute call, written findings and a fixed quote
RulesApproval levels, budget checks, tolerance and supplier controls in writing, signed by the directors and the finance lead
Airtable baseJobs, cost codes, suppliers, orders, receipts and the approvals log, with views for each role
Approval engineApprovers worked out from value, budget and supplier status, with delegation
Xero syncApproved orders created and updated in Xero, with a cancel path and a duplicate guard
Bill matchingA three-way match with a tolerance and an exceptions list
Audit packA nightly export of the log and a short guide for the accountant
HandoverWritten SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live
Not includedTax filing and statutory returns.
Also outside the scopePaying suppliers. Processing bills beyond the matching check. Replacing Xero or Airtable. Software subscriptions (billed to you by the vendors).
Table 11Fixed milestones
MilestoneDeliverableTimingShare
M1 Audit and rulesFindings, a fixed quote and the approval rules in writingWeek 120%
M2 Base and approvalsOrders, budgets and approvals working on a pilot jobWeeks 2 to 330%
M3 Xero sync and matchingOrders reach Xero once, bills matched, scenarios passWeeks 4 to 535%
M4 Go-live and handoverLive on all jobs, audit pack, SOPs, handover video, 14 days of fixesWeek 615%

Typical scope for this kind of project: US$3,000–5,000

About 6 weeks across 4 fixed milestones. The Systems Audit (US$300, fixed) comes first and confirms the scope.

Describe what is going wrong between your job system and your books, and I'll say where I'd look first.

Send a short note through the form on the home page. I will reply with where I would start, and whether the US$300 Systems Audit is the right first step.

Hire me on Upwork (opens in a new tab)Hire me on Freelancer (opens in a new tab)