Duplicate payments July 31, 2026 13 min read

Duplicate payment detection

Paying the same invoice twice is one of the few finance errors that costs real cash immediately, and one of the hardest to notice — because both payments look completely normal. This page covers how duplicates actually happen, the patterns that find them in your own data, how to check before a payment run rather than after, and how to recover the ones already gone.

FlowParse
flowparse.io

Why duplicates survive every control

A duplicate payment is not an anomaly in the data. Both transactions are legitimate-looking: correct supplier, plausible amount, valid approval trail. Nothing about either one is suspicious in isolation, which is exactly why they pass every check designed to catch things that look wrong.

They also do not announce themselves afterwards. The supplier's ledger absorbs the credit, your bank balance is slightly lower than expected for reasons nobody investigates, and the discovery — if it happens at all — comes months later during a statement reconciliation.

So detection is a deliberate exercise rather than a by-product of good process. It is also a fast one, once the payments are data.

The six ways duplicates actually occur

None of these require carelessness — they are structural, which is why every AP function has some.

PatternHow it happensWhat it looks like
Re-sent invoiceSupplier chases with a fresh copySame amount, different invoice number
Two routesOne copy to AP, one to the buyerSame invoice, two entries
Statement then invoicePaid from a statement and the invoiceSame amount days apart
Manual plus batchUrgent manual payment, then the runSame day, two transactions
Vendor duplicatedSame supplier as two recordsDifferent payee names, same bank details
Credit not appliedPayment made, credit ignoredOverpayment rather than a repeat

What it actually costs

The direct cost is the payment itself, and whether you get it back depends entirely on the supplier's goodwill and cash position. A healthy supplier refunds or credits promptly; one in trouble may simply apply it to future invoices, or not respond at all.

The indirect cost is larger and quieter: the time spent discovering it, the reconciliation confusion it causes in the meantime, and the fact that a business making duplicate payments usually has other controls that are equally soft.

Studies and industry benchmarks quote error rates, and they vary too widely to be worth citing here. The honest framing is simpler: if you have never checked, you almost certainly have some, and finding out costs an hour.

The patterns that find them

Exact duplicates — same payee, same amount, same date — are the easiest and the rarest, because most systems block them. The valuable patterns are the near-misses.

Same payee and same amount within a short window, typically thirty days, catches the re-sent invoice and the manual-plus-batch case. Same invoice number across different payees catches the duplicated vendor record. Same amount to similar payee names catches the supplier entered twice under a trading name and a legal name.

And the amount-with-a-difference case: two payments where one is the other minus a small deduction, which is usually a settlement discount taken twice or a payment made both gross and net.

FlowParse
flowparse.io

Running the check on your own payments

The check runs on your bank data rather than on your ledger, because the bank is where a payment actually happened — a duplicate that exists only in the ledger costs nothing, and one that exists only in the bank is invisible to a ledger check.

Convert the statements for the period into one table, then sort by payee and amount. Duplicates in the six patterns above become visible immediately: identical amounts to the same payee cluster together the moment the data is sorted rather than read.

Extraction also flags exact repeats automatically — same date, description and amount — as part of validation, which catches the obvious cases without any manual work at all.

The check on the invoice side

The payment check finds money that left twice. The invoice check finds the cause: the same invoice recorded twice, which is what produces the second payment.

Build an invoice register and look for repeated invoice numbers per supplier, repeated amounts on the same date, and near-identical supplier names. The last is the one that finds a vendor entered twice, which is the root cause of a whole class of duplicates rather than a single instance.

Doing both checks answers a question a single check cannot: whether you have a one-off error or a process that will keep producing them.

FlowParse
flowparse.io

The pre-payment check that prevents most of them

1

Freeze the payment list

The set of invoices about to be paid, as a table.

2

Check within the run

Same supplier and amount appearing twice in the same batch.

3

Check against history

Each amount against the last ninety days for that supplier.

4

Check the numbers

Invoice numbers already marked as paid.

5

Check the vendors

Similar payee names with the same bank details.

6

Review, do not auto-drop

A flagged item is a question, not a decision.

The repeats that are not duplicates

Plenty of legitimate payments look like duplicates and must not be blocked. Recurring charges of the same amount — rent, subscriptions, retainers — repeat by design. Standing orders do the same on a schedule.

Genuinely identical purchases happen too: two units of the same item bought the same day, or two engineers expensing the same conference fee.

That is why the pre-run check flags rather than removes. A control that silently drops payments creates a different and worse problem — a supplier unpaid because an algorithm decided it looked familiar.

The duplicate supplier behind the duplicate payment

The single most productive fix is not a detection rule at all. It is cleaning the supplier list, because a supplier existing twice defeats every check that groups by payee.

Look for near-identical names, the same tax registration number under two records, and the same bank account under two names. Merge them, and a whole class of duplicates stops occurring.

An invoice register makes this a sorting exercise rather than a project: sort by supplier name and the near-duplicates sit next to each other, then confirm with the registration number rather than by eye.

Supplier statements find what your data cannot

Your own records cannot show you a duplicate the supplier recorded but you did not, or a credit they issued that you never applied. Their statement can.

That is why vendor statement reconciliation belongs alongside duplicate detection: it is the external check, and it frequently surfaces overpayments sitting as credits on the supplier's ledger that nobody on your side knew existed.

Run it on your largest suppliers monthly. Those are also the accounts where duplicates are most likely, simply because volume drives frequency.

Recovering one you already paid

Speed matters more than tone. Contact the supplier with the specifics — both payment dates, both amounts, the invoice reference — and ask for a refund or a credit against the next invoice. Vague messages produce vague responses.

A credit is usually easier for the supplier and perfectly acceptable if you trade regularly. A refund is worth insisting on if the relationship is ending or the amount is large relative to your normal spend.

Where a supplier is unresponsive or in difficulty, escalate early rather than politely waiting — an overpayment to a business that later fails is an unsecured claim, and those rarely end well.

What to send when you claim one back

Three things make a recovery straightforward: the two bank transactions with dates, amounts and references; the invoice both payments relate to; and, if you have it, the supplier's own statement showing the credit.

Extracted data provides the first without a search — one filtered table rather than a hunt through PDFs — and the source-file reference on every row is what lets you attach the exact statement page it came from.

Keep the claim and its outcome. Suppliers who have produced one duplicate frequently produce another, and a history is useful the second time.

A worked example: a year of payments

A wholesaler checks a year of payments for the first time. Statements from two accounts are converted into one table of about 2,400 outgoing transactions.

Sorting by payee and amount and applying the thirty-day window surfaces 19 candidate pairs. Eleven are legitimate recurring charges, two are genuinely identical purchases on the same day, and six are real duplicates.

Of the six, three came from a supplier who re-sent invoices with new numbers when chasing, two from the same supplier existing twice in the payment list under a trading name and a legal name, and one from an urgent manual payment that was also included in that week's batch.

Two were recovered as refunds, three as credits against future invoices, and one was already sitting as an unclaimed credit on the supplier's statement — which nobody had reconciled. Total afternoon's work.

The controls that stop them recurring

Detection is a safety net; the process fixes are what reduce the rate. One route for invoices, so a copy sent to a buyer does not enter the pipeline separately. A rule that payments are made from invoices rather than from statements. And a clean supplier master, checked when new records are created.

Separating whoever approves from whoever pays helps here too, as does never making urgent manual payments outside the batch without recording them in the same place.

None of that needs an AP platform. It needs the same discipline that makes every other AP control work, and a monthly check on the data to confirm it is holding.

Who should run this check

Any AP function

If it has never been checked, there is almost certainly something.

Businesses with many suppliers

Volume and vendor-record sprawl drive the rate.

Bookkeepers

A high-value check to run for clients at year end.

After a system migration

Where the same invoices can enter twice through two routes.

Why the data has to be complete

A duplicate check on incomplete payment data misses exactly what it was run to find, and worse, produces a false sense that the accounts are clean.

So the statements have to be provably whole: opening balance plus transactions equals the printed close, per account, with no missing periods between statements. Both checks are quick and both are automatic on extraction.

See extraction accuracy for what that proves and what it does not — it proves your data faithfully contains what the bank reported, not that every payment was correct.

How documents are handled

TLS in transit, processing in EU data centres, originals deleted immediately after extraction, extracted data encrypted at rest, no model training on customer documents — see security.

Choosing the comparison window

Every detection rule needs a time window, and the choice trades false positives against misses. These are sensible starting points to tune against your own data.

RuleWindowCatches
Same payee, same amount30 daysRe-sent invoices, manual plus batch
Same payee, same amount90 daysSlow re-send cycles; more noise
Same invoice number, any payee12 monthsDuplicated vendor records
Similar payee, same amount30 daysTrading name vs legal name
Amount and near-amount30 daysDiscount taken twice, gross and net
Round-number repeatsExclude recurringSubscriptions and rent create noise

Duplicates through payment processors and cards

Card and processor payments create their own duplicate pattern: an invoice paid by card by one person and again by transfer by another, or a subscription charged to two different cards after a renewal.

These are harder to spot because the payee name on a card line is often the processor's descriptor rather than the supplier's, so grouping by payee does not bring them together. Sorting by amount within a window catches more of them than sorting by name.

Converting card statements alongside the bank account is what makes the check complete — the credit card statement is a separate document and its transactions are the ones most likely to be missed.

How often to run the check

Before every payment run for the pre-payment check, because that is the version that prevents rather than recovers. It adds minutes to a run that already exists.

Monthly for the retrospective check on actual bank data, alongside the statement reconciliation — the two find different things and both are quick once the data is extracted.

Annually as a sweep over the full year, ideally before year end, since recovery is easier while a relationship is current and while the supplier's own records still show the credit clearly.

The two moments duplicates spike

Duplicates are not uniformly distributed across the year. Two moments produce far more than the baseline, and both are predictable enough to plan around.

The first is a system migration. Invoices can enter twice — once in the old system and once in the new — and a payment run built from both is the classic outcome. Running a duplicate check on the first three payment runs after a cutover is cheap insurance, and it is exactly when nobody has spare attention.

The second is a staffing change or a busy period, where urgent manual payments are made outside the normal run and never recorded in the same place. The rule that prevents it is simple and rarely enforced: every manual payment gets logged where the batch is built, on the day it is made.

The check you can ask the supplier to run

Suppliers can see something you cannot: whether your account carries a credit balance. Asking a large supplier whether any unapplied credits or payments on account sit against you is a two-minute email that occasionally recovers real money.

It is also the fastest way to find an overpayment made years ago, which no amount of analysis on your own side will surface if the payment looked ordinary at the time.

Combine it with the statement reconciliation rather than treating it as separate — a statement showing a credit balance is the same finding arriving through a different door.

The boundary, stated plainly

FlowParse is a document-extraction engine, not an accounts-payable platform and not an ERP. It has no approval workflow, no purchase-order system, no vendor master, no payment execution and no ledger of its own. Nothing here approves, posts or pays anything.

What it does is turn the documents this work depends on — purchase orders, invoices, delivery and goods-received notes, supplier statements, remittance advice and bank statements — into structured, comparable data, with a completeness check on the statements so the numbers you compare are provably whole.

That is deliberately half the job. The other half — deciding what an exception means, approving a payment, posting a journal — belongs to your process and your people, and any tool claiming otherwise is describing something you would still have to supervise.

The one-hour version

Convert the last twelve months of your main payment account, sort by payee and amount, and look for the same amount to the same payee within thirty days. That is the highest-yield check and it takes an hour including the reading.

If it finds nothing, you have bought certainty cheaply. If it finds something, it has paid for itself several times over — and you now know to run it before every payment run instead of once a year.

Whatever the result, write down which patterns you checked and over what period. A duplicate check nobody documented gets repeated from scratch next year, and the value of the exercise compounds only if the next person can see what was already covered and where the gaps were.

Check a year of payments in an hour

Convert your statements, sort by payee and amount, and see every repeated payment — before the next run rather than after.

Frequently asked questions

Related