Supplier Invoice Three-Way Match Checker
Supplier invoices do not always match what you ordered or what actually arrived — and every mismatch is money. This free three-way match checker doubles as a purchase order invoice discrepancy checker: load your PO, goods receipt and supplier invoice, and it flags quantity discrepancies, price variances and missing or unexpected lines instantly — before you approve payment. No signup required.
Paste is processed locally in your browser — nothing is uploaded.
Paste is processed locally in your browser — nothing is uploaded.
Paste is processed locally in your browser — nothing is uploaded.
Quantity differences up to this many units are not flagged.
Percentage of the PO unit price — 2 allows invoice prices up to 2% above the PO price.
Load your three documents to start the match
Three quick steps: load the purchase order, the goods receipt and the supplier invoice — paste rows or upload CSV files in any order. The first row of each is treated as column headers, the columns are detected automatically, and the comparison runs once all three documents are loaded and mapped.
How It Works
- 1
Load your purchase order first: paste rows or upload a CSV with one line item per row — SKU and ordered quantity are required, and a unit price or line total unlocks the price checks.
- 2
Add the goods receipt (what actually arrived per SKU) and the supplier invoice (what you are being billed) the same way — the order does not matter.
- 3
Check the auto-detected column mapping in each section and correct it with the dropdowns; the checker tells you exactly which required columns are still missing.
- 4
Set your quantity tolerance (units) and price tolerance (% of the PO price) — with the defaults of zero, any difference is flagged — then review the dashboard: missing lines, short shipments, price variances, duplicate lines and unexpected charges per SKU.
- 5
Download the full reconciliation report or a discrepancies-only CSV, or copy a plain-text summary for your accounts-payable workflow.
Example
- Purchase order PO-2041: SKU-101 Insulated Tumbler — 100 units at 8.50 (line total 850.00).
- Goods receipt: only 90 units of SKU-101 arrive; every other line is received in full.
- Supplier invoice INV-8812 bills all 100 units of SKU-101 at 8.50 and raises SKU-102 to 12.30 against the PO price of 12.00.
- Result: SKU-101 is short-shipped 10 units yet billed for all 100 — about 85.00 billed for stock you never received.
- The checker also flags the 0.30-per-unit price variance on SKU-102, the missing invoice line for SKU-105 and the unexpected SKU-107 line you never ordered.
Accuracy & Limitations
- Rows for the same SKU within one document are aggregated by summing quantities and line totals, so the comparison is per SKU; every duplicated row is listed under Duplicate line so nothing is hidden.
- SKU matching uses a case- and whitespace-insensitive exact key ("SKU-101" equals "sku-101 ") — no fuzzy or partial matching, so differently coded SKUs will read as missing or unexpected lines.
- No currency conversion: the three documents are assumed to share one currency and amounts are compared as plain numbers. When the files carry different currency markers ($, €, GBP…) a warning asks you to verify before acting; when no marker is detected, no currency is assumed.
- Receipt date, location, PO number, invoice number, invoice date and product name columns are optional and are not used in the comparison logic.
- Potential overbilling = amounts billed above PO price expectations (invoiced total − invoiced quantity × PO price) plus amounts billed for units never shown as received — an indicative estimate, not a confirmed overcharge.
- Findings are potential discrepancies for human verification — not confirmed fraud or confirmed overbilling. Always check the original documents before withholding payment or contacting the supplier.
- Each file is capped at 20,000 data rows (extra rows are counted, not processed), and number parsing follows documented spreadsheet heuristics — "1,234" reads as one thousand two hundred thirty-four, while "2,5" reads as the decimal 2.5.
Supported CSV Formats & Columns
Every document needs a header row as the first line. Comma-, tab- and semicolon-separated files all work, including quoted fields, and each file is capped at 20,000 data rows. Columns are auto-detected from common header names — anything not matched automatically can be assigned with the dropdowns. Only the Required columns must be mapped before the match runs.
1. Purchase order CSV
One row per line item as it was ordered.
| Column | Required? | What it does / accepted header names |
|---|---|---|
| SKU | Required | Item identifier matched across all three documents. Detects headers like sku, item_code, product_code, part_number, article. |
| Ordered quantity | Required | Units ordered per line. Detects qty, quantity, ordered_qty, units, ordered. |
| Unit price | Optional | Per-unit price — at least one of unit price or line total is needed for the price checks. Detects unit_price, price, rate, cost. |
| Line total | Optional | Extended line amount, an alternative to unit price. Detects line_total, total, amount, subtotal, ext_price. |
| PO number | Optional | Reference shown in reports; not used in matching. Detects po_number, po, purchase_order. |
| Product name | Optional | Display only. Detects name, title, description, product. |
Example rows
sku,product_name,quantity,unit_price,line_total,po_number SKU-101,Insulated Tumbler 20oz,100,8.50,850.00,PO-2041 SKU-102,Bamboo Cutting Board,50,12.00,600.00,PO-2041
2. Goods receipt CSV
One row per received line — what actually arrived per SKU.
| Column | Required? | What it does / accepted header names |
|---|---|---|
| SKU | Required | Same identifier as on the PO and invoice (case- and whitespace-insensitive). |
| Received quantity | Required | Units actually received. Detects qty_received, quantity_received, received, qty, units. |
| Receipt date | Optional | Any header containing “date”. Recorded but not used in the comparison logic. |
| Location | Optional | Warehouse or bin reference; not used in matching. Detects location, warehouse, facility, site, bin. |
| PO number | Optional | Reference only; not used in matching. |
| Product name | Optional | Display only. |
Example rows
sku,quantity_received,location,receipt_date,po_number SKU-101,90,WH-East,2026-01-12,PO-2041 SKU-102,50,WH-East,2026-01-12,PO-2041
3. Supplier invoice CSV
One row per billed line — what the supplier is charging you for.
| Column | Required? | What it does / accepted header names |
|---|---|---|
| SKU | Required | Same identifier as on the PO and receipt. |
| Invoiced quantity | Required | Units billed. Detects qty_invoiced, quantity_invoiced, invoiced, qty, units. |
| Unit price | Optional | At least one of unit price or line total is needed for the price checks. |
| Line total | Optional | Extended billed amount, an alternative to unit price. |
| Invoice number | Optional | Reference shown in reports. Detects invoice_number, invoice_no, inv, inv_number. |
| Invoice date | Optional | Any header containing “date”. Recorded but not used in matching. |
| Product name | Optional | Display only. |
Example rows
sku,quantity_invoiced,unit_price,line_total,invoice_number,invoice_date SKU-101,100,8.50,850.00,INV-8812,2026-01-14 SKU-102,50,12.30,615.00,INV-8812,2026-01-14
- At least one of Unit price or Line total must be mapped on the purchase order and the supplier invoice — the tool tells you exactly which required columns are still missing before it runs.
- Optional columns never affect the match logic; they are shown in the mapping UI and carried into reports for reference.
- Duplicate SKU rows inside one document are aggregated (quantities and totals summed) and every duplicated row is listed under Duplicate line — nothing is silently merged.
- Number parsing follows spreadsheet heuristics: “1,234.56” reads as one thousand, “2,5” reads as the decimal 2.5.