WooCommerce Checkout Not Working? Causes & Fix
Checkout is broken and every hour it stays broken is money gone. In nearly every case the cause is one of two things: a JavaScript error from a plugin or theme, or a checkout request the server is refusing. Here's how to tell which within a minute, and where to go next once you know.
Last updated: 16 Jul 2026 · ~8 min read
The most common cause is a JavaScript error from a plugin or theme, or a blocked AJAX request — either one stops the checkout form submitting. Open your checkout in a private window with the browser console showing and press Place order. A red console error names the guilty file. A 403 or 500 on the checkout request means your server or firewall is refusing it.
What "checkout not working" usually turns out to be
"Checkout not working" is a symptom, not a fault. Underneath, WooCommerce checkout is a form that submits over AJAX and expects a JSON reply. That gives exactly two ways to fail: the browser never sends the request (a JavaScript error stopped it), or the request is sent and something other than a valid reply comes back (a firewall, a crash, or an expired session). Everything below is a variation on one of those two.
So work in that order — browser first, server second. It's much faster than switching plugins off at random on a live store. And if your symptom is sharper than "not working", skip ahead: the Place order button doing nothing, an infinite spinner, a blank blocks checkout, a session has expired message and a cart that empties at checkout each have their own page with a much narrower fix.
The most common causes (most likely first)
- A plugin or theme JavaScript error stops checkout submittingThe console shows a red uncaught error, usually from a file that has nothing to do with WooCommerce. Press Place order and the Network tab shows no request leaving at all — the script died before it could send one. Most often after a plugin or theme update. This matches the button doing nothing symptom exactly.
- The checkout request is blocked or erroring server-sideThe request does leave, but the Network tab shows 403 (a WAF, ModSecurity or security plugin refusing it) or 500 (a PHP crash). A 403 is usually a rule matching something in the address or order notes. A 500 needs the PHP error log at that timestamp. If the order is created anyway, you want error processing your order instead.
- Page caching is serving a stale checkoutIt fails for logged-out customers but works for you as admin, or fails only after the page has been left open a while. Cart and checkout must never be cached. Symptoms include a session has expired notice and a cart that empties on the way to checkout.
- The checkout page itself is broken or misconfiguredThe page renders blank, half-built, or without a form. Either the checkout block or
[woocommerce_checkout]shortcode is missing from the page, or the wrong page is selected underWooCommerce → Settings → Advanced → Page setup. A blank block checkout has its own fix: checkout blocks blank. - No payment method is available, so there is nothing to submitThe form loads fine but the payment section is empty or shows only one unexpected option. Nothing is technically broken — the gateway is unavailable for this cart, currency or country. See payment methods not showing.
- A recent update introduced a conflictIt worked yesterday and nothing else changed. Check the update history for WooCommerce, your theme, your gateway and your optimisation plugin. This isn't a separate mechanism — it's how causes 1 to 4 usually arrive.
Where to look first
- Reproduce it yourself first, in a private window, as a logged-out customer. Real product, real address, all the way to Place order. If it works for you as admin but not for them, suspect caching (cause 3) immediately.
- Open the browser console before you press Place order. A red uncaught error means cause 1 — the file it names is your culprit, and it's usually not a WooCommerce file.
- Watch the Network tab as you submit. No request leaving at all confirms cause 1. A request that returns 403 or 500 is cause 2 — the browser is doing its job and the server is refusing.
- Check whether an order was created anyway. If checkout errored but the order is in your admin, you have a different problem with a much more specific fix — see error processing your order.
- Only then run a conflict test. Deactivate non-essential plugins, switch to a default theme, confirm checkout works, then re-enable in halves. Do it on staging if you possibly can.
Checkout is down right now — need the cause, not a checklist?
Working through console errors and conflict tests while checkout is down is a bad way to spend an hour, and a conflict test on a live store is its own kind of risk. DiagnosticIQ's free dashboard runs the checkout checks in one screen — gateways, the checkout page setup, blocked requests, JS errors on the checkout path — and the AI names the specific break, down to which plugin's script is throwing, in about 30 seconds. And it keeps watching afterwards, so the next time an update takes checkout down you hear it from DiagnosticIQ rather than from a customer.
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
Complete a real end-to-end test order in a private window as a logged-out customer — checkout should submit, land on Order received, and leave a clean browser console with a 200 on the checkout request.
Frequently asked
How do I find which plugin broke checkout?
Read the console error first — it names a file, and that file names the plugin. Only fall back to deactivating plugins in halves if the console is clean.
Checkout works for me but not for customers. Why?
You're almost certainly logged in and bypassing the page cache. Test in a private window as a logged-out customer, and exclude cart and checkout from caching.
Am I losing orders while this is broken?
Yes, and mostly invisibly — customers who can't check out just leave. Look at your order rate per hour rather than waiting for complaints.
Should I disable plugins on the live store to test?
Only as a last resort, and only after the console and Network tab have come up empty. Use a staging copy if you have one.