WooCommerce checkout not working? Causes and fixes by symptom
A broken WooCommerce checkout rarely says why. The page spins, a section stays empty, or “Place order” does nothing. Each of those symptoms points to a short list of causes. Find the one you see below and work through its causes in order.

First, find the step where it stops
Open the store in a private window, on your phone and on a desktop, and try to buy as a guest. Note exactly where it stops: adding to cart, loading the checkout, choosing shipping, the payment step, or after clicking “Place order”. That single observation rules out most of the causes below.
Open the browser console (right-click → Inspect → Console) while you try. A red error in the console is the fastest clue you will get. Then check WooCommerce → Status → Logs for fatal errors and gateway logs from the same minute.
No time to test by hand? The free WooCommerce checkout checker walks the same path in a real browser, stops before payment, and shows the step where it broke, with screenshots.
“Add to cart” does nothing, or the cart is empty
If the button spins and nothing lands in the cart, or the cart is empty on the next page, the session is not surviving. The usual causes are a page cache serving the cart, a CDN or host cache that ignores the WooCommerce session cookies, or a JavaScript error from another plugin that stops the AJAX add to cart.
The fix: exclude /cart/, /checkout/ and /my-account/ from every cache layer, and make sure no cache is served to visitors who carry the woocommerce_items_in_cart or wp_woocommerce_session_ cookies. Then try with AJAX add to cart turned off (WooCommerce → Settings → Products): if the plain form works, a script is the problem. See also cart fragments and CDN rules for the checkout.
The checkout spins forever or stays blank
An endless spinner, or a checkout with no form, means the checkout script never finished. The usual causes are JavaScript optimisation (delay, defer or combine JS) holding back WooCommerce or gateway scripts, a cached checkout page with an expired nonce, or a PHP error in the request that refreshes the totals.
The fix: exclude WooCommerce and payment gateway scripts from optimisation, exclude the checkout from page caching, purge every cache and test again in a private window. If the console shows a failed request to ?wc-ajax=update_order_review or to /wp-json/wc/store/, open it in the Network tab: the response usually names the plugin that failed.
On the block checkout, an extension that does not support blocks can leave a section missing. WooCommerce flags incompatible extensions when you edit the Checkout page; see moving to the block checkout.
No shipping options appear
If the address is filled in and no shipping method shows, WooCommerce found no zone or method that matches. Check that the customer’s country and postcode fall into a shipping zone, that the zone has an enabled method, and that the products have the weight or dimensions a table-rate or carrier plugin needs.
If rates come from a carrier API, the API may be failing or slow, and many plugins then show nothing instead of an error. Look for the carrier plugin’s log under WooCommerce → Status → Logs. More in shipping rates that fail silently.
No payment methods, or the payment box never loads
An empty payment section, or a card field that never renders, points to the gateway: test mode left on, wrong or expired API keys, a country, currency or cart total the gateway is not enabled for, or a script blocked by a consent banner, a Content Security Policy or optimisation.
Our guides to a failing payment gateway and why payment methods disappear go through each cause.
“Place order” does nothing, or shows an error
Read the message it shows. “We were unable to process your order, please try again” usually means the security nonce expired, often because the checkout page came from a cache, or the session was lost. No message at all, or a 500, 502 or 504 error, means the server failed: PHP ran out of memory or time, or the host ran out of PHP workers under load.
A security plugin or firewall can also block the checkout request itself, and a CAPTCHA on the checkout can fail for real customers. Check the firewall log for blocked requests at the same minute; see security plugins that block the checkout.
For server errors: read the server error log for the same minute, raise WP_MEMORY_LIMIT if the log says memory ran out, find slow plugins with Query Monitor, and ask your host about PHP worker limits before your next sale.
Find out your checkout broke before your customers do.
Real checkout checks for Magento and WooCommerce · 14 days free · no card requiredThe order goes through, but stays pending or sends no email
If customers are charged but orders stay on Pending payment, the gateway’s confirmation (webhook or IPN) is not reaching the store; see the payment gateway guide. If orders arrive but nobody gets an email, mail is failing, not the checkout; see order emails not sending.
It works on desktop but not on phones
A cookie banner, chat widget or newsletter pop-up often covers the button on small screens. Try the checkout on a phone with those scripts disabled; if it works, keep them off the checkout page. More in mobile checkout failures.
Still broken? Find what changed
The most common root cause is a recent update to a payment gateway, a shipping plugin, a checkout-fields editor or the theme. Look at what changed in the last day or two under Dashboard → Updates or in your host’s activity log.
Then, on a staging copy or during a quiet hour, switch to a default theme (Storefront) and deactivate plugins one by one, starting with the recently updated ones, until checkout works. Roll that plugin back to its previous version and report the issue to its author. Next time, update plugins safely.
Make sure it does not happen silently again
Every cause above has one thing in common: the store keeps loading, so an uptime check stays green while nobody can buy. Most owners find out from a customer email, or from an order report that is too quiet.
The permanent fix is to test the checkout itself on a schedule: add a product, go through shipping and payment, check the totals, and get an alert with the step that failed as soon as it breaks.
When totals or shipping do not refresh, see WooCommerce update_checkout not working.
Common questions
Why does my WooCommerce checkout keep loading?
Usually a JavaScript optimisation setting or a cached checkout page stops the checkout script from finishing. Exclude the checkout from page caching and WooCommerce scripts from delay, defer and combine, then purge every cache.
Why does the Place order button not work?
An expired nonce or lost session from a cached page, a server error, or a firewall blocking the request are the usual causes. The message on screen, the browser console and the server error log for the same minute tell you which.
Why are there no payment methods at checkout?
The gateway is not enabled for that country, currency or cart total, its API keys are wrong or in test mode, or its script is blocked. See why payment methods disappear.
How do I test my WooCommerce checkout without placing an order?
Go through it as a guest up to the payment step in a private window, or run the free WooCommerce checkout checker, which does the same in a real browser and stops before payment.
How do I find out when the checkout breaks again?
An uptime check will not tell you, because the store keeps loading. A scheduled checkout test that adds a product and goes through shipping and payment alerts you with the step that failed.