MageSentinel

WooCommerce checkout stuck on processing after Place order

A customer fills in the checkout, clicks Place order, and the form greys out with a spinner that never goes away. Sometimes an order is created anyway, sometimes not, and the customer leaves unsure whether they paid. The cause is almost always one request that does not come back the way the checkout script expects.

All posts3 min read

An hourglass resting on stones

What happens when you click Place order

On the classic checkout, the script sends the form as a POST to ?wc-ajax=checkout. WooCommerce validates the fields, creates the order, hands it to the payment gateway and answers with JSON: result is success with a redirect address (the thank-you page or the gateway), or failure with the error messages to show.

The spinner stays until that JSON arrives and is read. Anything that makes the answer late, empty or not JSON leaves the form blocked. The Checkout block works the same way through the Store API, with a POST to /wp-json/wc/store/v1/checkout.

Find the failing request

  1. Open the Network tab. In the browser developer tools, place a test order and find the wc-ajax=checkout (or store/v1/checkout) request.
  2. Read the status. A 500 or an empty response points to a PHP error; 403 to a firewall or security rule; 502 or 504 to a timeout on the server or at the CDN.
  3. Read the response body. Valid JSON with success but no redirect points to the gateway or a script on the thank-you page. HTML, a PHP notice before the JSON, or a login page means something printed into the response.
  4. Check the Console. No request at all after the click means a JavaScript error stopped the script before it sent anything.
  5. Check the logs. WooCommerce → Status → Logs, the fatal-errors source and the gateway's own log, at the time of the test.

The usual causes

Symptom in the requestLikely cause
500, empty bodyPHP fatal error in a gateway, shipping, fee or order plugin
JSON with a PHP warning in frontWP_DEBUG_DISPLAY on, or a plugin echoing output
403Firewall, bot protection or security plugin blocking the POST
502 / 504 after 30 to 100 sSlow gateway API call, slow order hooks, server or CDN timeout
No requestJavaScript error, script optimisation delaying the checkout script
Success, no redirectGateway popup or 3-D Secure frame blocked, thank-you page error
Check before a customer retries

A hang after the order was created can leave an order in Pending payment, and a second click can create a duplicate. Look at WooCommerce → Orders before telling a customer to try again. Orders stuck in Pending payment covers that side.

Find out your checkout broke before your customers do.

Real checkout checks for Magento and WooCommerce · 14 days free · no card required

Fixes that work

Turn off on-screen errors in production (WP_DEBUG_DISPLAY false) and log them instead. Exclude the cart, checkout and wc-ajax requests from page caching, script delaying and combining. Allow the checkout POST in the firewall or security plugin; see security plugins blocking checkout and WAF rules blocking checkout. Update or replace the plugin named in the fatal error, and test on staging with a default theme when the cause is not obvious.

For timeouts, look at what runs on order creation: gateway calls, stock sync, ERP or email hooks. Moving slow work to the background with Action Scheduler keeps the checkout answer fast.

Confirm it stays fixed

Place a real test order after every plugin, theme or gateway update, because this failure usually arrives with a change. The free WooCommerce checkout checker walks the checkout in a real browser up to the payment step and shows where it stops; it does not place an order. MageSentinel monitoring repeats the walk on a schedule, and with the store connector installed it can place real test orders that are cancelled right after, which is what catches a hang on Place order. For other symptoms see WooCommerce checkout not working.

Common questions

Why is my WooCommerce checkout stuck on processing?

The checkout request after Place order fails or returns something other than JSON: usually a PHP error, a firewall rule, a timeout or a JavaScript error.

Was the order created if the checkout kept spinning?

Sometimes. Check WooCommerce → Orders for a Pending payment or failed order before the customer tries again, to avoid duplicates.

Which request does the WooCommerce checkout send on Place order?

The classic checkout posts to ?wc-ajax=checkout; the Checkout block posts to /wp-json/wc/store/v1/checkout through the Store API.