WooCommerce Errors
WooCommerce Checkout Keeps Loading (WordPress Repair)
Last reviewed
Direct answer
A WooCommerce checkout spinner that never stops means the order-review or checkout AJAX request did not return usable data; inspect its Network response, make WordPress and Site URLs identical, exclude checkout from cache, and isolate JavaScript or extension conflicts before retrying payment.
This WordPress Repair guide focuses narrowly on checkout that renders but leaves the order review, payment methods, or Place order action spinning forever. Unlike a blank checkout page, the initial HTML arrived; unlike a general checkout failure, the defining evidence is an AJAX cycle that never completes. Diagnose with a zero-value or sandbox-safe test and avoid creating repeated live payment attempts.
Key facts
Verifiable numbers and definitions — each claim links to its source.
- WooCommerce checkout loads order totals and available payment methods over AJAX, and a failed update can leave the order-review spinner running indefinitely. (WooCommerce endless checkout spinner)
- WooCommerce states that checkout AJAX requests fail when WordPress Address and Site Address do not match because AJAX cannot cross those domains. (WooCommerce endless checkout spinner)
- WooCommerce recommends inspecting the browser Network panel for AJAX request headers, status codes, and responses when an interactive store action fails. (WooCommerce AJAX troubleshooting)
- WooCommerce documents that JavaScript controls checkout updates such as shipping costs and payment methods, so a red Console error can interrupt those functions. (WooCommerce JavaScript troubleshooting)
What the error means
WooCommerce refreshes order totals, shipping choices, and eligible payment methods in the background as the customer edits checkout. The browser shows a spinner while a WooCommerce AJAX request calculates that state and returns structured data. If JavaScript crashes, the request crosses to a different hostname, a firewall blocks it, PHP returns a fatal or warning instead of JSON, or a slow hook never finishes, the browser cannot clear the loading state. The decisive clue is the checkout-related XHR or fetch entry: its URL, duration, status, and response show whether the spinner is waiting, blocked, or trying to parse the wrong content.
Common symptoms
- The order-review panel shows a spinner indefinitely after page load
- Changing a billing field starts loading and payment methods never return
- Place order disables itself and keeps spinning without confirmation or error
- The Network panel shows a pending or failed wc-ajax checkout-related request
- The AJAX response contains HTML, PHP warnings, -1, or a firewall challenge instead of expected data
- Checkout works with a default theme or minimal extensions but not the normal stack
- The spinner appears only for guests, one hostname, or certain shipping or payment choices
Most likely causes
- 01 WordPress Address and Site Address use different schemes or hostnames, breaking same-origin AJAX
- 02 A theme or extension JavaScript error stops checkout update handlers
- 03 Cache, CDN, or JavaScript optimization alters dynamic checkout content or scripts
- 04 A plugin, host firewall, or WAF blocks WooCommerce AJAX POST requests
- 05 PHP warnings, notices, or a fatal contaminate the structured AJAX response
- 06 A slow shipping, tax, payment, or email-related hook exceeds server resources or timeouts
- 07 Insufficient WordPress memory causes checkout AJAX processing to fail
What changed before the problem started
- The store domain, HTTPS redirect, reverse proxy, or www preference changed
- WooCommerce, the theme, gateway, shipping, tax, or checkout extension was updated
- Caching, JavaScript delay, bot protection, or firewall rules changed
- A new shipping zone, tax service, payment method, or checkout field was introduced
- PHP version, memory limit, hosting plan, or transactional email behavior changed
Troubleshooting steps
- 01
Inspect the request that owns the spinner
Open DevTools → Network, filter to Fetch/XHR, reload checkout, and trigger the spinner once. Select the newest WooCommerce AJAX request and record its URL, duration, status, and sanitized response. Do not rely on the spinner alone to name the cause.
- 02
Match WordPress and Site URLs exactly
Under Settings → General, confirm both URLs use the same HTTPS scheme, hostname, and path customers use. Repair redirects so checkout and its AJAX requests stay on one canonical origin; do not mix www and non-www during the session.
- 03
Exclude every dynamic commerce page from cache
Ensure Cart, Checkout, and My Account are excluded from page cache at the plugin, host, reverse-proxy, and CDN layers. Purge all layers and retest as a guest, because administrators often bypass the cached response.
- 04
Check the Console before changing gateways
Capture the first red JavaScript error after a fresh reload. Errors from the theme, checkout customizer, consent tool, or optimizer can stop WooCommerce even when the failed line does not mention the payment gateway.
- 05
Read WooCommerce logs for the same timestamp
Open WooCommerce → Status → Logs and inspect fatal-error, gateway, shipping, and extension logs around the failed request. A timeout or fatal during totals calculation is more useful than repeatedly clicking Place order.
- 06
Compare shipping and payment combinations safely
Without submitting a live charge, change one field at a time and note whether a particular country, shipping method, coupon, or payment option starts the spinner. That boundary identifies the extension whose server calculation should be isolated.
When to stop troubleshooting
Stop DIY testing when Place order may have reached the gateway despite the spinner, customers report duplicate charges, AJAX requests remain pending long enough to exhaust workers, or production is the only place a conflict can be reproduced. Pause checkout if payment state is uncertain and escalate with request evidence, WooCommerce logs, affected cart conditions, and gateway transaction records.
Information to collect before requesting help
- 01 Exact spinner location: order review, payment methods, or Place order
- 02 Checkout AJAX request URL, duration, status, and sanitized response
- 03 First Console error after a clean page reload
- 04 WordPress Address, Site Address, and public checkout hostname
- 05 WooCommerce, WordPress, PHP, theme, gateway, shipping, and tax versions
- 06 WooCommerce fatal and extension logs for one exact timestamp
- 07 Cache, CDN, optimization, firewall, and reverse-proxy configuration
- 08 Whether the issue follows a specific address, shipping method, coupon, gateway, guest status, or device
How a professional repairs the problem
A technician records the precise AJAX lifecycle and proves whether the browser crashed, the request crossed origins, the server blocked it, or PHP returned bad data. They align canonical URLs, enforce dynamic-page cache exclusions, isolate the conflicting checkout component, repair the first fatal or slow callback, and tune only the firewall rule involved. Before reopening sales, they reconcile test transactions and complete guest checkout with each important shipping and payment path.
Frequently asked questions
Why does the order review spinner appear before I click Place order? +
Is this the same as a blank checkout page? +
Can mismatched www and non-www URLs cause endless loading? +
Should customers click Place order again? +
Why does disabling JavaScript optimization fix it? +
Can slow email sending hold the checkout spinner? +
Repair dispatch
Still Need Help Fixing Your Website?
If you are not comfortable editing website files, changing server settings, repairing a database, or troubleshooting a live website, professional help may prevent additional damage or downtime. We will review the problem before accepting the repair.
- You will receive a clear explanation of the likely cause.
- We will tell you if the issue falls outside our repair scope.
- No additional work will be performed without approval.
- A backup should be created whenever access and website condition allow it.
Do not share passwords through an unencrypted contact form — use Password Pusher (self-destructing link). Prefer a dedicated Rescue 404 admin account, not your personal owner login; if you cannot create one yet, we will add ours after repair.