Skip to main content

Three-way matching Excel template

A spreadsheet that compares a supplier invoice against its purchase order and goods receipt, line by line, and tells you which lines to hold. The formulas are already written: paste your three documents into the input sheets and read the status column.

Free, no signup, no email address. Works in Excel, Google Sheets and LibreOffice Calc. No macros, no external links, and every figure in the sample data is synthetic.

XLSX, 5 sheets, about 10 KB. Prefer not to download anything? The checker does the same comparison in your browser.

What the template does

Three-way matching means checking that what you were billed for matches what you ordered and what you actually received. The template does that comparison at line level, on pre-tax unit prices.

It deliberately never compares document totals. Totals include tax, they cannot represent a partial delivery or a partial invoice, and they let two opposite errors cancel out into a figure that looks correct. An overcharge of 40 on one line and an undercharge of 40 on another nets to zero at the bottom of the page and to two problems at line level.

What is inside the file

SheetWhat goes in it
InstructionsHow to fill it in, how the two variances are calculated, and what each status means.
MatchingThe worked result. One row per item code, with ordered, received and invoiced quantities pulled from the other sheets, both variances, and a status. This is the only sheet with formulas.
Purchase orderPO number, supplier, item code, description, ordered quantity, PO unit price.
Goods receiptsReceipt number, supplier, item code, description, received quantity. No price: a goods receipt does not carry one.
Invoice linesInvoice number, supplier, item code, description, invoiced quantity, invoice unit price.

When to use it

How to complete it

  1. Paste your purchase order lines into the Purchase order sheet.
  2. Paste your goods receipt lines into the Goods receipts sheet.
  3. Paste the supplier invoice lines into the Invoice lines sheet.
  4. List every item code you want checked in column C of the Matching sheet.
  5. Set your tolerances in cells B2 and B3.
  6. Read the Matching status column. Anything that is not Match needs a decision.

Lines are matched on the item code, so the same code has to appear on all three sheets. If your supplier uses their own codes, map them to yours in a lookup column first. That mapping problem is the single most common reason spreadsheet matching quietly stops working.

How price variance is calculated

Price variance is the unit price difference multiplied by what you were actually billed for:

price variance = (invoice unit price − PO unit price) × invoiced quantity

In the sample data, one line is ordered at 12.00 and invoiced at 13.20 across 60 units. The unit gap is only 1.20, which looks harmless, but the line carries 72.00 of price variance.

How quantity variance is identified

Quantity variance is the quantity difference valued at the price you agreed:

quantity variance = (invoiced quantity − ordered quantity) × PO unit price

The two are kept in separate columns on purpose. A variance that is entirely quantity has a different owner and a different fix from one that is entirely price: the first is a receiving or ordering conversation, the second is a pricing one. A single blended "variance" figure hides which of the two you are looking at.

Setting the tolerances

The template ships with an absolute tolerance of 1.50 and a percentage tolerance of 2%. A line is flagged when it exceeds either threshold, and the comparison is strict — a value exactly equal to the threshold sits inside tolerance.

Those two numbers are a starting point, not a standard. The honest way to set them is to take 90 days of your own matched lines, look at where the variance distribution stops being noise, and put the thresholds there. Both are editable in cells B2 and B3.

The eight matching statuses

Listed most severe first. Where a line qualifies for more than one, the most severe wins.

StatusWhat it meansTypical action
No PO lineInvoiced, with nothing ordered.Route to the requester for retrospective approval.
No goods receiptOrdered and invoiced, never receipted.Hold. Chase the warehouse before paying.
Over-invoicedInvoiced more than was received.Pay the received quantity, hold the rest.
Price varianceUnit price outside tolerance.Ask for a credit note or an updated PO.
Quantity varianceInvoiced quantity outside tolerance against the order.Confirm the over- or under-delivery was authorised.
Not invoicedOrdered and received, no invoice yet.This is your GRNI balance. Accrue it.
Under-invoicedInvoiced less than was received.Expect a second invoice for the balance.
MatchWithin tolerance on both dimensions.Nothing to do.

The sample data, solved

The file opens on a worked example built to produce every status once. All of it is synthetic.

ItemOrderedReceivedInvoicedPO priceInv. priceQty var.Price var.Status
SKU-100140404024.5024.500.000.00Match
SKU-10023034348.908.9035.600.00Quantity variance
SKU-100360606012.0013.200.0072.00Price variance
SKU-10041001001201.151.1523.000.00Over-invoiced
SKU-1005250256.406.400.000.00No goods receipt
SKU-1006202003.750.00−75.000.00Not invoiced
SKU-1007012120.0018.400.00220.80No PO line
SKU-10083637369.809.800.000.00Under-invoiced
SKU-100912121221.0021.000.000.00Match
SKU-101088845.0045.900.007.20Match

The last row is the one worth studying. It is 0.90 over on a 45.00 line — exactly 2%. Because the comparison is strict, exactly 2% is inside tolerance and the line passes. Move the threshold to 1.9% and the same line fails. That is what a tolerance actually does, and it is why the number deserves more thought than it usually gets.

Where a spreadsheet stops working

This template is honest about its ceiling. It cannot do the following, and no amount of extra formulas will fix that:

Past roughly 200 to 300 invoice lines a month, keeping the item codes aligned by hand costs more than the errors the spreadsheet catches. That is the point where the file stops being a control and starts being a second thing to reconcile.

When automated matching becomes worth it

The switch is worth making when at least two of these are true: invoices arrive from more than a handful of suppliers, item descriptions vary between the order and the invoice, invoices routinely span several orders, or somebody needs to prove afterwards who approved a variance.

ininvoice runs the same line-level comparison as this template, with the same two tolerances, but it reads the documents itself, matches descriptions that are not identical, and keeps the audit trail. If you only want to see the arithmetic without installing anything, the invoice matching checker does that in your browser.

Questions

Is the template really free?
Yes. The file downloads directly, with no signup and no email address. There is no gated version and no watermark.
Does it work in Google Sheets and LibreOffice?
Yes. It uses only SUMIF, INDEX, MATCH, IFERROR, IF, OR, AND and ABS, which behave identically across Excel, Google Sheets and LibreOffice Calc. There are no macros and no external links.
Can I change the tolerances?
Yes, in cells B2 and B3 of the Matching sheet. Every status recalculates immediately.
Is any of the sample data real?
No. Every supplier, item and figure in the workbook is invented for the example.

Related

When the spreadsheet becomes the bottleneck

ininvoice reads your invoices, orders and goods receipts and runs this comparison for you, line by line, with the audit trail attached.

Create a free account

20 documents per month, no card required.