

When WooCommerce checkout doesn't show correct shipping cost, the failure is usually one of three distinct problems: no method appears, a method appears with the wrong amount, or the amount does not change when the address changes. Name the symptom before touching a setting, then follow the matching trail through zones, caching, live rates, and tax display.
WooCommerce calculates rates for the current session from the customer address, cart contents, and shipping methods in the matching zone. That is useful diagnostic evidence. The symptom tells you which input or request to inspect first.
Symptom-to-cause guide
| What you see | Likely cause | Read next |
|---|---|---|
| No shipping method appears | No zone matches the address, or the matched zone has no method | Cause 1, Cause 4 |
| A method appears but the amount is wrong | Wrong zone, missing product data, or a live-rate fallback | Cause 1, Cause 3, Cause 4 |
| The amount ignores an address change | Cached page output or a failed AJAX recalculation | Cause 2 |
| The shipping line looks wrong but the total is right | Tax display settings or the shipping tax class | Cause 5 |
| It began after an update | Plugin, theme, cache, or integration regression | Cause 2, Cause 4 |
If this started on the day of an update, widen the investigation. A checkout broken after a plugin update often has more than one visible symptom.
Shipping zones are the first place to look for missing or incorrect rates. Find them under WooCommerce > Settings > Shipping > Shipping zones.
WooCommerce assigns a customer to one matching zone. It evaluates your list, chooses the match, and exposes only that zone’s methods. A perfectly configured method in every other zone is irrelevant to this checkout.
That rule matters when regions overlap. A Germany-wide zone and one for postcode 10115 can both describe the same buyer. Only one supplies the rate.
Before the buyer enters an address, WooCommerce has to make an assumption. WooCommerce > Settings > General > Default customer location determines whether that is your store base, a geolocated country, or no location. With the store base selected, every visitor sees domestic rates until they enter their address. That often explains reports that the cart showed one cost and checkout showed another.
WooCommerce shipping-zone configuration
The order is functional. Put the narrowest zones, such as postcodes and regions, above country and continent rules. A broad catch-all above a specific rule can quietly win the match.
The pattern is usually clear: a city receives the country-wide price, or a regional free-shipping threshold never applies. In both cases, the wrong zone matched.
Callout
This is a common reason for “no shipping options available.” The final zone in the list, Locations not covered by your other zones, is the fallback and starts without methods. An address outside your configured regions can therefore reach checkout with nothing to select.
When no method appears, check these points in order:
The practical safeguard is one transparent fallback method. It can be a higher flat rate or a local-pickup option that asks the buyer to contact you. The important part is that an unexpected address does not end in a dead checkout.
Shipping is calculated per session. Cart, checkout, and account pages are personal HTML and must not come from a shared page cache. If they do, one visitor can see a rate calculated for another session and address updates stop changing the total.
Exclude cart, checkout, and my-account, including translated slugs, at every cache layer:
There is a quieter failure mode. On an address change, checkout makes a background request to recalculate the order review. If that request fails, the old shipping cost remains with no useful customer-facing explanation. JavaScript errors, aggressive optimization, and expired security nonces are typical causes.
Open browser developer tools, change the country, and watch the network panel for a failed update_order_review request. Rule out nonce-related cache conflicts at the same time. A stale nonce and a stale price often share the same cache mistake, and fixing invalid nonce errors on checkout can restore recalculation.
If recalculation fails with a security token error, see our guide on fixing invalid nonce errors in WordPress before you change shipping settings again.
Callout
Weight-based and class-based methods depend on product data. When that data is incomplete, the method can drop out or fall back to a base cost without giving the buyer a useful explanation.
Check these three locations in order:
A product can have a shipping class while the method has no price for that class. The result is a silent zero.
Imports are a frequent source. A CSV without a weight column can create hundreds of products that look correct until the rate calculation needs that value. Filter the product list by category, select the affected products, then use Bulk actions > Edit to assign a shipping class in one pass. Core WooCommerce does not bulk-edit weight, so a re-import with a mapped weight column is often faster than individual edits.
Check variable products separately. Weight and shipping class sit on each variation, and an empty variation cannot use a useful value from an empty parent.
Live carrier rates depend on a third party answering during checkout. When that request fails, many integrations return no rate at all. The buyer sees an empty shipping section and cannot complete the order.
The store can still look healthy in the admin area.
Shippo’s WooCommerce integration uses credentials from your Shippo account to retrieve live rates. Start with three checks: credentials that were rotated, revoked, or copied from a test environment no longer authenticate; requests can time out or be throttled; and incomplete parcel data prevents a quote. Missing weight, dimensions, or a selected parcel template are enough to leave the plugin with nothing to show.
Use the plugin’s connection status or logs to distinguish an authentication failure from an empty quote. Buyers see the same result either way. Then confirm that a fallback rate exists in the same zone so a failed lookup does not empty the checkout.
ShipStation
EasyPost
Do not make a live-rate integration your only shipping option. Build a deliberate fallback:
Sometimes the calculation is correct but the display creates the impression of an error. Shipping tax, product tax, and price display are separate settings.
Shipping tax and display controls
| Setting | Location | Effect |
|---|---|---|
| Shipping tax class | WooCommerce > Settings > Tax | Whether shipping uses the cart's rate or a fixed tax class |
| Display prices during cart and checkout | WooCommerce > Settings > Tax | Whether the shipping line includes or excludes tax |
| Prices entered with tax | WooCommerce > Settings > Tax | Whether an entered flat rate already includes tax |
| Default customer location | WooCommerce > Settings > General | Which tax rate applies before an address is known |
The classic report is simple: shipping is 4.90 in the cart and 5.83 at checkout.
Nothing may be broken. The cart may show net and checkout gross, or an estimated location may have been replaced with the actual address. Set cart and checkout to the same display mode before changing rate logic.
Cross-border orders can differ for the same reason. Tax follows the customer address, so two buyers who choose the same method can legitimately see different shipping lines.
Callout
One address from your own desk is not a shipping test.
Shipping logic branches by country, postcode, cart value, login state, and device. Your test plan needs the same branches.
WooCommerce shipping rate testing matrix
Run these combinations in order:
Change the address between steps instead of restarting with a fresh cart. That is how you expose rates that never recalculate.
Our walkthrough explains how to test your checkout end to end. Run the full browser path after every zone or cache change so you catch regressions early.
Running this matrix once by hand is sensible. Repeating it every day is harder, while live-rate APIs and cache layers can fail without a store change. ShopMonitor runs scheduled browser checkout tests and checks that a shipping method and cost appear through the thank-you path. It alerts you when that browser path fails.
ShopMonitor runs scheduled browser checkout and form tests, then alerts you when a tested path breaks. No code changes or plugins required.
No credit card required.

About the Author
Written by the team at Winning Solutions, the agency behind ShopMonitor. We help store owners trace shipping-rate failures at checkout and monitor the browser paths where they surface.