Price variance between invoice and PO: how to calculate it and when to stop the payment
By Nicolau Matarrodona, founder · Published on · Updated on
The price variance formula is (invoice unit price − PO unit price) × invoiced quantity. Use pre-tax unit prices, line by line. ininvoice's default tolerance is 2% or EUR 1.50 per line, in OR mode. Example: 200 units at EUR 1.00 on the PO and EUR 1.05 on the invoice give a variance of EUR 10.00. Out of tolerance, the payment waits for purchasing.
The price variance between invoice and PO is one of those numbers everyone assumes is well understood until the day a supplier sends an invoice above what was agreed and invoice reconciliation takes two weeks.
This article explains the maths with three EUR examples. No “AI magic”. Just arithmetic a controller can reproduce in a spreadsheet. Thesis: variance is always calculated line by line on pre-tax unit prices, never on header totals.
What is the price variance formula?
The price variance formula that ininvoice applies in three-way matching is:
price_variance = (invoice_price − PO_price) × invoice_quantity
Three details that matter:
- Pre-tax. Unit prices without VAT. VAT is a percentage applied on top and should not enter the calculation.
- Unit. Price of one unit, not line total. If the supplier invoices 100 units instead of 80 at the right price, the price variance is zero (it is a quantity issue).
- Multiplied by invoiced quantity. To express the impact in euros. EUR 0.05 on 200 units is EUR 10; on 20,000 it is EUR 1,000. The formula gives you euros, which is what decides whether you stop the payment.
To separate price from quantity:
quantity_variance = (invoice_quantity − PO_quantity) × PO_price
That way each exception goes to the right team: price to purchasing, quantity to receiving.
Can a small price variance already be out of tolerance?
Yes: a small price variance can break the percentage limit, and ininvoice flags that line.
PO and invoice for a single line of 200 units of a consumable with an agreed price of EUR 1.00 pre-tax. The invoice arrives at EUR 1.05 pre-tax.
| Field | PO | Invoice |
|---|---|---|
| Quantity | 200 | 200 |
| Pre-tax unit price | EUR 1.00 | EUR 1.05 |
| Pre-tax line total | EUR 200.00 | EUR 210.00 |
Calculation:
price_variance = (1.05 − 1.00) × 200 = EUR 10.00
deviation_pct = (1.05 − 1.00) / 1.00 = 5.00%
5% exceeds 2% and EUR 10 exceeds EUR 1.50: the line is out of tolerance and flagged as an exception.
If the invoiced price had been EUR 1.005, the variance would be EUR 1.00 (200 × 0.005). That is below EUR 1.50 absolute and the percentage deviation, 0.5%, is below 2%: both limits are respected, so the line is within tolerance.
What happens when the price variance is large?
A large price variance turns the line into an exception, and ininvoice leaves the invoice for a person to approve, reject or query.
Same scenario, but the supplier invoices at EUR 1.50 pre-tax.
price_variance = (1.50 − 1.00) × 200 = EUR 100.00
deviation_pct = 50.00%
50% and EUR 100. The line becomes an exception and the invoice is not approved without a buyer’s justification (contract change, rate error, rate revision). The most useful figure for whoever follows it up is not the percentage but the euros: EUR 100 is actionable for purchasing.
Why can the totals match while the lines do not?
Matching header totals can hide two opposite price variances. ininvoice compares every line, so both show up.
PO with three lines: A, B and C. Invoice with the same three lines. Invoice total equal to PO total.
| Line | Qty | PO price | Invoice price | PO total | Invoice total |
|---|---|---|---|---|---|
| A | 100 | EUR 2.00 | EUR 2.50 | EUR 200.00 | EUR 250.00 |
| B | 100 | EUR 3.00 | EUR 3.00 | EUR 300.00 | EUR 300.00 |
| C | 100 | EUR 5.00 | EUR 4.50 | EUR 500.00 | EUR 450.00 |
| Total | EUR 1,000.00 | EUR 1,000.00 |
The header total says EUR 1,000 on both sides. Perfect match. If your system cross-checks by totals, this invoice passes. Line by line:
- Line A: variance = (2.50 − 2.00) × 100 = +EUR 50.00
- Line B: variance = EUR 0.00
- Line C: variance = (4.50 − 5.00) × 100 = −EUR 50.00
A is EUR 50 overpriced, C has a EUR 50 discount. They cancel at the header but they hide two undisclosed contractual changes. If your purchase mix changes next month, you lose margin without noticing. That is why honest three-way matching is always line by line: the total never lies, but the lines do.
What tolerance should a price variance have?
ininvoice's default price variance tolerance is 2% OR EUR 1.50 absolute per line. The line is flagged if it exceeds either limit; it stays within tolerance only when it respects both. Why OR and not AND:
- Low prices. A EUR 2 toner with a EUR 0.05 deviation is 2.5% (above the threshold) but only EUR 0.05 absolute. OR flags it, because the percentage is exceeded; AND would let it pass, because the euros are small.
- High prices. EUR 5,000 equipment with a EUR 100 deviation: exactly 2% but EUR 100 absolute. AND would let it pass, because the percentage is not exceeded; OR flags it, because EUR 100 exceeds EUR 1.50.
OR mode is the conservative choice: a line is only within tolerance when both the percentage and the euros are small. AND would only flag lines that exceed both limits at once.
Should the tolerance change by purchase type?
The price variance tolerance in ininvoice is configurable; 2% / EUR 1.50 is only the default. For critical purchases, consider tighter values:
| Purchase type | Suggested % tolerance | Suggested EUR tolerance |
|---|---|---|
| Office supplies, consumables | 3% | EUR 2.00 |
| General equipment | 2% | EUR 1.50 |
| Critical raw materials | 0.5% | EUR 1.00 |
| Professional services | 5% | EUR 5.00 |
Want to match purchase order, delivery note and invoice today? The three-way matching Excel template does it line by line with formulas and tolerances; the three-way matching guide explains each step. Download the three-way matching template
How is price variance different from quantity variance?
ininvoice separates price variance from quantity variance because each one goes to a different team:
- Price variance → purchasing. Why am I being invoiced at a different price from the one agreed?
- Quantity variance → warehouse / receiving. Why have I received a quantity different from what I ordered or what was invoiced?
If an invoice has both, you raise two exceptions in parallel. Mixing them in a single alert sends the wrong team to look at the problem.
When should you pay despite a price variance?
Not every price variance is an error. Three cases where the line is out of tolerance but the invoice is still payable:
- VAT and base rounding. Calculating the pre-tax unit by dividing line total by quantity creates millicent differences that absolute mode absorbs. The Spanish Royal Decree 1619/2012 on invoicing sets out how bases and taxes are broken down.
- Documented contractual adjustments. Signed addendum, price escalation, index revision. If the PO still reflects the previous price, the variance is a stale master-data artefact, not an error.
- Early-payment discount. If you agreed 2% for 7-day payment and the invoice comes gross, the apparent variance is a payment discount, not a matching alert.
In these cases the line is marked as reconciled with justification. That way it does not reappear next month with the same supplier.
What if we show you on your real invoices?
ininvoice cross-checks line by line with a 2% / EUR 1.50 OR-mode tolerance, separates price from quantity variance and leaves each invoice ready for a person to approve. Approved invoices are exported as CSV or Excel, ready to import into your ERP. See it on your own invoices.
Who should own a price variance exception?
ininvoice shows the type of variance on each flagged line, so the exception can go straight to its owner.
- Price variance: to the responsible buyer. A reasonable internal deadline: 48 business hours.
- Quantity variance: to warehouse / receiving. Deadline: 24h. Usually a partial delivery note or an unrecorded receipt.
- Double variance: both in parallel, not in series.
These deadlines are a suggestion for your own process. ininvoice shows which kind of variance each line has and why it was flagged; who follows it up, and when, is decided by your team, and a person always approves the invoice.
What does ininvoice automate in price variance checks?
The variance calculation is trivial when data is structured. The real problem is keeping quantities, unit prices and clean descriptions on invoice, PO and delivery note all at once. ininvoice solves the full chain:
- Automatic intake from Gmail with no manual forwarding.
- Structured reading of PDF, image and scanned invoices, line by line; reading of XML e-invoices is in development.
- Line-by-line matching by description with configurable 2% / EUR 1.50 OR tolerance.
- Automatic separation of price vs quantity variance, with the reason for each flagged line.
- Approval by a person, and export of approved invoices as CSV or Excel, ready to import into your ERP.
Full flow at three-way matching, touchless accounts payable and invoice and delivery note reconciliation.
FAQ
- Why compare pre-tax prices and not VAT-inclusive prices?
- VAT is a percentage on top of the taxable base. Comparing VAT-inclusive only adds noise. The Spanish BOE defines the breakdown in Royal Decree 1619/2012.
- Why multiply by invoice quantity and not by PO quantity?
- Because you express the deviation in euros actually invoiced. The 200 vs 100 unit gap is quantity variance and is calculated separately.
- What if the invoice price is lower than the PO price?
- The variance is negative. It is in your favour but still flagged and justified: a promotional discount or a supplier mistake that will be claimed via a correction invoice.
- What tolerance is typical?
- Typical mid-market tolerances sit between 1-3% and EUR 1-5 absolute per line. 2% / EUR 1.50 OR is a reasonable midpoint.
- Why OR mode and not AND?
- Because OR flags a line as soon as either limit is exceeded: a small percentage on an expensive item (many euros) and a small amount on a cheap item (a high percentage) are both caught. AND would only flag lines that exceed both limits at once, so it lets through deviations that matter.
- How is line-by-line matching done when descriptions vary?
- By semantic similarity of description plus article codes when available. “HP CF410A Toner” should match “HP 410A Black Toner”. Here IDP improves clearly over classic OCR.
- Does line-by-line variance work without a formal PO?
- Without a PO there is nothing to cross-check against. The alternative is matching against historical prices paid to that supplier, weaker but useful. For true three-way matching, purchases go through a PO.
Want to see line-by-line variance on your own invoices?
Send a few supplier invoices with their purchase orders and delivery notes and we will show you, line by line, which ones match and which ones would be flagged. Book a demo.
What should you remember about the price variance formula?
- Price variance is calculated line by line, on pre-tax unit prices, multiplied by the invoiced quantity. Never on headers.
- Tolerance 2% OR EUR 1.50 absolute per line, OR mode: a line is flagged if it exceeds either limit. AND would let through deviations that exceed only one of them.
- Separate price variance (to purchasing) from quantity variance (to warehouse). Mixing them sends the wrong team to the problem.
If you want to see how this looks on your own invoices, run a test with real invoices. Pricing is tailored: a proposal 48 hours after we see your invoices.
Related content
- Invoice matching software
- Calculate variance on your own lines (free checker)
- GRNI reconciliation
- Three-way matching: cross-check invoice, PO and delivery note line by line
- Touchless AP: how far automation really goes
- Invoice and delivery note reconciliation
- Invoice does not match the PO: what to do
- Three-way matching Excel template — the same formula, already wired into a workbook
See a demo with my invoices
Connect Gmail. ininvoice ingests, cross-checks line by line with 2% / EUR 1.50 OR-mode tolerance, and a person approves; approved invoices are exported as CSV or Excel for your ERP.