Before a company pays a vendor, someone must answer three simple questions. Did we order this? Did we receive it? Is the bill for what we ordered and received? The three-way match answers all three by comparing three documents: the purchase order, the goods receipt note and the vendor’s invoice. In this lesson we see what each document holds, how the match works, what to do when it fails, and how SAP, Oracle and Excel help you.
What you will learn
- What a purchase order, a goods receipt note and a vendor invoice each contain
- How the three-way match works, step by step, and what tolerances are
- A full worked example in rupees, with the journal entries
- How to fix price mismatches, quantity mismatches, partial deliveries and missing GRNs
- Two-way, three-way and four-way match, and when each is used
- How SAP and Oracle automate the match, how to check it in Excel, and the controls that stop duplicate payments and fraud
The three documents
Think of three people telling the same story. The buyer says what was ordered. The store says what arrived. The vendor says what it wants to be paid. If all three stories agree, you can pay with confidence.
| Document | Who creates it | What it holds | Answers the question |
|---|---|---|---|
| Purchase order (PO) | Purchase team | PO number, vendor, item, quantity, rate, tax, delivery date, payment terms | What did we agree to buy, and at what price? |
| Goods receipt note (GRN) | Stores or the person who received a service | PO number, item, quantity received and accepted, date, received by | What actually arrived in good condition? |
| Vendor invoice | Vendor | Invoice number and date, vendor GSTIN, PO number, item, quantity, rate, GST, total | What is the vendor charging? |
A PO is a formal order sent to the vendor once a purchase requisition is approved. A GRN is the internal record that goods were received. An invoice under GST is called a tax invoice, and it must show the vendor’s GSTIN, which you need to claim input tax credit.
Remember: The PO is your promise, the GRN is your proof, and the invoice is the vendor’s claim. Pay the claim only when it agrees with the promise and the proof.
How the three-way match works
The match is done line by line. For each PO line, you compare:
- Quantity: the invoice quantity must not be more than the quantity received on the GRN.
- Price: the invoice rate must agree with the PO rate, within the allowed tolerance.
- Other details: same vendor, same item, GST rate and amount worked out correctly, PO number quoted.
This flowchart shows the whole process from order to payment. Read it from top to bottom. A diamond is a yes or no question: Yes continues down, No goes to the side. (The symbols are explained in the Bank Reconciliation Step by Step lesson.)
Tolerances
Small differences happen all the time, like a rupee of rounding or a small freight increase. If every tiny difference stopped an invoice, the AP team would spend all day releasing holds. So companies set a tolerance: the largest difference they accept without a second approval.
Tolerances are set by the finance controller and written into the AP policy. A common pattern is a percentage with a rupee cap. For our example company the policy is:
| Check | Tolerance |
|---|---|
| Price | Invoice rate up to 1% above the PO rate, and the extra on one line not more than ₹1,000 |
| Quantity | Zero. Never pay for more than was received |
| Invoice rate below PO rate | Accepted, you pay the lower amount |
Tip: A percentage alone is risky on big orders. 1% of a ₹50 lakh line is ₹50,000. A rupee cap such as ₹1,000 keeps large overcharges from slipping through.
Worked example: Patel Auto Components
Patel Auto Components Pvt Ltd in Pune buys material from Shree Ganesh Steels, also in Pune. Both are in Maharashtra, so GST is charged as CGST 9% plus SGST 9%.
The purchase order
PO 4500001234, dated 2 September 2026.
| Line | Item | Quantity | Rate (₹) | Value (₹) |
|---|---|---|---|---|
| 10 | Steel rods | 1,000 kg | 62.00 | 62,000 |
| 20 | Ball bearings | 200 pcs | 150.00 | 30,000 |
| 30 | Packing boxes | 500 pcs | 24.00 | 12,000 |
| Taxable value | 1,04,000 | |||
| GST 18% | 18,720 | |||
| PO total | 1,22,720 |
The goods receipt note
GRN dated 15 September 2026. The store counted what arrived.
| Line | Item | Ordered | Received and accepted |
|---|---|---|---|
| 10 | Steel rods | 1,000 kg | 1,000 kg |
| 20 | Ball bearings | 200 pcs | 180 pcs |
| 30 | Packing boxes | 500 pcs | 500 pcs |
The vendor invoice
Invoice SGS/0457, dated 16 September 2026.
| Line | Item | Quantity | Rate (₹) | Value (₹) |
|---|---|---|---|---|
| 10 | Steel rods | 1,000 kg | 62.50 | 62,500 |
| 20 | Ball bearings | 200 pcs | 150.00 | 30,000 |
| 30 | Packing boxes | 500 pcs | 24.00 | 12,000 |
| Taxable value | 1,04,500 | |||
| CGST 9% | 9,405 | |||
| SGST 9% | 9,405 | |||
| Invoice total | 1,23,310 |
Check: ₹1,04,500 plus ₹9,405 plus ₹9,405 is ₹1,23,310.
The match, line by line
| Line | Quantity check | Price check | Result |
|---|---|---|---|
| 10 | Invoiced 1,000, received 1,000. OK | ₹0.50 above PO rate, which is 0.81%. Extra is ₹500, under ₹1,000. Within tolerance | Match |
| 20 | Invoiced 200, received 180. 20 pcs too many, worth ₹3,000 | Same rate. OK | Hold |
| 30 | Invoiced 500, received 500. OK | Same rate. OK | Match |
How did we get 0.81%? ₹0.50 divided by ₹62 is 0.0081, or 0.81%. That is under 1%, and ₹0.50 × 1,000 kg is ₹500, under the ₹1,000 cap.
Line 20 fails, so the whole invoice goes on hold. The AP team asks the buyer to talk to the vendor. Shree Ganesh Steels confirms that only 180 bearings were sent and the other 20 will not come. It issues a credit note (a document that reduces an invoice) for 20 × ₹150 = ₹3,000 plus GST of ₹540 (CGST ₹270, SGST ₹270), a total of ₹3,540.
The amount to pay is now ₹1,23,310 − ₹3,540 = ₹1,19,770.
| Taxable (₹) | GST (₹) | Total (₹) | |
|---|---|---|---|
| Invoice SGS/0457 | 1,04,500 | 18,810 | 1,23,310 |
| Less: credit note | 3,000 | 540 | 3,540 |
| Net payable | 1,01,500 | 18,270 | 1,19,770 |
Journal entries
Most ERPs use a GR/IR clearing account (goods received, invoice received). It is a temporary account. The GRN puts goods into stock and credits GR/IR. The invoice debits GR/IR and credits the vendor. When both have happened, GR/IR for that PO comes back to zero.
Entry 1: goods received, 15 September. Goods are valued at the PO rate for the quantity received: 62,000 + (180 × 150 = 27,000) + 12,000 = ₹1,01,000.
| Account | Debit (₹) | Credit (₹) |
|---|---|---|
| Inventory, raw and packing material | 1,01,000 | |
| GR/IR clearing | 1,01,000 |
Entry 2: invoice and credit note posted after the hold is cleared (net effect).
| Account | Debit (₹) | Credit (₹) |
|---|---|---|
| GR/IR clearing | 1,01,000 | |
| Purchase price difference | 500 | |
| Input CGST | 9,135 | |
| Input SGST | 9,135 | |
| Shree Ganesh Steels (trade payable) | 1,19,770 | |
| Totals | 1,19,770 | 1,19,770 |
The ₹500 is the small price increase on steel rods that we accepted within tolerance. Depending on how your company values stock, the ERP posts it to a price difference account or adds it to the stock value. GST is 9% of ₹1,01,500, which is ₹9,135 each for CGST and SGST.
Entry 3: payment on the due date.
| Account | Debit (₹) | Credit (₹) |
|---|---|---|
| Shree Ganesh Steels (trade payable) | 1,19,770 | |
| Bank account | 1,19,770 |
GR/IR is now ₹1,01,000 credit minus ₹1,01,000 debit, which is zero. The vendor is fully paid.
Note: Depending on your turnover and the vendor, TDS on purchase of goods may apply and would reduce the payment. We leave TDS out here to keep the match clear.
Common mismatches and how to fix them
| Mismatch | Example | Usual fix |
|---|---|---|
| Price | Invoice rate higher than PO rate | Ask the buyer. Credit note from the vendor, or an amended PO if a new rate was agreed |
| Quantity | Invoice for more than was received | Credit note for the extra, or wait for the rest to arrive |
| Partial delivery | Only part of the order has arrived | Pay only for what was received. Match the rest when it comes |
| Missing GRN | Invoice arrives before the store records the receipt | Ask the store or requester. Record the GRN if goods came, otherwise hold |
| Rejected goods | Goods arrived damaged and were sent back | Credit note or debit note for the rejected quantity |
| Tax error | Wrong GST rate, or IGST charged instead of CGST and SGST | Ask the vendor for a corrected invoice or a credit note |
Price mismatch
The No path is where the work is. This chart shows it in detail.
Common mistake: Changing the PO rate just to make an invoice match, without the buyer’s approval. That removes the whole point of the control. A PO change must be approved like a new PO.
Quantity mismatch and partial delivery
Missing GRN
An invoice with no GRN at all is common. The goods may have arrived and nobody recorded them, or they may not have arrived yet.
For services, the “receipt” is a confirmation from the person who used the service, for example a service entry sheet in SAP (transaction ML81N in SAP ECC). It records which services were done and their value.
Two-way, three-way and four-way match
Not every purchase needs the same level of checking.
| Type | Compares | Used for |
|---|---|---|
| Two-way | PO and invoice | Services or low-value items where no receipt is recorded |
| Three-way | PO, GRN and invoice | Most goods. The standard for stock items |
| Four-way | PO, GRN, inspection result and invoice | Items that must pass a quality check before you pay, like raw material for production |
In a four-way match, the store records the receipt, then the quality team inspects the goods. You pay only for the quantity accepted after inspection, not only received.
How ERPs automate the match
In an ERP, nobody compares the three documents by hand. The system matches when the invoice is entered and blocks it if anything is outside tolerance.
In SAP
- ME21N creates a purchase order.
- MIGO posts the goods receipt against the PO (movement type 101 is a goods receipt for a PO).
- MIRO enters the vendor invoice and matches it with the PO and GRN.
- MIR7 parks an invoice, which saves it without posting, for example while you wait for an answer.
- MRBR releases invoices that were blocked for price or quantity differences.
- F110 is the automatic payment program that pays due invoices in a batch.
On the PO line there is a setting called GR-based invoice verification. When it is on, each invoice line must match a specific goods receipt, which is the strict form of three-way matching. Tolerance limits are set in configuration, with keys such as PP for price variance and DQ for quantity variance.
In Oracle
- Oracle Purchasing creates the purchase order.
- Oracle Receiving records receipts, and inspection where needed.
- Oracle Payables enters the invoice and matches it to the PO or the receipt.
Each PO shipment line has a match approval level: 2-way, 3-way or 4-way. When the invoice is validated, Payables checks it against that level and the tolerances. If something does not agree, it places a hold (for example a price hold or a quantity received hold) and the invoice cannot be paid until the hold is released.
Checking the match in Excel
If your company is small, or you want to test the ERP’s results, you can do the same check in Excel. Make three sheets.
- PO: A PO, B Line, C Item, D Qty, E Rate. Rows 2 to 4 hold the three PO lines.
- GRN: A PO, B Line, C GRN No, D Qty received. One row per receipt, so a line delivered twice has two rows.
- INV: A PO, B Line, C Qty billed, D Rate billed.
On the INV sheet, add three columns.
- In E1 type
GRN qty, and in E2 type=SUMIFS(GRN!$D$2:$D$100,GRN!$A$2:$A$100,A2,GRN!$B$2:$B$100,B2). SUMIFS adds every receipt for that PO and line, so partial deliveries are counted together. - In F1 type
PO rate, and in F2 type=XLOOKUP(A2&"-"&B2,PO!$A$2:$A$4&"-"&PO!$B$2:$B$4,PO!$E$2:$E$4,"No PO line"). The&"-"&joins the PO number and line into one key, like4500001234-10, so XLOOKUP finds the exact line. - In G1 type
Status, and in G2 type=IF(AND(C2<=E2,D2<=F2*1.01,(D2-F2)*C2<=1000),"Match","Hold"). - Copy E2:G2 down for every invoice line.
The IF formula checks our policy: quantity billed not more than received, rate not more than 1% above the PO, and the extra on the line not more than ₹1,000. For Patel Auto Components you get Match on lines 10 and 30 and Hold on line 20. To learn more about IF, see IF function.
- Select A2:G4, then Home > Conditional Formatting > New Rule > Use a formula to determine which cells to format, type
=$G2="Hold", choose a red fill and select OK.
Catching duplicate invoices
Keep an invoice register with vendor GSTIN in column B and invoice number in column C. In D2 type =COUNTIFS($B$2:$B$500,B2,$C$2:$C$500,C2)>1 and copy it down. TRUE means the same vendor has sent the same invoice number twice.
Vendors often write the same number in different ways, like SGS/0457 and SGS-0457. Make a clean key first in E2 with =UPPER(SUBSTITUTE(SUBSTITUTE(C2,"/",""),"-","")), then count on column E instead of C.
Controls against duplicate payments and fraud
The three-way match is the most important control in Procure to Pay, but it works only with these around it:
- No PO, no pay. An invoice without a PO goes back to the requester.
- Different people. The person who creates a PO should not post the GRN, and neither should post the invoice or approve the payment. This is segregation of duties.
- Vendor master control. A new vendor or a change of bank account needs a second person to approve it, and a call back to the vendor on a number you already have, not the one in the change request.
- Duplicate invoice check. Switch on the ERP’s duplicate check. SAP can warn when the same vendor, invoice number, date and amount are entered again, and Oracle Payables checks invoice numbers for the same supplier.
- GST checks. Check the vendor’s GSTIN is active and the invoice appears in your GSTR-2B before claiming input tax credit.
- Split orders. Watch for several POs just below an approval limit for the same vendor on the same day.
- Review before the payment run. Review the payment proposal (in SAP, the F110 proposal) before the run, looking for duplicates, round amounts and new vendors.
Common mistakes
- Paying for the quantity on the invoice instead of the quantity received.
- Posting the GRN on the day the invoice arrives instead of the day goods arrived. The GRN date must be the real receipt date.
- Releasing a hold without a reason recorded, or without the buyer’s approval for a price change.
- Ignoring old balances on GR/IR. A balance that never clears means an invoice or a GRN is missing, or something was paid wrongly.
- Setting tolerances only as a percentage, with no rupee cap.
- Letting one person create vendors, raise POs and approve payments.
Quick recap
- The three-way match compares the PO (what we ordered), the GRN (what we received) and the invoice (what the vendor charges), line by line.
- Pay only for what was received, at the agreed rate, within a small tolerance.
- When the match fails, hold the invoice, find the cause, and fix it with a credit note, an approved PO change or a new GRN.
- The GR/IR clearing account links the GRN and the invoice, and should come back to zero.
- SAP (ME21N, MIGO, MIRO, MRBR, F110) and Oracle (Purchasing, Receiving, Payables) run the match automatically and block what fails.
- Duplicate checks, segregation of duties and vendor master control protect the payment.
Try it yourself
Patel Auto Components orders 50 office chairs from Comfort Seating, also in Maharashtra, on PO 4500001290 at ₹4,200 each. Two chairs arrive damaged and are rejected, so the GRN shows 48 accepted. The invoice is for 50 chairs at ₹4,250 each, plus GST at 18%. The tolerance policy is the same as in the lesson.
- Work out the invoice total.
- Does the price pass the tolerance? Does the quantity pass?
- The vendor agrees to bill 48 chairs at ₹4,200. What credit note should it issue?
- Write the journal entries for the GRN and for the corrected invoice. The chairs are office furniture, a fixed asset.
Answers
1. 50 × ₹4,250 = ₹2,12,500. GST 18% = ₹38,250. Invoice total = ₹2,50,750.
2. Price: ₹50 above the PO rate. ₹50 ÷ ₹4,200 is 1.19%, more than 1%, and the extra is 50 × ₹50 = ₹2,500, more than ₹1,000. It fails. Quantity: billed 50, accepted 48. It fails. The invoice goes on hold.
3. Correct amount: 48 × ₹4,200 = ₹2,01,600, plus GST of ₹36,288, total ₹2,37,888.
| Taxable (₹) | GST (₹) | Total (₹) | |
|---|---|---|---|
| Invoice | 2,12,500 | 38,250 | 2,50,750 |
| Correct amount | 2,01,600 | 36,288 | 2,37,888 |
| Credit note | 10,900 | 1,962 | 12,862 |
Check: ₹2,50,750 − ₹2,37,888 = ₹12,862, and 18% of ₹10,900 is ₹1,962.
4. GRN for 48 chairs at the PO rate:
| Account | Debit (₹) | Credit (₹) |
|---|---|---|
| Furniture and fixtures (fixed asset) | 2,01,600 | |
| GR/IR clearing | 2,01,600 |
Invoice and credit note together (net). GST is 9% of ₹2,01,600, which is ₹18,144 each for CGST and SGST:
| Account | Debit (₹) | Credit (₹) |
|---|---|---|
| GR/IR clearing | 2,01,600 | |
| Input CGST | 18,144 | |
| Input SGST | 18,144 | |
| Comfort Seating (trade payable) | 2,37,888 | |
| Totals | 2,37,888 | 2,37,888 |
GR/IR comes back to zero and the vendor is owed exactly ₹2,37,888.
Where to go next
- Procure to Pay PTP: the full cycle, from purchase requisition to AP reconciliation.
- Bank Reconciliation Step by Step: check that the vendor payments really left your bank.
- Oracle Fusion AI for Finance: how AI is starting to read and match payables invoices.
- Accounting Systems SAP & Oracle: more on the ERPs used in this lesson.