WooCommerce Checkout Not Working? Why Orders Are Failing at the Last Step

Traffic looks normal, products are in stock, and customers are still leaving without buying — because the order never actually goes through. This is the one WordPress problem where every hour it stays broken has a real number attached to it, so here's how to find the actual cause fast.

Shopping cart icon above a three-step checkout progress bar, stalled with a red X on the final payment step
The order doesn't fail loudly. It just never finishes — and the customer leaves.

What is the problem?

A customer adds items to their cart, gets all the way to checkout, fills in their details, clicks Place Order — and nothing happens the way it should. Maybe the button spins and never stops. Maybe it throws a vague error. Maybe the payment is declined even though the card is fine. Whatever the exact shape, the result is the same: a shopper who was ready to buy leaves with an empty cart and no order in your system.

Quick answer: checkout failures are almost never WooCommerce itself breaking. The two most common root causes, by a wide margin, are the checkout or cart page being served from cache when it should never be cached, and a payment gateway configuration issue — wrong keys, sandbox mode left on, or an SSL problem on the checkout URL specifically.

WooCommerce checkout is not a static page. Every time it loads, it's calculating a live cart total, applying tax and shipping rules, checking stock, generating a session, and then handing the payment step off to a gateway plugin that talks to an external payment processor over an API call. That's a long chain, and checkout has to get every link right, every single time, for every single customer — which is exactly why it's more fragile than the rest of the store.

Common symptoms

  • Clicking Place Order spins indefinitely, or the page just sits there with no visible response
  • A generic message appears — “An error occurred, please try again” — with no useful detail behind it
  • A payment gateway declines cards that should work, including your own test cards
  • The checkout page itself loads with missing fields, a broken layout, or fields that won't accept input
  • One payment method completes fine while another fails every time
  • The cart empties unexpectedly the moment checkout is reached, before payment is even attempted
  • It works perfectly on a staging copy of the site but fails on the live one, or the other way round
  • Some customers report it working fine while others can't get past it at all

Why does this happen?

WooCommerce checkout sits at the intersection of more moving parts than almost any other page on a WordPress site: your theme's checkout template, WooCommerce core, a payment gateway plugin talking to a third-party processor, your caching setup, your SSL certificate, and usually at least one or two extra plugins handling things like custom fields, order bumps, or tax rules. Every one of those has to be configured correctly and stay compatible with the others as each updates independently.

Checkout is also the one part of the store that must never be cached and must always run correctly under a live session, which makes it uniquely vulnerable to a caching plugin's default rules that were written with normal pages in mind. A setting that speeds up your blog posts can quietly break the one page where speed matters least and correctness matters most.

Common technical causes

  • Payment gateway API keys that are wrong, expired, or still set to test/sandbox mode on the live site — the single most common cause of a gateway simply refusing every transaction
  • SSL not properly configured on the checkout page specifically, not just the homepage — most gateways refuse to process a payment over a connection they can't verify as secure
  • The cart or checkout page being served from a page cache that should never touch it, which corrupts session data, cart totals, or nonces between visitors and produces exactly the kind of intermittent failure that's hardest to reproduce on demand
  • The newer block-based WooCommerce Checkout conflicting with a plugin or custom field built for the older shortcode checkout — a real and increasingly common cause since WooCommerce shifted its default checkout experience
  • A JavaScript error from a theme or plugin breaking the checkout form's own client-side validation, which stops the Place Order button from ever successfully submitting
  • A broken tax or shipping zone rule throwing a PHP error mid-calculation for certain carts, regions, or product combinations
  • The gateway's own response taking longer than the site's PHP execution time limit allows, which times out a transaction that was actually about to succeed
  • A silent currency, country, or shipping-zone restriction excluding a customer without ever showing them a clear reason why

How to diagnose it

  1. Check WooCommerce → Status → Logs first. This is the single most useful step and the one most people skip. Find the log file matching your payment gateway, and look for an entry timestamped to your failed attempt — it will usually name the exact rejection reason from the gateway's own API response.
  2. Open the browser console during a real checkout attempt. Add something to the cart and go through checkout yourself with developer tools open (F12 → Console). A JavaScript error here means the form itself is breaking before payment is even attempted.
  3. Confirm the checkout page isn't cached. Check the page's response headers for caching indicators, or just exclude /cart/ and /checkout/ from your caching plugin's rules as a direct test.
  4. Test with a built-in gateway like Cash on Delivery or Direct Bank Transfer temporarily enabled. If an order completes fine through one of those, the fault is specific to your card/PayPal gateway, not checkout as a whole.
  5. Note whether you're on the classic shortcode checkout or the newer block-based checkout (check the Checkout page's content in the editor). This matters directly for the fix, since a plugin conflict is often specific to one or the other.
  6. Verify SSL specifically on the checkout URL, not the homepage — look for a padlock warning while actually on that page, since a certificate can be valid site-wide but still misconfigured for a subdomain or a specific asset loaded on that page.

How to fix it, step by step

  1. Exclude the cart and checkout pages from every caching layer — your caching plugin, any CDN, and any server-level page cache your host runs. These pages must generate fresh on every request.
  2. Re-verify your payment gateway's live API keys, and confirm the gateway is explicitly switched out of test/sandbox mode in its settings. This single setting being left on after launch is a very common, very avoidable cause.
  3. Fix any SSL or mixed-content warning on the checkout page itself, since a gateway will refuse to run over a connection it can't verify as fully secure.
  4. If block versus classic checkout is a suspect, switch between them under WooCommerce → Settings → Advanced → Features, and retest. Whichever version clears the conflict tells you which one your problem plugin was actually built to support.
  5. Deactivate other plugins one at a time, starting with anything that touches the checkout form directly — custom field add-ons, order bumps, upsells, or checkout-page tracking scripts.
  6. Check WooCommerce → Settings → Tax and Shipping for a broken zone rule if failures correlate with a specific region or cart contents rather than happening universally.
  7. Raise PHP's max_execution_time slightly if the gateway's own response is simply slow under normal conditions, and confirm with the gateway's support what a typical response time should be.
  8. Update WooCommerce core and your payment gateway plugin together, to versions that are explicitly listed as compatible with each other — checkout is the most version-sensitive part of the whole store.
  9. Place a real, complete test order yourself after every change, start to finish, rather than assuming a setting looks correct. This is the only way to confirm the fix actually holds under real conditions.

When this needs professional help

Most causes above are fixable by a comfortable site owner. It's worth bringing in a developer immediately when:

  • It's actively costing revenue right now and you need a fast, correct diagnosis rather than trial and error
  • You genuinely can't tell whether the fault is on the site or on the payment gateway/merchant account side, and need someone who can check both
  • The failure is intermittent rather than constant, which usually means a caching or session-layer problem stacked with something else, and those are hard to isolate without server access
  • A custom checkout-field or fee plugin needs actual code changes to work correctly with the block-based checkout
  • You've made several changes already and are no longer sure which setting is currently correct

How I can help

A broken checkout is the one WordPress problem I treat as genuinely urgent rather than schedule in around other work, because every hour it stays broken has a real, calculable cost attached to it. I start exactly where the diagnosis above starts — the WooCommerce logs, the gateway configuration, and the caching exclusions, in that order, because that's where this fails most often — rather than guessing or recommending a gateway switch before I know what's actually wrong. WooCommerce stores are a regular part of what I've built and fixed over eleven years of freelance WordPress work, and I test the full order flow end to end before calling it resolved.

RELEVANT WORK

Stores and booking flows I've built and fixed

Two projects where getting a transaction to actually complete was the whole point of the build.

Canvascroft

A live WooCommerce store on Elementor, where a reliable checkout was the difference between a booked project and a lost one.

  • WordPress
  • Elementor
  • WooCommerce

Kinder City

A multi-setting booking flow where a form that silently failed to submit would have meant the same lost conversion as a broken checkout.

  • WordPress
  • Elementor
  • Responsive templates

FAQ

Questions about a broken WooCommerce checkout

What people ask before sending over the site.

Why does checkout fail for some customers but not others?

Usually a caching or session problem, or a gateway rule tied to region, currency or card type. If the cart or checkout page is being cached, one visitor's cart total or session can bleed into another's, which fails inconsistently rather than every time. Region-restricted payment methods produce the same pattern for a different reason.

Is this a WooCommerce bug or a problem with my specific site?

Almost always your site's specific combination of caching rules, gateway configuration and plugins, not a bug in WooCommerce itself. WooCommerce processes an enormous volume of checkouts daily across millions of stores; a core-level checkout bug would be patched within hours, not left for individual stores to work around.

Will I lose the orders that failed while this was broken?

You won't lose data, but you will lose the sale itself in most cases — a customer whose order fails to place rarely retries later, they buy elsewhere. WooCommerce → Orders will show any orders that reached a pending or failed state, which at least tells you how many attempts were made while it was down.

Should I just switch payment gateways to fix this?

Usually not, and it can mask the real problem rather than fix it. If the underlying cause is caching, a plugin conflict or an SSL issue, a new gateway will eventually show the same symptom. Diagnose first with the WooCommerce Status → Logs screen before assuming the gateway itself is at fault.

Why did checkout break right after a WooCommerce update?

Version drift between WooCommerce core and your payment gateway plugin is one of the most common triggers. WooCommerce ships frequent updates; if your gateway plugin, a checkout-field add-on, or your theme's checkout template hasn't been updated to match, the two can disagree about how the checkout page should render or submit.

How do I know how much this is actually costing me while it's broken?

Compare your normal daily order count and average order value against what's come through since the issue started, and treat every hour of downtime as that daily rate divided by 24. It's rarely as small as it feels in the moment, which is the main reason this particular problem is worth fixing fast rather than working through slowly.

Available for new projects

NEXT STEP

Need help fixing this WordPress issue?

Send me your website and I'll help identify the problem — no charge just to take a look. Based in Bangladesh, working with clients worldwide, with a reply within one working day.

  • Reply within one working day
  • Fixed quote before work starts
  • UK, EU and US hours covered