WooCommerce Checkout Not Working? How to Fix It Fast
A customer adds a product to the cart, clicks checkout, and — nothing. The page spins forever, the "Place Order" button does nothing, or they get a payment error even though the card is fine. If you sell anything through WooCommerce, a broken checkout is the one bug that costs you money every hour it's live. Here's how we track down the real cause and fix it, instead of guessing plugin by plugin.
What "checkout not working" actually looks like
"Checkout is broken" can mean five different things, and each one points at a different cause. Before you touch any settings, figure out which of these you're actually seeing:
- The checkout page loads, but it's blank below the cart totals — no payment fields at all.
- The page loads fine, but clicking Place Order spins forever and never completes.
- You get a generic "An error occurred, please try again" message.
- The order goes through, but the payment status stays "Pending" or "Failed" even for valid cards.
- Some customers can check out fine, others can't — it's inconsistent.
Open your browser's dev tools (F12 → Console and Network tabs) and reload the checkout page. A red error in the console or a failed request in the Network tab will usually point you straight at the cause below.
Cause 1: SSL or mixed content on the checkout page
Symptom: Payment fields don't render, or the browser shows a padlock warning / "Not fully secure" on the checkout page specifically.
Cause: Most payment gateways (Stripe, Razorpay, PayPal's hosted fields) refuse to load their iframe if the page isn't served over a valid HTTPS connection, or if it's pulling any script, image, or CSS file over plain http://.
Fix:
- Load the checkout page and check the Console for
Mixed Contentwarnings. - In WooCommerce → Settings → General, confirm the store address uses
https://. - Under Settings → General, also check WordPress Address (URL) and Site Address (URL) in Settings → General in wp-admin — both need to be
https://, not just one. - If you're behind Cloudflare, set SSL/TLS mode to Full (strict), not Flexible — Flexible mode is the single most common cause of mixed-content loops on checkout pages.
Cause 2: A caching plugin is serving a stale cart
Symptom: Cart totals look wrong, the same items reappear after checkout, or the order review step shows stale data.
Cause: Full-page caching plugins (WP Rocket, LiteSpeed Cache, W3 Total Cache) sometimes cache the cart, checkout, or my-account pages, which should never be cached because they're session-specific.
Fix: in your caching plugin, explicitly exclude these pages from the cache:
/cart/
/checkout/
/my-account/
Most caching plugins detect WooCommerce automatically and exclude these by default — but if you installed the cache plugin after WooCommerce, or changed page slugs, that detection can silently fail. Check the plugin's "Never Cache These Pages" or "Excluded URLs" list and confirm the paths match your actual page slugs.
Cause 3: The WooCommerce Store/REST API is blocked
Symptom: The checkout page loads but never finishes calculating shipping or tax, or the console shows a 403 or 500 on a request to /wp-json/wc/store/.
Cause: Block-based checkout (the default since WooCommerce 8.x) talks to the front end entirely through the REST API. If your security plugin, firewall, or server config blocks /wp-json/ requests, checkout can't calculate totals or submit the order.
Fix:
- Open the Network tab, filter by "wc/store", and check the response code on those requests.
- If it's a
403, whitelist/wp-json/*in your security plugin (Wordfence, Sucuri) or in ModSecurity if you manage your own VPS. - If it's a
500, checkwp-content/debug.logfor the actual PHP error — it's almost always a plugin hooking into a WooCommerce REST endpoint and throwing a fatal error. - As a fallback while you diagnose, you can switch back to the classic shortcode-based checkout under WooCommerce → Settings → Advanced → Checkout page, which relies less on the REST API.
Cause 4: Payment gateway keys are in the wrong mode
Symptom: Orders fail immediately with an authentication or "invalid API key" error, or every single card gets declined regardless of validity.
Cause: This is the most common cause after a migration or a staging-to-live copy: the gateway plugin (Stripe, Razorpay, PayPal, Authorize.Net) is still using test-mode keys on the live site, or live keys on a staging copy that got indexed and is receiving real traffic.
Fix:
- Go to the gateway's settings under WooCommerce → Settings → Payments.
- Confirm "Test mode" or "Sandbox mode" is switched off on the live site.
- Regenerate live API keys from the gateway's own dashboard if you're not sure which set is currently active — don't guess from a copied
.envfile. - Place one real, small test order yourself to confirm end-to-end before telling customers it's fixed.
Cause 5: A plugin or theme conflict on the checkout template
Symptom: Checkout worked yesterday, broke today, and nothing was touched intentionally — usually right after an auto-update.
Cause: A plugin update changed a hook WooCommerce relies on, or a theme override of checkout/form-checkout.php is now out of date with the WooCommerce version running.
Fix:
- Check WooCommerce → Status → Templates — it flags any theme-overridden template that's outdated compared to the WooCommerce version.
- Deactivate non-essential plugins one at a time (starting with the most recently updated) and reload checkout after each.
- If a theme override is the culprit, update or remove the outdated template file from
yourtheme/woocommerce/checkout/so WooCommerce falls back to its own current version.
Cause 6: Sessions or cookies aren't persisting
Symptom: The cart empties itself between pages, or checkout works in a private/incognito window but not in a normal one for the same customer.
Cause: WooCommerce stores cart data in a PHP session tied to a cookie. If your hosting setup has multiple app servers behind a load balancer without sticky sessions, or a security plugin is stripping cookies, the session breaks mid-checkout.
Fix: on a single-server cPanel or VPS setup this is rare, but check WooCommerce → Status for a "session table" warning, and confirm wp_woocommerce_sessions exists and is being written to during a test checkout. If you're on a multi-server VPS cluster, enable sticky sessions on the load balancer so a customer stays on the same backend for the whole checkout flow.
Quick diagnostic order
| What you see | Check this first |
|---|---|
| Blank payment fields | SSL / mixed content (Cause 1) |
| Stale cart or totals | Cache exclusions (Cause 2) |
| Spinner never finishes, 403/500 in Network tab | REST API access (Cause 3) |
| Every card declined | Gateway test/live mode (Cause 4) |
| Broke right after an update | Plugin/theme conflict (Cause 5) |
| Cart empties randomly | Session/cookie persistence (Cause 6) |
Prevention
- Always test a real order in live mode after any plugin, theme, or gateway update — not just a test-mode order.
- Keep a staging copy for testing updates, and make sure it's excluded from search engines and using its own sandbox gateway keys.
- Set caching exclusions for cart/checkout/my-account the moment you install a caching plugin, not after a customer complains.
- Monitor failed orders under WooCommerce → Orders weekly — a slow climb in failed/pending orders is usually the first sign something's wrong before you notice it yourself.
If you're hosted with Getwebup and you've gone through this list and checkout is still down, open a support ticket with the exact error from your browser console — that one detail usually cuts diagnosis time from an hour to a few minutes.
Frequently asked questions
Why does my WooCommerce checkout page load blank with no payment fields?
This is almost always an SSL or mixed-content issue. Most gateways (Stripe, Razorpay, PayPal) refuse to render their payment fields unless the checkout page loads over a fully valid HTTPS connection with no assets pulled over plain http://. Check your browser console for mixed-content warnings and confirm your CDN/proxy SSL mode is set to Full (strict), not Flexible.
Checkout spins forever after clicking Place Order - what should I check first?
Open your browser Network tab and look for failed requests to /wp-json/wc/store/. A 403 usually means a security plugin or firewall is blocking the REST API; a 500 means a plugin is throwing a fatal error on a WooCommerce hook. Check wp-content/debug.log for the exact error.
Why are all payment attempts getting declined even with valid cards?
Check WooCommerce > Settings > Payments and confirm test/sandbox mode is switched off for the live site. This is the most common cause after a migration, or when a staging copy's keys get carried over to production.
Does caching break WooCommerce checkout?
Yes, if the cart, checkout, and my-account pages aren't excluded from a full-page caching plugin. These pages are session-specific and should never be cached. Check your caching plugin's exclusion list and confirm the URL paths match your actual page slugs.
One customer can't check out but others can - what causes that?
This is usually a session or cookie problem specific to that customer's browser, or, on a multi-server VPS setup without sticky sessions, their requests are landing on a different backend mid-checkout. Ask them to try an incognito window as a quick test, and check whether your load balancer has sticky sessions enabled.