3-way matching: the order, the delivery docket and the invoice
Three-way matching is checking a supplier's invoice against two other documents before you pay it: the purchase order that says what you ordered, and the delivery docket that says what arrived. The invoice is paid when all three agree on the item and the quantity, and held when they don't.
In short
- Three-way matching checks a supplier's invoice against the purchase order and the delivery docket before you pay it.
- Pay when all three agree on the item and the quantity, within a tolerance agreed before it matters. Hold the invoice and ask when they don't.
- It checks the price only against the rate on the PO, so check that against the rates agreed for the invoice's date as well.
The three documents, in construction terms
In accounts payable the three are the order, the receipt and the bill. On a building site they look like this:
- The purchase order (PO): what you ordered, from which supplier, for which job, with the quantity, the unit and usually the rate. It's raised before the order is placed.
- The delivery docket: what arrived on site, signed by whoever received it. For concrete it's a docket per truck with the cubic metres and the mix; for steel and reo, the weight or the lengths; for hire, the docket the equipment arrived with. Some businesses record receipts as a goods received note instead.
- The supplier invoice: what the supplier is billing, which should quote your PO number and the docket numbers.
Two-way, three-way and four-way matching
The names count the documents compared:
| Item | Compares | Catches | Misses |
|---|---|---|---|
| Two-way | Compares: The invoice and the PO | Catches: Items nobody ordered, more billed than ordered, a price over the PO | Misses: Goods billed that never arrived |
| Three-way | Compares: The invoice, the PO and the delivery docket | Catches: All of that, plus goods billed that weren't delivered, or weren't delivered in full | Misses: Goods that arrived but weren't what was ordered, unless the docket says so |
| Four-way | Compares: All three, plus an inspection or acceptance record | Catches: All of that, plus goods delivered but rejected on inspection | Misses: Anything the PO itself got wrong, such as an old rate |
Three-way matching, step by step
The process, from the order to the payment run:
- Raise a PO for each order, with the job, the supplier, each item, the quantity, the unit and the agreed rate.
- When goods arrive, whoever receives them checks the load against the docket, notes any shortfall or damage on it, and signs it. The free delivery docket template has a docket to print and a register to log each one.
- Get the signed dockets to whoever pays the invoices. A photo on the day will do, as long as it's filed against its PO.
- When the invoice arrives, find its PO from the number printed on it. No PO number, or one you can't find, is the first question for the supplier.
- Match each invoice line to its PO line and its dockets: the same item, the same unit, and a quantity no more than what was received, and no more than what's left on the order after earlier invoices.
- Check each docket number on the invoice hasn't been billed on an earlier invoice.
- Check the price against the rate agreed with the supplier for the invoice's date.
- If everything agrees, approve it for payment. If something doesn't, hold the invoice and ask the supplier, or the site, about the difference.
- Update the PO with what's been billed so far, and close it when the order is complete.
A worked example: concrete and reo
A builder raises PO 4471 with a concrete supplier for 40 cubic metres of N32 concrete for a slab, and PO 4472 with a steel supplier for 2.5 tonnes of N12 reo bar.
The slab goes in over two pours. The first pour's dockets show four trucks, of 7, 7, 7 and 5.2 cubic metres: 26.2 in all. The concrete invoice bills 28 cubic metres against PO 4471. Two-way matching passes it, because 28 is under the 40 ordered. Three-way matching holds it: only 26.2 arrived, so 1.8 cubic metres is billed that the dockets don't show. It might be a part load billed as a full one, or a docket missing from the pile. Either way it's a question before paying.
The reo invoice bills 2.5 tonnes, and the docket shows 2.46 tonnes. Whether that's a problem depends on how your agreement says weight is measured, by the scale at the yard or by the bar's listed weight per metre, so check that before you query the 40 kilograms. This is where an agreed tolerance helps.
Docket 88213 from the first pour then turns up on the next concrete invoice, with the waiting time for that pour. A docket on two invoices can be fair: the concrete on one, the waiting time for the same pour on another. The concrete itself on both wouldn't be.
Tolerances and when to hold
Quantities rarely match to the decimal. Agree a tolerance before it matters, a small percentage or a small quantity either way, item by item: tighter for things you count, like fixings or panels, looser for things measured on the day, like concrete and quarry products. Inside it, pay. Outside it, hold the invoice and ask.
Hold only what's in question where you can. Paying the rest on time keeps the account in good standing while the difference is sorted out.
One case needs care. Each state and territory has security of payment laws, and in most of them a contractor can issue a payment claim, which gives the party paying a strict timeframe to pay, upfront or under a payment schedule. If an invoice you're holding is a payment claim, respond within that timeframe rather than just holding it, and check the law where the work was done.(business.gov.au: Laws affecting contracts)
Common exceptions
Most mismatches have an ordinary cause. The usual ones, and what to do about each:
| Exception | What it usually means | What to do |
|---|---|---|
| A part delivery or back order | What it usually means: The rest of the order is still coming | What to do: Pay for what arrived and keep the PO open for the rest |
| More billed than received | What it usually means: A part load billed as full, a docket missing from the pile, or a mistake | What to do: Find the docket, or ask the supplier for a credit |
| A different unit from the PO | What it usually means: Billed per length against a PO per metre, or per bag against per tonne | What to do: Convert only where the conversion is agreed; otherwise ask |
| A docket already billed | What it usually means: A re-issued invoice, a delivery billed in parts, or double billing | What to do: Look at the earlier invoice before paying |
| No PO number, or one not on file | What it usually means: Ordered by phone, or by someone who didn't raise a PO | What to do: Find who ordered it before paying |
| A closed PO | What it usually means: A late invoice for a finished order, or new work quoted against an old PO | What to do: Check the dockets' dates and ask which it is |
| A PO raised for another supplier | What it usually means: The supplier quoted the wrong PO | What to do: Ask them to correct the PO number |
| A price over the PO | What it usually means: A price rise, or the wrong rate on the invoice or on the PO | What to do: Check the rate agreed for the invoice's date |
What three-way matching doesn't check: the price
Three-way matching compares the invoice's price with the rate on the PO, so it's only as good as the PO. A PO raised from an old price list, typed in a hurry, or raised before the supplier's latest price notice carries the error into the match, and the invoice agrees with it.
The rate that should be charged is the one you agreed with the supplier for the invoice's date: the schedule of rates or price list in force that day, at the right price break. Checking prices against that, separately from the quantities, catches what a PO copied wrong. The guide to schedules of rates covers what goes in one.
Nor does it check the charges on top of the goods, unless the PO lists them, or that the invoice is a valid tax invoice, which you generally need before you can claim the GST credit on it.(ATO: When you can claim a GST credit)
Doing it in a spreadsheet
For a handful of POs a month, a spreadsheet does the job. Keep three sheets, each with the PO number and an item code, so rows can be matched across them:
- PO lines: PO number, job, supplier, item code, description, unit, quantity ordered and rate, in columns A to H
- Dockets: docket number, date, PO number, item code, quantity received and who signed, in columns A to F
- Invoices: invoice number, date, PO number, docket number, item code, quantity billed and rate billed, in columns A to G
- On the PO lines sheet, work out received to date and billed to date for each line, and flag any line where billed to date is over received to date, or received is over ordered:
Received to date=SUMIFS(Dockets!E:E, Dockets!C:C, A2, Dockets!D:D, D2) Billed to date=SUMIFS(Invoices!F:F, Invoices!C:C, A2, Invoices!E:E, D2) - On the invoices sheet, this marks a docket number that appears on more than one invoice line:
=COUNTIF(D:D, D2)>1
When to skip it
Three-way matching needs POs, and dockets that reach the office. A small builder who orders by phone and doesn't raise POs gets more from agreeing prices with each regular supplier and checking every invoice against them, and from checking dockets against the invoice for anything delivered by the load, such as concrete, quarry products and hire.
Three-way matching with CostCode
CostCode doesn't raise purchase orders. Import yours by CSV and an invoice billed past the PO, or quoting an unknown or closed one, is held for your team.
The CSV carries each PO's number, supplier, job and lines: the item and its code, the unit, the quantity ordered, and the quantity received where your file has it. CostCode reads the PO number printed on the invoice and compares what the supplier has billed on each PO line, on this invoice and the earlier ones quoting the same PO, with the quantity ordered and, where the file gives it, the quantity received. Import the file again as deliveries arrive: a PO already on file has its lines replaced with the new quantities.
Until you've imported POs, and on an invoice that quotes no PO, these checks stay quiet. Then CostCode holds an invoice that quotes a PO number that isn't on file, a closed PO or a PO raised for another supplier, and one with a line billed past the quantity ordered or received by at least the thresholds that apply to prices, $25 and 3% by default. A hire line read as items × days is compared with a PO line in days. A line the PO doesn't have is skipped with the reason, never held, because an invoice's wording often differs from the PO's, and a line that two PO lines could fit, or that's billed in a unit the PO line isn't, shows as unverified.
CostCode doesn't read your delivery dockets: the received quantity comes from your PO file. It does read docket numbers printed on invoice lines, and holds an invoice when a docket number on it was already billed on an earlier invoice from the same supplier.
What the PO and docket checks find stays with your team and is never put to the supplier: a PO is your own document, and a docket can fairly appear on two invoices. Prices are checked separately, against the schedule of rates in force on the invoice's date, never against the rate on the PO.
Questions
What is 3-way matching in accounts payable?
Checking each supplier invoice against the purchase order and the delivery docket or goods received note before paying it. The invoice is paid when the three agree on the item and the quantity, and held when they don't.
What's the difference between 2-way and 3-way matching?
Two-way matching compares the invoice with the PO. Three-way adds the delivery docket, so it also checks that what's billed actually arrived.
Does 3-way matching check the price?
Only against the rate on the PO. If the PO carries the wrong rate, the invoice matches it. Check prices against the schedule of rates or price list agreed for the invoice's date as well.
What tolerance should we use?
Whatever suits the item and the supplier, agreed before it matters: tighter for things you count, looser for things measured on the day, like concrete. Inside the tolerance, pay; outside it, hold the invoice and ask.
Does CostCode do three-way matching?
In part. It doesn't raise POs or read delivery dockets. Import your POs by CSV, with the received quantities if you have them, and CostCode holds for your team an invoice billed past the PO or quoting an unknown or closed one. It also holds an invoice when a docket number on it was already billed on an earlier invoice from the same supplier.