Blog7 min read

Clover WooCommerce duplicate orders

Orders showing twice between Clover and WooCommerce? The five real causes — webhook retries, double-submit, sync loops, idempotency gaps — and how to stop the duplicates.

Duplicate orders are more than an annoyance — they double-charge customers, double-decrement inventory, and corrupt your reporting. Between Clover and WooCommerce there are five distinct causes, and each has a different fix. Work through them in order; the first two cover the large majority of cases.

1. Webhook retries with no idempotency key

Clover (and WooCommerce) retry a webhook if they don't receive a fast 2xx acknowledgement. If your integration does the work first and acknowledges last — or the work takes longer than the sender's timeout — the sender assumes failure and re-sends, and you process the same event twice. The fix is idempotency: record the event/order ID the moment it arrives, ignore any event ID you've already seen, and return 200 immediately (do the heavy work asynchronously).

The root cause, most of the time: A webhook handler that returns 200 only after a slow sync finishes will get retried and create duplicates. Acknowledge first (200), then process in a background queue keyed by the event ID. This single pattern eliminates the majority of duplicate orders.

2. Customer double-submit at checkout

A customer clicks "Place order", the page is slow, they click again — two orders. Or the payment succeeds but the confirmation is slow, so they refresh and re-submit. Mitigate with a disabled-after-click submit button, server-side order-key deduplication, and (critically) idempotent payment capture so the gateway won't charge the same intent twice.

3. A two-way sync echo loop

In a bidirectional integration, an order created in WooCommerce is pushed to Clover; Clover then emits its own "order created" webhook, which a naive integration imports back into WooCommerce as a second order. The fix is origin-tagging: stamp each record with where it came from and a cross-reference ID, and skip any inbound event that matches a record you just pushed out.

4. Overlapping polling windows

Integrations that poll on a timer (instead of webhooks) can double-import when two polling runs overlap, or when a run re-reads a time window it already processed. Use a high-water-mark cursor (last-synced timestamp/ID) and a lock so only one poll runs at a time.

5. Manual re-sync on top of automatic sync

Hitting a "Sync now" button while automatic sync is also running — or running two sync plugins at once — reimports orders that already came through. Pick one sync mechanism. If you must run a manual sync, make sure it dedupes against existing orders by Clover order ID rather than blindly creating.

Cleaning up the duplicates you already have

  1. Export the affected orders and group by customer + total + timestamp to find pairs created within seconds of each other.
  2. Before deleting anything, check which duplicate actually captured payment — refund/void the extra charge in Clover first if both captured.
  3. Cancel (don't hard-delete) the duplicate WooCommerce order so stock is released and the audit trail is preserved.
  4. Re-check inventory: a double order likely double-decremented stock. Reconcile the affected SKUs.

Preventing it for good

A well-built integration prevents duplicates structurally: idempotent webhook handling (ack-first, dedupe by event ID), origin-tagged records to break echo loops, and a single source of truth for order creation. CloverWoo uses idempotent, webhook-driven sync with cross-reference IDs and a background queue with retry logic, so a retried webhook or a double-click resolves to one order — not two. It's two-way sync, payments, and auto-print in one plugin at $60/mo flat.

Frequently asked questions

Why do my Clover orders appear twice in WooCommerce?

The most common cause is webhook retries without idempotency: if your handler does slow work before returning 200, the sender times out and re-sends, and the event is processed twice. The second most common is a two-way sync echo loop — an order pushed to Clover triggers a Clover webhook that gets imported back. Both are fixed by deduplicating on a stable event/order ID.

How do I stop customers creating duplicate orders by double-clicking?

Disable the submit button on click, deduplicate server-side by order key, and make payment capture idempotent so the same payment intent can't be charged twice even if the request is repeated.

Is it safe to just delete the duplicate order?

Check payment first. If both orders captured a charge, refund or void the extra one in Clover before removing it. Then cancel (rather than hard-delete) the duplicate WooCommerce order so stock is released and you keep an audit trail, and reconcile inventory since the duplicate likely double-decremented stock.

Can running two sync tools cause duplicates?

Yes. Two plugins (or a manual 'Sync now' on top of automatic sync) can each import the same order. Use a single sync mechanism, and ensure any manual sync dedupes against existing orders by Clover order ID instead of creating blindly.

Run Clover + WooCommerce as one system

CloverWoo — sync, payments, and POS operations in one plugin for $60/month.