WooCommerce Checkout Not Working? How to Find the Cause
If your WooCommerce checkout page is blank, missing fields, or stuck on “Processing” after Place order, the cause is almost always one of four things: the wrong page or checkout type, a cached or minified checkout, a JavaScript error from another plugin, or a blocked wc-ajax request. Work through them in that order, because each check is quicker than the one after it.
This guide is about the checkout page itself not working. If the page loads fine but the card is declined or the gateway returns an error, that is a different problem, covered in fixing WooCommerce payment failures.
Before you change anything, take a backup, and if the store is live, do the testing on a staging copy where you can. Break-fix on a live checkout is how a small problem becomes a lost afternoon of orders.
1. Confirm the checkout page is set up correctly
Go to WooCommerce > Settings > Advanced > Page setup and check that the Checkout page points at the page you expect. A duplicate “Checkout” page, left over from a theme demo import or a rebuilt site, is common. If the page setting points at a draft or a different page, customers see the wrong thing or a 404.
Then open that page in the editor and see what it contains. There are two kinds of checkout:
- Checkout block. The default for new WooCommerce stores. The page contains the Checkout block.
- Classic checkout. The page contains the
[woocommerce_checkout]shortcode.
The two behave differently. Many older plugins that add checkout fields, upsells, delivery date pickers or custom validation were written for the classic checkout and use hooks that the block checkout does not run. If your fields vanished after a WooCommerce update or a new theme, this is the first thing to suspect. Check the plugin’s documentation to see whether it supports the Checkout block. If it does not, you can either replace it with a block-compatible option or switch the page back to the shortcode.
To switch back, edit the page, remove the Checkout block, add a Shortcode block, and enter [woocommerce_checkout]. Test with a real order afterwards, because the cart page and any express payment buttons may need the same treatment.
2. Exclude checkout from caching, minification and JS delay
The cart, checkout and My Account pages are different for every visitor, so they must never be served from a page cache. WooCommerce tells most caching plugins to skip them, but the setting is not guaranteed, particularly when caching happens at the host, in a CDN, or through a plugin that was installed before WooCommerce.
Check, in whichever of these you use (WP Rocket, LiteSpeed Cache, W3 Total Cache, your host’s cache, Cloudflare page rules):
- The URLs for
/cart/,/checkout/and/my-account/are excluded from page caching. - The cookies
woocommerce_items_in_cart,woocommerce_cart_hashandwp_woocommerce_session_*are respected, so logged-in carts bypass the cache. - JavaScript delay, defer and combine options are off for the checkout page, or the WooCommerce scripts are excluded. Delaying scripts until user interaction is a frequent cause of a checkout that renders but does nothing when you click.
- CSS and JS minification is off for the checkout page, or tested one option at a time.
The quick test: turn off JS delay and minification, clear all caches (plugin, host and CDN), and reload checkout in a private window. If it now works, turn the options back on one at a time to find the one that breaks it, then add the exclusion rather than leaving it off for the whole site.
3. Read the browser console
This step finds the cause more often than any other, and it takes two minutes. Open the checkout page, press F12 (or right-click and choose Inspect), and look at two tabs.
Console tab
Reload the page and look for red errors. A message such as Uncaught TypeError or jQuery is not defined means a script failed, and everything after it on the page stops, including the checkout’s own code. The file path in the error usually names the plugin or theme responsible, for example /wp-content/plugins/some-plugin/.... That is your suspect for step 5.
Network tab
Filter by wc-ajax, then change a field or click Place order. The classic checkout calls ?wc-ajax=update_order_review whenever the address or shipping changes, and ?wc-ajax=checkout when the order is submitted. The block checkout talks to the Store API at /wp-json/wc/store/. Look at the status of those requests:
- 403 Forbidden. A firewall or security rule is blocking the request. Check Cloudflare security events, your host’s firewall, or a security plugin such as Wordfence or iThemes. Look for a rule that matched the checkout URL.
- 404 or 400. The endpoint is not reachable, often because of a redirect, a permalink problem or a rule that strips the query string. Re-saving Settings > Permalinks without changing anything is worth a try.
- 500. A PHP error on the server. Go to step 4.
- The request never finishes. The server is timing out, usually from a slow shipping or tax lookup, or a plugin making a slow external call.
A spinner that never ends after Place order nearly always shows up here as one of those failed or hanging requests.
4. Check the logs and template overrides
For a 500 error or a silent failure, look at WooCommerce > Status > Logs. Choose the most recent fatal-errors log, and any log named after a plugin you suspect. A fatal error will name the file and line, which usually points to the plugin or theme at fault. Your host’s PHP error log will show the same thing. If you do not see logs, turn on WP_DEBUG_LOG in wp-config.php temporarily, reproduce the problem, and turn it off again afterwards.
Next, open WooCommerce > Status and scroll to the Templates section. If your theme overrides WooCommerce templates (for example checkout/form-checkout.php) and the override is older than the WooCommerce version, it is listed as outdated. An outdated checkout template can drop fields, break shipping updates or stop the Place order button submitting. Update the theme, or ask the developer to bring the override up to date, or remove the override so WooCommerce uses its own template.
The Status page also shows whether the WooCommerce database tables are fine, which PHP version you are running, and the memory limit. Low PHP memory can cause a blank checkout on stores with many plugins.
5. Find a plugin or theme conflict
If the console error or log points to a plugin, test it. If you do not know which one it is, use the free Health Check & Troubleshooting plugin. It has a Troubleshooting Mode that switches off all plugins and uses a default theme only for your own logged-in session, so visitors see no change on the live site.
- Install Health Check & Troubleshooting and enable Troubleshooting Mode.
- With every plugin off except WooCommerce, test the checkout. If it works, the problem is a plugin or the theme.
- Switch on one plugin at a time, in the troubleshooting panel, testing checkout after each. When it breaks, you have the culprit.
- To test the theme, switch to Storefront or a default WordPress theme in the same mode.
Once you know the cause, update that plugin, check it supports your WooCommerce version and the block checkout, or replace it. Do not simply leave it disabled and move on without checking what feature it provided, such as address validation or a shipping calculator.
6. Shipping or tax not calculating
If the page loads but shipping options do not appear, or tax stays at zero, the checkout is working and the configuration is not. Check these:
- The customer’s address falls inside a shipping zone under WooCommerce > Settings > Shipping, and the zone has at least one method.
- Products have a weight and dimensions if your shipping methods depend on them. Australia Post style calculators return nothing without them.
- Tax is enabled and the tax rates cover the customer’s state or postcode. For GST, confirm your tax settings with your accountant rather than guessing.
- The shipping calculator’s third party service (an Australia Post or courier plugin) has a valid API key, and its requests are not failing in the Network tab.
WooCommerce also caches shipping rates in the session. After changing a zone or method, add an item to the cart in a fresh private window to see the result, rather than testing in a session that already has rates stored.
7. Test the fix properly
Test in a private window, logged out, on a phone and a desktop. Use a real product, enter an address in each shipping zone you serve, and place a test order with your gateway’s test mode or a low-value product you can refund. Check the order arrives in WooCommerce, the customer email sends, and stock reduces. Clear all caches once more afterwards.
When to ask for help
If the checkout is down and you are losing orders, stop experimenting on the live store and get someone to look at it. Our WooCommerce support for Australian stores covers checkout break-fix, with the cause found, the fix made and the checkout tested before we call it done.
Frequently asked questions
Why is my WooCommerce Place order button stuck on Processing?
The browser sent the order and never got a valid reply. Open the console and the Network tab, filter by wc-ajax, and click the button again. A 403 points at a firewall or security rule, a 500 at a PHP error in the logs, and a request that never finishes at a timeout or a slow external call. A JavaScript error on the page can also stop the button from submitting at all.
Why is my WooCommerce checkout page blank?
Common causes are the page being empty or set to the wrong page in Page setup, a PHP fatal error from a plugin or theme, or low PHP memory. Check WooCommerce > Status > Logs and your host’s PHP error log first. They usually name the file responsible.
Should I use the Checkout block or the classic shortcode checkout?
The block checkout is the default for new stores and is where WooCommerce is putting its development. The classic shortcode checkout still works and suits stores that rely on plugins which have not added block support. Use whichever your required plugins support, and test an order after switching.
Do I need to exclude the checkout from my cache?
Yes. Cart, checkout and My Account pages are personal to each customer and must not be served from a page cache. Also check that JavaScript delay and combine options are not applied to the checkout page.
Be the first to comment