MageSentinel

WooCommerce checkout totals not updating: the update_checkout request

On the classic WooCommerce checkout, every change to the address, shipping method or coupon fires a request that recalculates the order and redraws the review table. When that request fails, the page looks normal but totals, shipping methods and payment options stop changing, and the order often cannot be placed.

All posts2 min read

A calculator and a pen on handwritten notes

What update_checkout does

The checkout script listens for changes to address fields and shipping methods, then triggers the `update_checkout` jQuery event. That event sends a POST to `?wc-ajax=update_order_review`, which recalculates shipping, taxes and totals on the server and returns fresh HTML for the order review table and the payment methods.

Plugins can trigger the same event themselves with `jQuery(document.body).trigger('update_checkout')`, which is how many delivery-date, pickup and fee plugins refresh the totals. The block-based checkout does not use this event; it talks to the Store API instead.

Symptoms

Shipping methods say “Enter your address to view shipping options” after the address is filled in. Totals do not change when the country or the shipping method changes. A spinner over the order review never goes away. Payment methods are missing or do not match the country. Place order fails with a message that the totals changed.

Find the failing request

Open the browser developer tools, Network tab, and change the country or the shipping method. Look for the `update_order_review` request. No request at all points to a JavaScript error earlier on the page: check the Console. A request that returns an error status, a login page or HTML instead of JSON points to the server, a security rule or a cache.

A PHP fatal error in a shipping or fee plugin usually shows up as an empty or broken response here and as an entry in WooCommerce → Status → Logs under fatal-errors.

The usual causes

A JavaScript error from another plugin or the theme stops the checkout script before it binds its handlers. Script optimisation that defers, delays or combines jQuery and the WooCommerce checkout script breaks the order they load in. A page cache or CDN rule caches `?wc-ajax=` requests or the checkout page itself. A firewall or bot rule blocks the POST. A theme overrides the `review-order.php` template with an outdated copy, so the fragments no longer match.

Each of these appears after a change: a plugin update, a new optimisation setting, a CDN rule. The routine in updating WooCommerce plugins safely catches most of them before they reach customers.

Fix and confirm

Exclude the cart, checkout and `wc-ajax` requests from page caching and from script optimisation. Switch to a default theme and disable plugins one by one on staging until the request succeeds. Update outdated template overrides, which WooCommerce lists under WooCommerce → Status → System status.

Then walk the checkout with a real address and change the shipping method, as a customer would. The free WooCommerce checkout checker does that walk in a real browser and shows the step where it stops. For the wider picture see WooCommerce checkout not working.

Common questions

What triggers update_checkout in WooCommerce?

Changes to address fields, the shipping method or coupons on the classic checkout, and any plugin that calls jQuery(document.body).trigger('update_checkout').

Why is the WooCommerce checkout not updating shipping?

Usually the update_order_review request fails: a JavaScript error, script optimisation, caching of wc-ajax requests, a firewall rule or a PHP error in a shipping plugin.

Does the block checkout use update_checkout?

No. The Checkout block updates totals through the Store API, so update_checkout handlers in plugins do nothing there.