

Your WooCommerce checkout is not working β and every minute it stays broken, you're losing orders. This guide is the systematic version of what we do when a client calls us with exactly this emergency: a diagnosis tree that finds the root cause in a defined order instead of guessing, covering every major symptom β blank checkout page, endless spinner, dead "Place Order" button, orders stuck on processing, and the worst one: orders that just silently stop.
After maintaining WooCommerce stores for over a decade, we can tell you where the bodies are buried: roughly in this order, it's plugin conflicts β caching β payment gateway β theme β JavaScript errors β server. That's exactly the order we'll work through.
Before any deep debugging, three fast checks that solve a surprising share of cases immediately:
Store live and losing money right now?
If you have recent orders in the database and the failure started after an update: restore last night's backup or roll back the updated plugin first, debug afterwards on staging. Revenue beats root cause analysis.
| Symptom | Most likely cause | Start at |
|---|---|---|
| Checkout page completely blank (white screen) | Fatal PHP error β plugin or theme | Step 2 + debug log |
| Endless spinner, checkout never finishes loading | Failing AJAX request β caching or JS error | Step 3 |
| "Place Order" button does nothing | JavaScript error, minified/combined JS | Step 6 |
| Error: "session expired" or "invalid nonce" | Page cache serving stale nonces | Step 3 |
| Payment fields not showing (no card form) | Gateway script blocked or keys invalid | Step 4 |
| Orders stuck on "pending payment" | Webhook/IPN not reaching your site | Step 4 |
| Checkout works, but no confirmation emails | wp_mail / SMTP failure | Step 7 |
| Orders silently stopped β no errors anywhere | Any of the above, undetected | Prevention |
Debugging without evidence is guessing. Five minutes of setup saves hours:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
In our agency experience, a plugin conflict β usually triggered by an update β is the single most common reason a WooCommerce checkout stops working. The classic diagnostic is brutal but definitive:
Two ways to do this without nuking your live store:
Usual suspects, from years of incident reports: optimization/caching plugins, security plugins with aggressive firewall rules, multi-currency and B2B/pricing plugins, checkout-field editors, quantity-discount plugins, and β ironically β outdated payment gateway plugins themselves.
Caching plugins are essential for performance β and the most common non-obvious cause of a broken checkout. Two separate failure modes:
Cart and checkout pages are dynamic per customer and must never be page-cached. WooCommerce also protects checkout submissions with nonces β security tokens with a limited lifetime. If a page cache serves a checkout that's hours old, the embedded nonce is expired, and customers get "session expired" or nonce verification errors while everything looks fine to you.
Features like "combine JavaScript", "defer JS" or "delay JS execution" routinely break checkout scripts and payment gateway iframes (Stripe Elements, PayPal buttons). The symptom is usually a spinner that never stops or payment fields that never render.
If the checkout page itself is healthy but payment fails or fields don't appear, the gateway layer is your suspect:
The fastest theme test takes two minutes:
A "Place Order" button that does nothing β no error message, no spinner, no request β is a JavaScript failure until proven otherwise. The checkout's validation and submission are JS-driven; one fatal error higher up the page stops everything below.
Uncaught TypeError / $ is not a function point to jQuery conflicts; errors in minified bundles like min.js files point back to Step 3b.?wc-ajax=checkout request? If it returns 403, suspect a security plugin/WAF; 500, read the debug log (Step 1); if no request fires at all, the JS error above is your cause.If everything above is clean, go one level down:
Allowed memory size exhausted in the debug log β raise memory_limit (256M+) in your hosting panel.wp_mail() without SMTP is unreliable. Install an SMTP plugin with a transactional provider and check WooCommerce email settings.max_execution_time β visible as intermittent failures under load.A checkout that renders is not a checkout that works. After any fix, run the full flow:
4242 4242 4242 4242 β verify order created, stock reduced, confirmation email received, webhook delivered.Here's the pattern behind almost every case in this guide: the checkout didn't break while anyone was watching. A plugin auto-updated at 3 a.m. A cache rule changed. An API key expired. And WooCommerce's failure mode is silence β no error email, no dashboard warning. Orders just stop, and the first alert is a customer complaint or a suspiciously quiet sales day.(We've seen stores lose a full weekend of revenue this way β it's why "orders suddenly stopped coming in" gets its own guide.)
ShopMonitor runs a real test purchase through your WooCommerce checkout around the clock, verifies every step visually with AI, and alerts you the moment anything breaks β plugin update, cache rule, expired key, whatever the cause. Every troubleshooting step in this guide gets easier when you know exactly when it broke.
Start your free 14-day trial βNo credit card required. Set up in 5 minutes, no code changes.
The five most common causes, in order of likelihood: a plugin conflict (usually after an update), caching or JS optimization on the checkout page, a payment gateway problem (keys, webhooks, SSL), a theme incompatibility (outdated template overrides), or a JavaScript error blocking the checkout scripts.
A white screen is almost always a fatal PHP error. Enable WP_DEBUG_LOG, reload, and read wp-content/debug.log β the stack trace usually names the responsible plugin or theme directly.
That's a JavaScript failure in nearly every case. Open the browser console (F12) and look for red errors β typical culprits are JS minification/combination by a caching plugin, a jQuery conflict from the theme, or a blocked payment gateway script.
The payment gateway's confirmation callback (webhook/IPN) isn't reaching your site. Check the delivery log in your Stripe or PayPal dashboard and make sure no security plugin or server firewall blocks the callback URL. Orders on "processing" are different β that status means payment succeeded.
Use your gateway's test mode with proper test card numbers: one successful purchase, one decline, one 3D Secure run β verifying order creation, stock, emails and webhooks each time. Then repeat after every future update, because that's when checkouts break.
Because you're testing as a logged-in admin, which bypasses page caches and behaves differently. Always test logged out, in an incognito window, ideally on another device β that's the version of your store customers actually see.

About the author
Written by the Winning Solutions team β the agency behind ShopMonitor. ShopMonitor is built by founders who have been building and maintaining WooCommerce stores for over a decade. Every step in this diagnosis tree comes from real client emergencies β and ShopMonitor is the tool we built so the emergency call comes from a robot, not a customer.