Why three-way matching is critical
Construction is a high-risk environment for payment leakage, and the fraud data says so without much subtlety. In the ACFE’s global study, construction posts the fourth-highest median fraud loss of any industry at $250,000 per case — and billing schemes feature in 38% of construction fraud cases, nearly double the all-industry rate.
A billing scheme is not sophisticated. It is an invoice that nobody checked against a delivery record. That is the entire mechanism, and it works precisely as often as the check is skipped.
Then there is the innocent leakage, which is larger and less interesting and costs just as much: duplicate and erroneous payments running 0.8–2% of disbursements in cross-industry benchmarks, and invoice error rates such that only half to two-thirds of invoices match cleanly on the first pass at a typical organisation. Nobody was dishonest. The money left anyway.
And underneath all of it sits the physics of a construction site: without matched delivery records, invoiced quantities are unverifiable by definition. Not difficult to verify. Impossible.
The economics of doing it properly are documented too, and they cut against the intuition that controls slow things down. Best-in-class accounts payable processes an invoice for $2.78 against $12.88 for everyone else, in three days rather than seventeen, with a 9% exception rate rather than 22%. Matching is not bureaucracy. It is the control that makes fast payment safe.
The role of matching in project performance
Construction matching is cumulative, not document-to-document. One purchase order for 500 cubic metres of concrete is fulfilled by forty pours across several weeks, each with its own delivery ticket — and the monthly supplier invoice consolidates dozens of them. So the match has to run at cumulative line level: the sum of accepted receipts must not exceed the PO quantity, and the invoiced quantity must not exceed the receipted quantity. A naive one-invoice-one-delivery comparison does not merely fail here. It has nothing to compare.
Tolerance bands by category, not one global number. A percentage tolerance plus an absolute cap, set by commodity risk. Bulk aggregates deserve a looser quantity tolerance, because weighbridge variance and moisture content are physical realities rather than accounting failures. Fixed-price equipment deserves zero price tolerance, because there is nothing to vary. And over-tight tolerances produce their own failure mode, which is worse than the leak they were meant to stop: an exception rate above 20% turns accounts payable into exception management with occasional matching, blows through payment terms, and puts your suppliers on stop — at which point the control has become the problem.
Services match against certification, not receipts. A lump-sum or milestone scope has no goods receipt, so the matching document is the completion certificate: the engineer or project manager certifying the milestone, or the percentage complete. The triangle is unchanged — commitment, verified performance, invoice. Only the middle document is different, and a matching engine that cannot handle that will simply reject every subcontract invoice you have.
Retention needs native handling: match gross, pay net. The match validates the gross certified value. Retention is then deducted before payment and tracked in a ledger against its release triggers. A matching engine that does not understand retention flags every single retention deduction as a price variance — which means every subcontract invoice becomes an exception, and within a month nobody is reading the exceptions at all.
Discrepancies route by type, with owners and deadlines. Price exceptions to procurement. Quantity exceptions to the site or the storekeeper, who is the only person who knows what actually came off the truck. Quality to QA. Each with an owner and an SLA, because an exception with no owner is just a payment that has stopped. And the outcome menu should include the useful middle path that most systems omit: pay the matched portion, dispute the balance. Holding a whole invoice hostage over one contested line is how you turn a variance into a relationship.
What happens without matching
What you have instead is de facto two-way matching — purchase order and invoice, with no receipt verification. Which means you are paying on the supplier’s word. That is not a characterisation; it is the literal condition that the billing-scheme statistics describe.
Short deliveries surface at stock count, long after payment. The same delivery ticket appears on two invoices and both get paid, because nothing was cross-checking. Rate drift — the quiet 4% above PO rates that nobody notices in any single transaction — compounds across a hundred invoices into real money.
And none of it appears in the cost report. Because the cost report reflects what was paid, and what was paid was wrong.
How Zepth runs three-way matching
Matching runs automatically as invoices arrive: line-level, cumulative, tolerance-aware and retention-aware, against live purchase-order and delivery data rather than a monthly export that was true once.
Every variance is computed per line — quantity and rate separately, because they have different owners and different remedies — with a discrepancy workflow that routes each exception to the person who can actually resolve it, and keeps the audit trail while it does.
And the dashboard shows match health across the project: what is clean, what is stuck, and which suppliers are generating the exceptions. That last one is usually the most interesting number in the room.