Back to Learn

How do I identify duplicate charges in a statement?

By the Karchu Editorial Team · Last updated

Short answer

To identify duplicate charges, build a fingerprint for each transaction from the date, amount, normalised merchant text and account, then look for fingerprints that repeat within a short window, typically three to five days. Repeats of the same amount to the same merchant on the same day are the strongest candidates. Separately, check for statement periods that overlap, because importing two statements covering the same days duplicates every transaction between them. A repeat is a candidate, not proof, since some merchants legitimately bill the same amount twice.

How it works

Duplicate detection is a matching problem with two distinct causes behind it. Either a merchant charged twice, or the same real transaction entered your records twice. The detection technique is similar and the remedy is completely different.

The technique starts with merchant normalisation, because raw descriptors rarely repeat exactly even for the same shop. Strip the reference numbers, store codes and dates, lowercase what is left, and you get a key that groups reliably.

Then build a fingerprint per transaction from account, merchant key, signed amount and date, and compare fingerprints that agree on everything except a small date difference. An exact date match is too strict because card transactions post a day or two after the purchase.

The second check is structural rather than row by row: compare the date ranges of the statements themselves. If two periods overlap, every transaction inside the overlap is at risk of being imported twice regardless of how it looks individually.

Examples

Two charges of 59.99 to the same subscription, three days apart, in a month where that subscription is billed once. A retry that was not reversed, and a refund is due.

A January statement running to the thirty first and a February statement starting on the twenty fifth of January. Seven days appear in both files. Nothing is wrong with the bank, and importing both without deduplication inflates January by a week of spending.

Five identical charges of 3.40 to the same coffee shop over five weekday mornings. Detected as candidates, dismissed in seconds by a human, and exactly why automatic deletion is the wrong default.

Benefits

Refunds you would otherwise have absorbed. Totals that are actually correct, since a duplicated week quietly distorts every category, every trend and every report built on top of them.

For anyone doing books, it also removes the most common reason a reconciliation refuses to balance.

Common mistakes

Matching on the exact date only, which misses everything that posted a day late.

Matching on amount alone, which flags every commute and every fixed price purchase.

Comparing raw descriptions, so the same merchant under two descriptor strings never matches.

Deleting matches automatically. Duplicate detection should always be reviewable, and the skipped rows should be inspectable.

Fixing an import duplicate by disputing it with the merchant, which wastes everyone's time because no second charge ever happened.

Frequently asked questions

What is the difference between a duplicate charge and a duplicate import?

A duplicate charge means the merchant took your money twice, and it needs a refund. A duplicate import means the same real transaction was loaded into your records twice, usually because two statements overlap, and it needs deduplication rather than a dispute. They look identical in a spreadsheet, which is why both checks are worth running.

Why do overlapping statements happen?

Statement periods are set by the issuer's closing date, not by the calendar, and a period is often described inclusively at both ends. A January statement covering the first to the thirty first and a February one starting on the twenty fifth of January share a week, and importing both without care doubles that week.

How wide should the date window be?

Three to five days covers most posting delays without generating too much noise. A wider window catches more genuine duplicates and many more false ones, particularly for merchants you use often at a consistent price.

Can identical amounts be legitimate?

Frequently. A daily commute, a fixed price lunch, a repeat order and a split payment all produce identical amounts to the same merchant close together. This is why duplicate detection should surface candidates for review rather than delete rows automatically.

What if the amounts differ by a small amount?

Near duplicates with a small difference are usually a retry after a failed authorisation, or the same purchase with and without a tip. Worth reviewing, and worth treating separately from exact repeats.

How Karchu helps

Karchu fingerprints every transaction on date, amount, normalised merchant, description and account, and checks new uploads against what you already have. When two statements overlap in period, the transactions inside the overlap are skipped rather than duplicated, and you are told how many were skipped so you can inspect them.

Likely double charges are surfaced as candidates with the matching rows side by side, and nothing is deleted on your behalf. Duplicate alerts can be switched on if you want to hear about them as they appear.

No bank credentials. Statement files only.

Related reading

Guides

Features

Comparisons

Use cases