WooCommerce fixes / duplicate orders

WooCommerce Duplicate Orders at Checkout? Causes & Fix

Two identical orders, same customer, same total, seconds apart. Almost always the first checkout request never came back, so the customer pressed Place order again. Here's how to tell whether they were charged twice — and stop it happening again.

Last updated: 16 Jul 2026 · ~7 min read

Quick answer

The most common cause is the checkout request timing out. PHP or PHP-FPM kills the request before the gateway responds, the customer sees a spinner that never resolves, and they submit again — creating a second order. Before anything else: open your gateway dashboard and check whether there are two charges or one. WooCommerce showing two orders does not mean two payments.

What a duplicate order actually is

WooCommerce creates the order and then talks to the gateway. If that conversation hangs past your server's execution limit, the request dies. The customer never sees a confirmation — just a stalled page — so they do the reasonable thing and try again. Second order, second attempt at payment.

From your side it looks like a billing disaster. Often it isn't: frequently only one attempt actually captured money, and the other order is an empty shell. But sometimes both went through, and that one you have to fix quickly — a double charge you spot before the customer does is a support ticket, one they spot first is a chargeback.

The most common causes (most likely first)

  1. The checkout request timed out and the customer resubmittedTwo orders seconds to a minute apart, identical totals. Your server error log shows a PHP maximum execution time error or an FPM timeout at that exact timestamp. The gateway API call hung and nothing came back.
  2. A double-click got throughWooCommerce's checkout script normally blocks the form after the first submit. A JavaScript error on the checkout page, or a custom theme checkout, lets a second POST through. Tell: the two orders are one or two seconds apart, and the browser console shows a JS error on checkout.
  3. They went back and started over after a redirect gatewayPayPal or another off-site gateway sent them away, they didn't get a clean return, so they hit back and checked out again. Tell: a gap of minutes rather than seconds, and often two different payment attempts on the gateway side.
  4. The confirmation page failed, so they assumed it hadn't workedThe order-received page 404s or errors. The order and the payment both succeeded, but the customer saw a broken page and bought again. Tell: the first order is perfectly healthy and paid.
  5. A recurring or renewal process ran the same action twiceNot a customer at all — overlapping cron runs or a duplicated scheduled action generating the same renewal order twice. Tell: the duplicates are on subscription renewals, at cron o'clock, with no customer session behind them.

Where to look first

Want to catch the double before the customer does?

Duplicate orders are only cheap if you find them the same day. DiagnosticIQ's free dashboard watches the path between payment and fulfilment, so paid-but-stalled and paid-twice orders surface on one screen instead of in a chargeback notice. The Order Rescue add-on names why each one hung up — a timed-out checkout, a gateway that never returned — and alerts you when stuck orders start piling up.

Get the free plugin

Made by Prima Digital — the team behind this guide. Free forever; no card to install.

How to know you fixed it

Verify

Place a test order on the live store — one order appears, the Place order button stays blocked after the first click, and the confirmation page loads without you having to wait past a spinner.

Frequently asked

Was the customer charged twice?

Check the gateway, not WooCommerce. Two successful charges for the same email means yes — refund one now. Two orders where only one has a transaction ID means only one payment went through.

Which order should I cancel?

The one with no successful payment against it in the gateway. If both were paid, refund one in the gateway first, then cancel its order in WooCommerce so stock and reporting stay correct.

Will cancelling the duplicate refund the customer?

Not on its own. Cancelling an order does not move money — you have to issue the refund through the gateway or through the order's refund panel.

How do I stop it happening again?

Fix what's slow. Raise PHP max execution time and the FPM timeout if your host allows it, and find the gateway call or plugin that's making checkout take that long in the first place.

>_
John O'Keane — Founder, Prima Digital · LinkedIn
Contributions by David Zhang · LinkedIn
I build DiagnosticIQ, the WooCommerce diagnostic plugin, and I've untangled enough timed-out checkouts to know the first question is always "did the gateway take the money twice?".