WooCommerce Duplicate Orders: What Can Cause Them?

minions guitar, music, fun, characters, double, cute, two, music, double, double, double, double, double

Something odd happened for the first time on my WooCommerce store: a customer placed an order, got charged, and then—without any visible retry or user error—the exact same order came through again, just milliseconds later.

I had to issue a refund manually, and of course, this raises questions. The only recent change? I switched to the WooCommerce Stripe Gateway’s new “enhanced checkout“. Could it be responsible?

I took the issue to Twitter and got some very insightful responses. Here’s a breakdown of what I found and what you should check if this happens to you.

Possible Cause #1: Multiple Form Submissions

One common explanation came from Katie, who dealt with a similar issue years ago. She found that customers were able to click the Place Order button multiple times before the checkout process finished loading.

This resulted in the same form being submitted more than once. Her fix? Adding a small JavaScript delay to prevent the button from being clicked again too quickly.

If you’re not using Stripe’s new enhanced checkout and still see duplicate orders, this is the first place you should look: can your customers double-click the checkout button?

In fact, even with the new Stripe checkout, this might still be a risk. Enhanced or not, if a frontend interaction allows a second submission before the first finishes processing, you could end up with duplicate payments and orders.

Possible Cause #2: Server Replays

Paul shared an entirely different scenario: his hosting provider (Cloudways) was configured to automatically resend POST requests that took too long to get a response—over 60 seconds in his case. That means if your checkout endpoint is slow (say, due to third-party API calls), the server might repeat the request in an attempt to make it succeed.

The result? Two completed orders, two payments.

If you’re on managed hosting or using a firewall/proxy setup that automatically retries long requests, this is something to investigate. It’s rare, but still possible.

The key takeaway here is to make sure your checkout page and all its AJAX/API components respond quickly and don’t risk hitting timeout thresholds that could trigger such behavior.

Possible Cause #3: Sucuri Firewall Conflict

Brent chimed in with another possibility: the Sucuri Firewall. Turns out WooCommerce recently published a developer blog post noting that misconfigured Sucuri settings may result in duplicated orders.

This happens when the firewall sees a slow request and replays it (thinking it failed), or fails to properly cache the state of a secure form submission.

If you’re using Sucuri, especially in front of a WooCommerce store, be sure to follow Woo’s updated configuration guidelines. In my case, I’m not using Sucuri, so that wasn’t it.

Still Looking at Stripe Enhanced Checkout

Here’s why I keep coming back to Stripe’s new checkout experience: this has never happened to me before, and the duplicate orders occurred right after I switched to it. Yes, correlation is not causation—but I trust my store setup enough to believe something new was introduced.

I spoke to the customer, and they said:

I added the product to my cart without logging into the site. After logging into my account, I completed the order. That’s all. It took almost 1 min after i clicked the “Place Order” button.

The Stripe enhanced checkout relies on new frontend and backend flows, including Stripe’s Elements UI and their own JavaScript logic. If a customer double-clicks or navigates away too quickly—or if there’s a delay in their response back from Stripe—it’s possible something is misfiring.

I’ve raised the issue with the team behind the plugin and will be monitoring closely.

What I Will Do

I don’t want this to happen again—ever. While this might have been a one-off caused by network issues, server configuration, or something Stripe will eventually patch, I want to be prepared.

I’m considering publishing a simple code snippet that prevents duplicate orders by blocking any second attempt from the same customer or IP address within, say, 3 minutes. That way, even if a payment attempt is mistakenly reprocessed, WooCommerce won’t create a second order.

Stay tuned—if I do it, you’ll see it first on Business Bloomer!

What You Can Do

If you’re facing a similar issue, here’s a checklist to go through:

  • Add a JavaScript debounce or disable the Place Order button once clicked
  • Check for POST replay behavior in your server logs, especially on slow checkouts
  • Review firewall or CDN settings, especially if you use Sucuri or similar
  • Switch back from Stripe Enhanced Checkout temporarily to confirm the root cause
  • Log payment intent IDs and order meta to trace duplicate requests

If nothing else, reporting this to the plugin maintainers will help.

Final Thoughts

It’s frustrating to deal with duplicate orders, especially when you’re dealing with refunds and awkward customer communication. But as always with WooCommerce, issues are often environment-specific—and the more we share what works (and what doesn’t), the better we all get.

I’ll update this post if I learn anything new from the Stripe team. Meanwhile, I’d love to know: have you experienced something like this recently?

Related content

Rodolfo Melogli

Business Bloomer Founder

Author, WooCommerce expert and WordCamp speaker, Rodolfo has worked as an independent WooCommerce freelancer since 2011. His goal is to help entrepreneurs and developers overcome their WooCommerce nightmares. Rodolfo loves travelling, chasing tennis & soccer balls and, of course, wood fired oven pizza. Follow @rmelogli

Reply

Your email address will not be published. Required fields are marked *