Three-way match in construction means comparing three documents before you pay a supply-house invoice: the purchase order, the packing slip or receiving ticket, and the invoice itself. If all three agree on part, quantity, and price, you pay. If they do not, you hold the line item and ask. That is the entire control, and it is the reason corporate AP departments catch overcharges that contractor offices pay without looking.
The catch is that it was designed for an organization with a buyer, a receiving dock, and an AP clerk. You have a foreman who grabbed 200 feet of MC on the way to the job and a paper ticket currently under a seat. Running the textbook version in that environment does not work, and pretending otherwise is how good controls end up in a procedure binder and never get used. So this post explains the control honestly, including what it misses, then rebuilds it in a version one bookkeeper can run on a Friday morning.
What each of the three documents actually proves
The match works because each document is created by a different party at a different moment, so they cannot all be wrong in the same direction by accident. The standard definition cross-checks invoice, purchase order, and delivery receipt before payment is released.
| Document | Who creates it, and when | What it proves | What it cannot prove |
|---|---|---|---|
| Purchase order | You, before material moves | What you agreed to buy, at what unit price, for which job | Whether that price was a good price |
| Packing slip or receiving ticket | The supplier, as material leaves the counter or truck | What showed up, and how much of it | What it was supposed to cost |
| Invoice | The supplier’s billing system, days or weeks later | What you are being asked to pay | That any of it was ordered or delivered |
Read that last column again. The invoice is the only one of the three with no independent evidence behind it. It is a claim, and the PO and the ticket are what turn it into something verifiable. Two-way matching (PO against invoice, no receiving document) is the fallback when shipping receipts are not available. It confirms you were billed what you agreed to and says nothing about whether the material arrived.
What three-way match catches, and what it misses
Be precise about this, because most write-ups oversell it.
It catches quantity errors. Invoice says 12 boxes of 3/4 inch EMT connectors, the ticket says 10. Highest-yield check in the system, and it needs no software.
It catches price-versus-PO errors. You issued the PO at $104.50 for a 250 foot roll of 12/2 Romex, the invoice bills $112.00. Something repriced between order and billing: a lapsed quote, a counter entry that missed your contract pricing, a substitution outside a special pricing agreement. Those mechanics are covered in quote vs invoice mismatch and contract price vs counter price.
It catches duplicates, but only sideways. A second invoice against a PO already fully received and billed has nowhere to land. Deliberate duplicate invoice detection is still a separate check on invoice number, amount, and date. The named failure modes in AP practice are quantity mismatch, price over tolerance, missing receiving documentation, wrong vendor, and misaligned line-item descriptions.
Now the part that matters most.
It does not catch a PO issued at the wrong price in the first place. If your PO says $17.80 for a bag of ten 3/4 inch copper 90 elbows because that is what the counter said this morning, and the invoice says $17.80, the match passes. Perfectly. Three green checkmarks on a price that was $14.20 in March.
That is why material price creep survives inside shops that already run POs. The match validates internal consistency, not market reasonableness. Only a unit price history across months answers that, and which column your account sits in is a separate investigation, covered in column pricing at distributors.
It also does not catch a bad return. Restocking terms are contractual, not matched. A 25% minimum restocking fee shows up as a credit memo, not a PO line, and sails past any matching routine.
Why the textbook version does not survive contact with a contractor’s week
An honest inventory of what breaks.
There are no formal POs. Most shops under about twenty people buy on a verbal. A call to the counter, a name, an account number, done. Nothing to match against.
Field staff buy material. Four people with buying authority and no shared record of what any of them committed to.
Receiving happens on a jobsite. The textbook assumes a dock and a receiver who counts. Your material gets dropped in a driveway and signed for by whoever was closest to the gate, or nobody signs anything.
The tickets are paper and they live in trucks. The receiving document exists, just not in the office, and by the time it is, the invoice is coded and paid.
There is one bookkeeper, possibly part time. They reconcile totals. They do not re-verify unit prices against March.
Speed is the point. Your foreman went to will-call because the job was stopped. Any control that adds a step before material can move gets skipped, correctly, then permanently.
So the design goal is a control that survives being ignored twice a week, not a shrunken corporate AP department.
The lightweight version, in five parts
1. A minimum viable PO
Your PO does not need to be a form. It needs to be a record that existed before the material did, with five fields:
- Job number or job name
- Supplier and branch
- What is being bought, in words a human recognizes
- The price you were told, per unit, or a dollar not-to-exceed
- Who authorized it
That fits in a text message to the office, a spreadsheet row, or whatever field software you already run. A real PO number out of an accounting system is better, because it lets you track committed cost, but the control works the moment the record exists. What matters is that somebody wrote down the expected price before the supplier wrote down the billed price. A PO with no price is a requisition, and it downgrades the match to a quantity check.
2. A short list of who can buy
Write down the names. Three or four people, not eleven. Everyone else calls one of them. Then tell your branch, in writing, that orders from anyone else need a call to the office. Most will honor that, and the ones that do not will at least put the requester’s name on the ticket, which is nearly as useful. This costs nothing and does more for material cost control in a small shop than any software.
3. A job number on every single ticket
Not on the invoice. On the ticket, at the counter, in the moment. Ask your branch to put the job name in the PO or reference field on the will-call ticket; they already have the field. Then the crew writes it on the paper copy in pen before it goes in the truck.
Material with no job number is why job costing quietly breaks. Unallocated purchases land in a general bucket, jobs that ran over look fine, and next year’s bid gets built off the wrong number.
4. Match weekly, not per invoice
Per-invoice matching is what an AP department does because AP is somebody’s whole job. Yours is a Friday batch. Pull the week’s tickets out of the trucks, sort by supplier, pull the week’s invoices, then run three passes: ticket to invoice on quantity (fastest, biggest catch rate), PO to invoice on unit price (slower, and where repricing shows up), and anything with no ticket at all.
A weekly rhythm also keeps you inside the window where credits get honored. Recent errors get fixed at the counter routinely. Two-month-old ones get “sorry, already posted.”
5. Tolerance thresholds so this does not eat your Friday
Nobody chases a $3.10 variance. AP practice sets tolerances by value threshold, discrepancy percentage, or vendor quality rating, and typically invoices within 2% to 3% of the PO pass automatically, or full matching applies only above a cutoff such as $5,000. Published institutional policy has the same shape: the University of Georgia uses two-way match for goods POs at or below $2,499.99 and three-way match at or above $2,500. Here is that scaled to a shop.
| Invoice line value | Price variance vs PO | Quantity variance vs ticket | Action |
|---|---|---|---|
| Under $100 | Any | Any short shipment | Let price go, chase quantity |
| $100 to $500 | Over 3% or $15 | Any | Flag for the weekly credit email |
| $500 to $2,500 | Over 2% | Any | Flag and hold payment on that line |
| Over $2,500 | Over 1% or $50 | Any | Hold, call the rep before paying |
| Any value, no ticket | Not assessable | Not assessable | Hold until a ticket or signed POD arrives |
Two notes. Quantity has no tolerance: a short shipment is not a rounding difference, it is material you do not have. And a pattern beats a threshold. Six $4 variances on the same SKU in six weeks is drift, not noise, and it belongs in your price history whether or not any single line cleared the bar.
When a line fails, the standard response is to withhold payment and request a corrected invoice or a credit note. Send one polite email per supplier per week rather than six angry ones, using a credit request email template.
When the ticket is simply missing
It will be, often. Do not let that become a reason to abandon the control. Escalate in order:
- Ask the buyer. The person named on the PO usually remembers what showed up, and a same-week memory is evidence.
- Ask the branch for a signed delivery copy. They keep them, and most will email a POD or will-call ticket within a day.
- Fall back to two-way match. PO against invoice, price only, and note the line as unverified on quantity.
- Pay it, and mark the supplier. Three unverified lines from one supplier in a month is a conversation about their paperwork, not your process.
Then fix the cause: photograph the ticket at the counter before the truck moves. A crumpled photo from a parking lot is a receiving document. A perfect ticket that never leaves the truck is not.
The GC and PM version: POs across jobs and cost codes
For a PM buying across four jobs and six suppliers, the same control does a different job. It is less about catching a $96 short shipment and more about whether the budget report is telling the truth.
PO control gives you committed cost. A PO is a commitment before it is a cost. Purchase orders let you track committed cost and remaining committed cost at the job, cost code, or cost class level, and without them contractors risk thinking a job is more profitable than it is. On a job with a long material tail, that is the difference between managing the budget and finding out in month six.
Cost coding belongs on the PO, not the invoice. Assign the code when the commitment is made and coding is a byproduct. Assign it when the invoice arrives and somebody is guessing which of four active jobs a box of strut fittings went to, six weeks later, from a line reading “MISC HDWR.”
Unmatched material invoices distort variance in both directions. An invoice in an unassigned bucket makes the job it belonged to look under budget and the bucket it landed in look over, so you chase a variance that is not real and miss the one that is. Materials price variance is calculable, (actual price minus standard price) times actual quantity, but only if the quantity is on the right job. Timing does the same damage: material received in June and invoiced in August shows a July budget that is fiction. The receiving ticket carries the true date.
The macro case is not subtle. AGC’s reading of the producer price index in May 2026 had inputs to new nonresidential construction up 8.4% year over year, the largest annual jump since the pandemic, while contractors’ bid prices rose 3.5%. When input costs move twice as fast as what you can charge, the gap between the price you assumed and the price you paid is not a rounding item.
Is it worth it? An honest answer
A full three-way match is real overhead. Somebody creates records before material moves, collects tickets that do not want to be collected, and spends a couple of hours a week comparing documents. For some shops that does not pay for itself.
Run the full version if you buy more than roughly $30K to $40K a month in material, run more than about six jobs at once, have more than three people buying on your account, bid work where material is over a third of the cost, or hand job cost reports to a bank or bonding agent.
Run the light version if you are smaller. Two habits: a job number on every ticket, and a weekly quantity check of tickets against invoices. Skip formal POs. Short shipments and quantity errors are the most common findings and need no PO at all, so those two habits catch most of the dollars for a fraction of the effort.
Skip it entirely if you buy from one supplier, spend under a few thousand a month, and read every invoice yourself anyway. You are already the control.
The uncomfortable part is that the shops most exposed to material overcharges are the ones least able to staff the control that catches them. That is arithmetic, not a character flaw, and it is why the honest answer for most small shops is the light version plus a price history, not a heavy version abandoned in March.
The Friday checklist
- Tickets out of the trucks and onto the desk.
- Every ticket has a job number. If not, get one now while somebody remembers.
- Quantity on the ticket against quantity on the invoice, line by line.
- Unit price against the PO, or against what you paid last month if there is no PO.
- Apply your tolerance table. Do not chase what you decided not to chase.
- Anything with no ticket goes on a hold list, not a paid list.
- One credit email per supplier, this week, not next month.
- Note any SKU that has moved three times this year. That is a negotiation item, not a credit request.
Sources
- Stampli, 3-way invoice matching: definition and tolerance rules
- Tipalti, 3-way match: tolerance practice and failure modes
- Bill.com, 3-way matching and the response to a mismatch
- University of Georgia, published two-way and three-way match thresholds
- Foundation Software, job costs and purchase orders: committed cost
- AccountingTools, materials price variance formula
- AGC of America, May 2026 producer price index release