Skip to content
WooRescueHQ

WooCommerce / Checkout

WooCommerce Checkout Not Working: How to Diagnose the Root Cause

Short answer

Place a test order with the browser's Network panel open. If clicking Place Order sends no request, the cause is JavaScript. If the checkout request (?wc-ajax=checkout, or the Store API for the Checkout block) returns an error or invalid output, read the WooCommerce fatal-errors log and the PHP error log at that exact time. If the order is created but payment fails, the problem is in the gateway handoff.

Symptoms

  • The checkout spinner never stops after clicking Place Order.
  • Clicking Place Order does nothing at all.
  • A generic error appears: There was an error processing your order, We were unable to process your order, please try again, or an empty red notice.
  • Checkout works for some customers but not others: guests, one payment method, one country, mobile only.
  • The order is created as Pending payment or Failed, but the customer never reaches the payment page or the thank-you page.

Most common causes

  1. A PHP fatal error in a checkout hook — custom fees, fields, shipping or validation code that fails with the current WooCommerce or PHP version.
  2. PHP warnings or notices printed into the response, which corrupt the JSON the checkout script expects.
  3. A JavaScript error that stops the checkout script before it sends the request: theme scripts, optimisation plugins that defer or combine scripts, consent tools blocking payment scripts.
  4. Page caching of the checkout serving expired nonces or someone else's session data.
  5. A security layer blocking the request: security plugins, ModSecurity rules, a CDN or WAF rule, or REST API restrictions (which affect the Checkout block).
  6. Gateway errors returned during order processing: wrong keys, test/live mismatch, currency or amount validation.
  7. Server limits: PHP execution time, memory, or exhausted PHP-FPM workers under load.

Diagnosis

1. Identify which checkout the store uses

The classic checkout ([woocommerce_checkout] shortcode) refreshes totals with ?wc-ajax=update_order_review and places the order with ?wc-ajax=checkout. The Checkout block places orders through the Store API, a POST to /wp-json/wc/store/v1/checkout. Knowing which one you have tells you which request to look for — and why a rule that blocks the REST API breaks only the block.

2. Reproduce with the Network panel open

Open the browser's developer tools on the Network tab, preserve the log, and place a test order — on a staging copy if you can, otherwise with a low-value product or a test payment method.

What you see What it means
No request when clicking Place Order The browser never sent it: JavaScript
checkout request returns 500 PHP failed on the server
checkout request returns 403 or 406 A security layer blocked it
200, response starts with HTML or a PHP warning Output printed before the JSON
200, "result":"failure" with a message WooCommerce or the gateway rejected the order
Request pending for 30–60 s, then 502/504 A timeout: slow PHP, external call or exhausted workers

3. Read the error at the exact time of the failure

Note the time of the failed test order, then check:

  • WooCommerce → Status → Logs — the fatal-errors source and the payment gateway's own log.
  • The PHP error log from your hosting panel, or wp-content/debug.log if WordPress debug logging is enabled.
  • The browser console for JavaScript errors when no request is sent.

4. Correlate with recent changes

List everything that changed before the problem started: WooCommerce, extension and theme updates, PHP version, new plugins, caching or CDN settings, security rules, payment gateway settings. Most checkout failures start right after a change.

5. Isolate on staging, not on production

If the evidence points to an interaction rather than a single error, reproduce it on a staging copy and isolate it there: switch to a default theme such as Storefront, then disable plugins in halves until the failure disappears. The Health Check & Troubleshooting plugin's troubleshooting mode can do this for your own browser session only, without affecting customers.

Logs and technical checks

  • WooCommerce → Status → System status: WooCommerce version, PHP version and limits, and the list of template overrides flagged as outdated.
  • Logs: fatal-errors, the gateway's log source, the PHP error log, the web server error log for 403/5xx responses.
  • Caching: confirm that /cart/, /checkout/ and /my-account/ (and their translations) are excluded from the page cache, the CDN and any HTML optimisation.
  • Security: security plugin logs, WAF events or ModSecurity hits for wc-ajax=checkout or /wp-json/wc/store/.
  • Response body of the failing checkout request: copy it in full. A single Warning: line before the JSON is enough to break the classic checkout.

Solutions

  • Fix the failing code, not the symptom: a custom fee or validation function that throws a TypeError on PHP 8 needs a type-safe fix, not a higher memory limit.
  • Roll back the one update that introduced the failure, while the real fix is prepared on staging.
  • Exclude checkout from caching and optimisation, including script combination and deferral of payment scripts.
  • Allow the checkout endpoints in the security plugin or WAF, scoped to those paths, instead of disabling protection.
  • Update outdated template overrides in the theme, or remove overrides that are no longer needed.
  • Move slow external calls (shipping rates, tax services, ERP lookups) out of the checkout request or cache them.
PHPmu-plugins/checkout-fee.php
// A fee callback that survives unexpected values on PHP 8.
add_action( 'woocommerce_cart_calculate_fees', function ( WC_Cart $cart ) {
    $rate = (float) get_option( 'my_handling_rate', 0 ); // was a string + float TypeError
    if ( $rate <= 0 ) {
        return;
    }
    $cart->add_fee( __( 'Handling', 'my-store' ), $cart->get_subtotal() * $rate );
} );

What not to do

  • Do not disable plugins one by one on the live store during trading hours: it breaks other flows and loses orders in progress.
  • Do not enable WP_DEBUG_DISPLAY on production. Log errors; never print them to customers.
  • Do not edit WooCommerce core files or copy core templates into the theme to "fix" checkout.
  • Do not raise memory and time limits blindly. If a checkout request needs 60 seconds, something in it is wrong.
  • Do not switch payment gateways or reinstall WooCommerce before the cause is known.

When to contact an expert

Bring in an engineer when the error points to custom code you cannot safely change, when checkout fails intermittently without a clear error, when payments are taken but orders fail, or when the store is losing orders right now and every minute counts.

Frequently asked questions

Why does WooCommerce checkout keep loading?

Because the checkout request failed, timed out or returned output the page could not read — typically a PHP fatal error, a PHP warning printed into the response, a request blocked by a security rule, or a server timeout. The response of the checkout request in the Network panel tells you which.

Why do I get “We were unable to process your order, please try again”?

On the classic checkout this message usually means the security nonce sent with the order was not valid — very often because the checkout page was served from a page cache. Exclude cart, checkout and account pages from every cache layer, including the CDN.

Why does checkout fail only for guests?

Guests have no session until they add something to the cart, so cached pages, expired nonces, guest checkout settings and plugins that behave differently for logged-out users affect them first. Test a guest order in a private window and compare the checkout request with a logged-in order.

Can a WooCommerce or plugin update break checkout?

Yes. Updates change hooks, templates and JavaScript. If checkout broke right after an update, compare the time of the failure with the update, check for outdated template overrides under WooCommerce → Status, and reproduce the problem on a staging copy.

$ describe the problem

Have a WooCommerce problem?Request a diagnosis.

Tell us what is failing, what changed recently and the business impact. We review every request and recommend the appropriate next step.

Request a diagnosis See services and prices

Never send passwords, API keys or card data through the form.

Diagnosis from€299

Request a diagnosis