← All articles
Troubleshooting

Duplicate Transactions: Debugging a Sync Gone Wrong

Duplicates in QuickBooks feel like a haunting. Two identical deposits on the same day. An invoice that exists twice with different numbers. Somebody deletes one and next week it is back. Blame QuickBooks if you like. QuickBooks is almost never the problem.

Duplicates are deterministic. Something wrote a record twice, or two things each wrote it once. There are about five causes in the wild, and you can work through all of them in an hour.

First: duplicate, or double-count?

Check whether the transaction is doubled or just displayed twice. A payment in the bank feed and again as a manual deposit is one event with two records — an unmatched pair, not a sync bug. Half the duplicate-sync calls we take end here.

Cause one: no idempotency key

The big one. Your integration POSTs an invoice, the request times out at the gateway, your code never sees a response and retries. QuickBooks committed both. The API supports a request ID for exactly this — if you are not sending one, every network hiccup mints a duplicate.

The tell: duplicates cluster seconds apart and line up with slow API responses in your logs.

Every duplicate transaction is a retry that nobody taught how to check its own work.

Cause two: two systems, one job

Your storefront connector creates sales receipts. Your payment processor connector also creates deposits. Both are faithfully doing their job on the same money. This is the cause that survives cleanup — you delete the duplicates, and both write them again Monday.

The fix is a map, not a script. One writer per entity type, always. Every other system reads.

Cause three: broken matching keys

Two-way syncs need a stable ID on both sides. Integrations matching on name or amount instead of a stored external ID break the first time a customer goes from "Acme Inc" to "Acme, Inc." — now it is a new entity and its transactions arrive fresh.

Cause four: the replayed backfill

Somebody re-ran the historical import "just to be safe." Or a webhook queue drained after an outage and replayed three days of events into a system with no dedupe. Timestamps give it away: the duplicates land in one burst.

Clean up in the right order

  1. Stop the writers. Pause every integration before deleting anything, or you are bailing with the tap running.
  2. Export the date range and identify duplicates by amount plus date plus entity, not by eye.
  3. Keep the record that is reconciled or linked to a payment. Void rather than delete in a closed period.
  4. Fix the cause, then replay one day and watch it before turning everything back on.

If duplicates keep coming back, the pipeline is the patient — start with a File Audit & Tune-Up, then Data Migration & Cleanup for the wreckage already in the file.

Building Purchase Approval Workflows in QuickBooksWorkflow

Building Purchase Approval Workflows in QuickBooks

When Off-the-Shelf Connectors Stop Being EnoughAPI

When Off-the-Shelf Connectors Stop Being Enough

When Not to Automate a QuickBooks WorkflowStrategy

When Not to Automate a QuickBooks Workflow