The Ledger Stack

Original research · Bookkeeping

We booked the same $342.17 twice . One ledger noticed.

Original research: we planted an exact duplicate charge — same vendor, same amount, same day — in identical books and ran them through four ledgers and two receipt-capture tools. Three of the four ledgers, including both paid accounting platforms, posted it twice without a word. Here is the evidence, the decoy that proves the detection is real, and why the tool that caught it is still not the one to switch to.

By Piper Tanaka Published Aug 26, 2026 Last verified Aug 26, 2026

Some links below are affiliate links — if you subscribe through one, we earn a commission at no extra cost to you. It never changes a verdict; every tool runs the same test books. Full disclosure

Every set of books we run through a tool contains the same planted error: HOME DEPOT #4821, $342.17, charged twice on May 14. Same vendor, same amount, same day, on the business credit card. It is the most ordinary bookkeeping error there is — a card swiped twice, a batch imported twice — and it is the one a month-end close is supposed to catch.

We have now put that identical duplicate in front of six tools. Four ledgers, two receipt-capture tools, the same 162 transactions every time.

Three of the four ledgers posted both charges without a word. That includes QuickBooks Online at $85 a month and Xero at $55 a month — the two platforms most solo bookkeepers are actually running. Meanwhile both dedicated receipt tools caught the same duplicate and stopped to ask a human about it.

That last part is what makes this a finding rather than a complaint. The detection is not hard. Two of the six tools do it well, one ledger does it well, and the products that skip it are not skipping it because it can’t be done.

What each tool did

Scores are item 5 of our 32-point checklist — 2 = caught and triaged, 0 = posted silently. Every cell below has a screenshot behind it in the trial record.

The duplicate charge: HOME DEPOT #4821, $342.17, twice on May 14, 2026
Type Tested tier Verdict
QuickBooks Online Ledger Essentials, $85/mo Missed — 0/2
Xero Ledger Growing, $55/mo Missed — 0/2
Wave Ledger Starter, $0 Missed — 0/2
FreshBooks Ledger Plus, $43/mo Caught — 2/2
Dext Capture Business, $31.50/mo Caught — 2/2
Hubdoc Capture $12/mo flat Caught — 2/2

Prices as verified on the vendors’ own pages between August 10 and 15, 2026, and tracked monthly on our pricing tracker.

QuickBooks Online — missed. Never flagged, not at import and not at posting. Both identical lines appeared in the bank feed with ordinary Post buttons, and posting both raised nothing at all. A human cross-check is the only defense the workflow offers.

Xero — missed. The twins were presented adjacent to each other in the feed, unflagged. Xero does let you exclude a statement line afterwards, but it is buried in a per-line Options menu, and QuickBooks’ Excluded tab leaves a more auditable trail of what you removed.

Wave — missed, with a twist. The twins sat side by side, unflagged. But Wave does ship duplicate detection — at the statement-upload layer, where re-uploading an overlapping date range triggers a “Potential Duplicate Transactions” warning. The concept exists in the product. It just isn’t applied to the transactions themselves, which is where the duplicate lives.

FreshBooks — caught. Both May 14 twins were flagged “Potential Duplicate” at import, with a dedicated triage view offering Mark-as-not-Duplicate or Delete, per row or in bulk.

Dext and Hubdoc — both caught. We submitted the same paper receipt photographed twice, from two angles. Hubdoc raised a “Potential Duplicate Document” banner with a Move-to-Trash / Not-a-duplicate triage view. Dext flagged it too and went further: a side-by-side view of both images, zoomable, under the plain-language question “Does the duplicate item describe the same purchase as the original item?” — with explicit same-purchase and not-the-same actions.

The decoy, which is the part that matters

A tool can “catch duplicates” by flagging every repeated dollar amount. That is not detection, it is noise, and it trains people to click past warnings.

So the dataset contains a decoy: five SiteOne Landscape Supply charges for exactly $342.17, on five other dates — April 3, April 13, May 6, May 29 and June 17. Different vendor, legitimate, unremarkable, and identical in amount to the planted twins. The receipt-capture set carries the same decoy in document form: a SiteOne invoice for the same $342.17.

Every tool that caught the duplicate correctly ignored the decoy. FreshBooks left five same-amount SiteOne charges alone, flagging only the true May 14 pair — a merchant-plus-amount-plus-date heuristic, not an amount match. Dext’s duplicate review reported exactly one matched pair across the whole set: the twins, and nothing else. Hubdoc never flagged the SiteOne invoice either.

That is the finding underneath the finding. The three tools that caught it are not being noisy — they are doing real matching and getting the negatives right too. Which removes the most convenient excuse for the tools that don’t bother.

What this does not mean

It does not mean move your clients to FreshBooks.

On the same 32-point checklist, run against the same books, FreshBooks finished 18/32 — last of the four ledgers (Xero 25, Wave 22, QuickBooks 21). And its worst score is the exact mirror of its best one.

Our dataset also contains a two-week hole in the checking feed, June 8–21. FreshBooks scored 0/2 on it — not because it handled the gap badly, but because in the import-based workflow we tested, the concept cannot exist. No bank feed means no reconciliation, which means no completeness check of any kind. Our missing fortnight would stay invisible forever. Nothing in that workflow can notice data that never arrived.

So the ledger that catches the error you can see is the one that cannot notice the error you can’t. Read together, the two results say something more useful than either alone: these are not “good tool / bad tool” outcomes, they are design choices about which class of error the product takes responsibility for — and none of the six takes responsibility for both.

How we tested, and what we did not test

Identical books every time: 162 transactions across a business checking account and a credit card, April through June 2026, for the same fictional landscaping client, with five planted traps. Every tool got the same transactions in its own native import format. The full dataset, the traps, and the scoring rules are published on how we test.

Two honest limits on the scope of this piece.

We tested the import path, not every path. The ledgers were fed via file import — the workflow a bookkeeper uses when onboarding history or working from statements. Live bank feeds at these tools may behave differently, and FreshBooks’ bank-connection mode has a reconciliation feature we could not test without connecting real accounts.

Two of the tools were tested at the document layer, not the ledger layer. Dext and Hubdoc caught a duplicated receipt, not a duplicated bank line. That is the job they exist to do, and it is a genuinely different test from the one the ledgers failed — which is why they are listed separately above rather than ranked against the ledgers.

One related note, since it comes up: Double, the month-end close tool, ships a Duplicate Vendors check that returned a clean true negative on our contact file at maximum sensitivity. Useful, but a different problem — duplicated vendor records, not duplicated charges.

The underlying trial records for all six tools, including the screenshots behind every verdict above, sit in the same repository as this site. If you want to argue with a score, argue with the evidence.

Related: QuickBooks Online vs Xero for a solo practice · Dext vs Hubdoc · When to move a client off Wave

Filed under: quickbooks · xero · freshbooks · wave · dext · hubdoc · original research · duplicates