Vendor statement reconciliation has an unfortunate reputation: tedious, low-yield, and — done the usual way — the leading cause of duplicate payments. The problem isn't the task. It's that almost everyone does it in the wrong direction.
Build your ledger position for the supplier first, from your own data. Then match the statement against it. Never work down the statement entering what looks missing — that is the single largest cause of duplicate payments in accounts payable.
Ask most AP teams about statement reconciliation and you'll get a slightly guilty answer. It's on the list. It gets done for the big suppliers, sometimes, when there's a quiet week. Nobody enjoys it and nobody can point to much that came of it.
That's a shame, because it's the only routine control that looks at your payables from the outside. Every other check you run interrogates your own records against your own records. A supplier statement is an independent second opinion, provided free, by the only other party who knows what you owe.
The standard approach goes like this:
Step 3 is where it fails. You're searching on the supplier's reference format, against your own
reference format, and those differ constantly —
4471 against INV-4471, a leading zero, a branch prefix your team strips on
entry. The search returns nothing. The item looks missing. It gets entered.
It wasn't missing. It was recorded three weeks ago. You've now got two bills for one invoice, and because they have different references, NetSuite's duplicate check has no reason to object. As covered in detecting duplicate payments across subsidiaries, this workflow is the origin of more duplicates than every other cause combined.
Working down the statement makes the supplier's document the source of truth and your ledger the thing being tested. That's backwards. You are trying to find out what you owe. Your ledger should be the fixed position and the statement the thing being compared against it.
Four steps, in this order:
This query produces your ledger position for a supplier as at a chosen date — the document you compare the statement against.
-- Purchase ledger position for one vendor as at a statement date. -- Bills, credits and payments in one list, oldest first. SELECT CASE t.type WHEN 'VendBill' THEN 'Invoice' WHEN 'VendCred' THEN 'Credit' WHEN 'VendPymt' THEN 'Payment' ELSE t.type END AS doc_type, t.tranid AS our_ref, t.trandate AS doc_date, t.duedate, BUILTIN.DF(t.currency) AS currency, ROUND(ABS(t.foreigntotal), 2) AS doc_amount, ROUND(NVL(ABS(t.foreignamountunpaid), 0), 2) AS still_open, CASE WHEN NVL(ABS(t.foreignamountunpaid), 0) = 0 THEN 'Settled' ELSE 'Open' END AS status FROM transaction t WHERE t.entity = /* vendor internal id */ 1234 AND t.voided = 'F' AND t.type IN ('VendBill', 'VendCred', 'VendPymt') AND t.trandate <= TO_DATE('2026-07-31', 'YYYY-MM-DD') AND t.trandate >= TO_DATE('2025-08-01', 'YYYY-MM-DD') ORDER BY t.trandate, t.tranid
Replace the vendor internal id and the two dates. Twelve months of history is usually enough — most statement differences are recent, and older ones will have surfaced on a previous statement.
Add this second query to catch the thing statements most often reveal, and which your own ledger will never tell you about on its own:
-- Vendor credits raised but never applied — money already agreed, -- not yet drawn down. Across all vendors, largest first. SELECT BUILTIN.DF(t.entity) AS vendor, t.tranid AS credit_ref, t.trandate, BUILTIN.DF(t.currency) AS currency, ROUND(ABS(t.foreigntotal), 2) AS credit_value, ROUND(ABS(t.foreignamountunpaid), 2) AS unapplied, ROUND(CURRENT_DATE - t.trandate) AS days_outstanding FROM transaction t WHERE t.type = 'VendCred' AND t.voided = 'F' AND ABS(NVL(t.foreignamountunpaid, 0)) > 0 ORDER BY unapplied DESC
Run this one across all vendors before you reconcile anything. It takes seconds and frequently finds more than the reconciliation itself.
With your position in one column and the statement in the other, match on amount first, date second, reference last. Amount is the only field both parties record identically.
In a spreadsheet this is a lookup on rounded amount within a date tolerance of about ten days. Most lines match immediately. What's left is the interesting part, and it is usually a dozen rows or fewer.
| Gap | Meaning | Action |
|---|---|---|
| On statement, not in ledger | Either a genuinely missing invoice, or one you hold under a different reference | Search by amount and date before doing anything. Only enter if it truly isn't there. |
| In ledger, not on statement | Often a duplicate you already created, or a bill the supplier hasn't issued | Investigate. This column is where your own duplicates confess. |
| Credit on statement, not in ledger | The supplier agrees they owe you money you never recorded | Claim it. Uncontested and immediate. |
| Amounts differ on the same document | A price or quantity dispute, or partial credit applied one side only | Compare against the PO. See the AP recovery audit method. |
| Payment shown, not allocated | You paid; they haven't applied it | Send remittance detail. Prevents them chasing a paid invoice. |
Note that two of these five find money and one finds an error you made. The "in ledger, not on statement" column is uncomfortable but it's the most valuable single output of the exercise, because it's the only routine process that catches a duplicate before you pay it rather than two years afterwards.
Never enter an item from a statement without first searching your ledger by amount and date. Not by reference. If an item of that value exists within a few days of that date for that supplier, assume it's the same document until proven otherwise. This single rule eliminates most reconciliation-induced duplicates.
Reconciling every supplier every month is a poor use of a finance team. Prioritise on where differences are likely and material:
That's typically 25–40 suppliers in a mid-market business, which is a manageable monthly rhythm — and it will cover something like 85% of the value.
The honest limitation of doing this manually is that it only ever reaches the suppliers on your list. The unclaimed credit sitting with supplier 214, who you spend £40,000 a year with and never reconcile, stays unclaimed indefinitely. That's the argument for automating the ledger-position half of the work: not because the method is hard, but because the coverage is what actually determines the total.
Revaion Recover builds the ledger position for every vendor continuously, flags unclaimed credits and unrecorded invoices, and turns each difference into an evidenced claim.
Book a discovery call →Book a 30-minute discovery call. We'll walk through how Revaion reconciles supplier statements against your NetSuite ledger — and what the first reconciliation typically surfaces.
Or email [email protected]
We use your email only to reply to this enquiry. See our privacy policy.