A WooCommerce checkout stuck on a spinner is different from a slow page. The customer can often see the form, select a payment method and click the final button, but the order never reaches a clear success or failure state.
The useful split is where the funnel freezes: shipping recalculation, `update_order_review`, Store API cart state, gateway iframe, 3DS redirect, final place-order request or thank-you page redirect. A stuck checkout can look harmless in uptime monitoring because the page still answers with HTTP 200.
Verify in the right order
Before the final click, observe shipping, tax and total recalculations. If the form freezes after address or shipping changes, look at cart rules, logistics plugins, taxes and recalculation endpoints.
At place order, check whether the request is sent, whether it receives a response and whether WooCommerce creates an order. If the request never leaves, investigate JavaScript, theme code, validation and disabled-button logic. If it leaves and fails, inspect the endpoint, WooCommerce logs and plugins intercepting checkout.
After payment redirection, separate a gateway failure from a missing return. A payment can be attempted while the customer never reaches the thank-you page, which is close to WooCommerce order confirmation missing.
| When it stalls | What to observe | Likely lead |
|---|---|---|
| Before the final click | Shipping, tax and total recalculation after an address change | Cart rules, logistics plugins, taxes or the recalculation endpoint |
| At place order, the request never leaves | Browser console, disabled button, form validation | JavaScript, theme code or validation logic |
| The request leaves and fails | Order endpoint, WooCommerce logs, plugins intercepting checkout | A plugin sits between the request and order creation |
| After payment redirection | Gateway return, thank-you page reached or not | Separate a gateway failure from a missing return |
Interpret the result
An intermittent stuck state can signal timeout, saturation or a slow external dependency. A persistent stuck state more often points to a plugin regression, Checkout Blocks incompatibility, gateway configuration or server error.
A signal that recovers by itself is not automatically a false positive. It may be a short real incident. A false positive requires evidence of a monitor issue: brittle selector, unavailable synthetic product, too-short wait or intentional business rule.
Controlled lab example
Starting point: a test store with an order-tracking extension hooking the `checkout` action. Reproduced failure: checkout accepts the address, displays payment methods, then stays on a spinner after final click. No order is created and no confirmation page appears. The useful signal is not page availability; it is the absence of a final state after the order action.
Ruled-out hypotheses: the gateway is not at fault (no attempt reaches it), it is not a network timeout (the wait is infinite, not long), and the cart is not lost (it is complete up to the click). The proof then keeps the time, step, status, wait duration, expected signal and observed signal. It is filtered: no customer identity, no payment data and no cart detail.
Confirm recovery
CashFlowCanary treats a stuck checkout as a conversion incident when a controlled journey cannot reach a final state. Recovery must be confirmed by replaying the path and observing a coherent final state.
Prevent recurrence
A funnel that freezes after the final click often comes from an extension intercepting order creation or a Checkout Blocks incompatibility. Keep a monitor on the final place-order request and on the appearance of an order ID, test every new payment or logistics extension on a full journey before activation, and record the version that introduced the freeze.
Start with features, compare plans, or request a free audit.
This guide complements WooCommerce checkout timeout, WooCommerce place order button not working, WooCommerce checkout validation error and WooCommerce order confirmation missing. Together they separate a frozen funnel from latency, validation, button and confirmation issues.