If your WooCommerce checkout page is stuck loading, shows an endless spinner, or the order review section fails to appear, this guide helps you identify and resolve the issue. The checkout “review order” section loads payment methods and order totals using AJAX (a method that loads page content without a full page refresh), which displays a brief loading spinner. If something goes wrong, this section may fail to load or the spinner may keep spinning indefinitely.
Start by navigating to WooCommerce > Status and checking for any highlighted errors. If you see errors listed there, address those first. If the status page looks clean, review the common causes and resolutions below.
Possible causes
↑ Back to topThe following are the most common reasons the checkout page gets stuck loading:
- Mismatched WordPress and Site URLs preventing AJAX requests from completing.
- JavaScript errors or conflicts caused by themes or extensions.
- Invalid AJAX responses returning HTML instead of the expected data format.
- Transactional emails delaying checkout on slower servers.
- Insufficient WordPress memory limit causing requests to fail.
Verify WordPress and Site URL settings match
↑ Back to topAJAX requests do not work across different domains. If your WordPress Address (URL) and Site Address (URL) do not match, AJAX calls on the checkout page will fail.
To verify your URLs match, go to Settings > General in your WordPress dashboard. Confirm that both the WordPress Address (URL) and the Site Address (URL) fields contain the same value.

For more details, refer to the WordPress documentation on updating WordPress and site URLs.
Resolve JavaScript errors and conflicts
↑ Back to topThemes and extensions can create JavaScript conflicts that prevent AJAX from completing on the checkout page. To check for errors, open your browser’s developer console (press F12 or Ctrl+Shift+I on most browsers) and look at the Console tab for red error messages.

If you see errors, follow the guide on testing for theme and extension conflicts to identify the source.
Invalid response from an AJAX call
↑ Back to topWhen AJAX calls return unexpected content, the checkout review section cannot render properly. To diagnose this, open your browser’s developer console, select the Network tab, and filter by XHR (XMLHttpRequest, which shows AJAX requests). Look at the response for checkout-related requests. The expected response format is JSON.
If the response is HTML instead of JSON, an index.html file in the root directory of your WordPress installation may be overriding index.php. Some caching extensions can also prepend HTML to JSON responses.

To resolve an HTML response issue, try one of the following approaches:
- Remove the
index.htmlfile from the root directory of your WordPress installation. - Adjust the server configuration’s indexes directive to prioritize
index.phpoverindex.html. - If you use a caching extension, clear the cache or disable the extension temporarily to test.
If you see a response of -1, this indicates a security validation failure caused by a cached nonce. Clearing your site cache and any server-level caches typically resolves this.

You can also check for conflicts by turning off other extensions and switching to a default WordPress theme. This often reveals the source of the problem.
Defer transactional emails to prevent checkout timeouts
↑ Back to topOn some servers, sending checkout-related emails during order processing can slow down or disrupt the AJAX response. You can defer these emails so they send after the order completes.
Ask a developer to add the following filter, or use an extension that allows custom functions, such as the Code Snippets plugin:
Note:
This is a Developer level doc. If you are unfamiliar working with code and resolving potential conflicts, we recommend you work with a Woo Agency Partner for larger projects, or find a WooCommerce developer on Codeable for smaller customizations. We are unable to provide support for customizations under our Support Policy.
add_filter( 'woocommerce_defer_transactional_emails', '__return_true' );
Add this code to your child theme’s functions.php file or use the Code Snippets plugin. Do not add custom code directly to your parent theme’s functions.php file, because theme updates will overwrite your changes.
WordPress memory limit
↑ Back to topAn insufficient WordPress memory limit can cause AJAX requests to fail during checkout. WooCommerce recommends a memory limit of at least 64 MB.
To check your current memory limit, go to WooCommerce > Status and look for the WP Memory Limit row. If it is below 64 MB, follow the guide on increasing the WordPress memory limit.
Questions and support
↑ Back to topDo you still have questions and need assistance?
This documentation is about the free, core WooCommerce plugin, for which support is provided in our community forums on WordPress.org. By searching this forum, you’ll often find that your question has been asked and answered before.
If you haven’t created a WordPress.org account to use the forums, here’s how.
- If you’re looking to extend the core functionality shown here, we recommend reviewing available extensions in the WooCommerce Marketplace.
- Need ongoing advanced support or a customization built for WooCommerce? Hire a Woo Agency Partner.
- Are you a developer building your own WooCommerce integration or extension? Check our Developer Resources.
If you weren’t able to find the information you need, please use the feedback thumbs below to let us know.