A shopper reaches your cart or checkout and, where the shipping choices should be, sees “No shipping options were found for” followed by their address. On the classic checkout the wording is usually “There are no shipping options available. Please ensure that your address has been entered correctly, or contact us if you need any help.” If they click Place order anyway, they get “No shipping method has been selected. Please double check your address, or contact us if you need any help.” And for a country you do not ship to, the message is “Unfortunately we do not ship to” followed by the country. The block cart and checkout word these slightly differently, and wording changes between WooCommerce versions, but the cause is the same.
The store cannot sell anything that needs shipping until this is fixed, and often it only fails for some addresses, so you may not notice until a customer tells you. The good news: this is nearly always a settings problem, and WooCommerce has a debug mode that tells you exactly which shipping zone an address landed in. This guide is for store owners and the people who build stores. No server access is needed for most of it.
What is happening
Every time the cart or checkout needs shipping rates, WooCommerce works through a fixed sequence. The message appears when that sequence ends with an empty list.
- Is shipping switched on, and do you ship to this country? WooCommerce checks the shipping locations set under WooCommerce > Settings > General.
- Does the cart need shipping? Products marked Virtual (and most downloadable products) do not. If nothing in the cart needs shipping, no shipping section appears at all.
- Which shipping zone matches the address? WooCommerce compares the country, state and ZIP code with your zones from the top of the list down and stops at the first match. If none match, it uses the catch-all zone, shown as Locations not covered by your other zones.
- What do that zone’s methods return? Each enabled method in the matched zone (Flat rate, Free shipping, Local pickup, or a carrier or table rate plugin) calculates a rate or returns nothing. Free shipping returns nothing if its conditions are not met. Carrier plugins return nothing if the carrier’s API fails or does not serve the address.
- Does any code remove rates? Plugins and snippets can filter the final list, for example to hide paid options when free shipping is available.
WooCommerce also caches calculated rates, so a fix can look like it did nothing until the cache is bypassed. The steps below follow the same order.
Step 1: Turn on shipping debug mode
Go to WooCommerce > Settings > Shipping, open the shipping settings tab (called Shipping settings in current versions and Shipping options in older ones) and check Enable debug mode. WooCommerce describes it as showing matching shipping zones and bypassing the shipping rate cache. Save.
Now, in a private window, add a physical product to the cart and enter the address that fails. A notice on the cart or checkout shows which zone the address matched. That one line usually tells you where to look:
| Debug notice says |
Meaning |
Go to |
| The zone you expected |
The zone is right; its methods return no rates |
Step 4 and Step 5 |
| A different zone |
A zone higher in the list caught the address first, or the ZIP code rule does not match |
Step 3 |
| Locations not covered by your other zones |
No zone matched, and the catch-all zone has no methods |
Step 3 |
| No zone notice and no shipping section |
Shipping is off, the country is excluded, or the cart does not need shipping |
Step 2 |
The debug notice can be seen by anyone who loads the cart, so turn debug mode off when you finish.
Step 2: Check shipping locations and the products
General settings
In WooCommerce > Settings > General, look at Shipping location(s):
- Disable shipping & shipping calculations switches shipping off completely. Nothing will show.
- Ship to specific countries only means any country missing from the list gets the “Unfortunately we do not ship to” message.
- Ship to all countries you sell to follows Selling location(s) just above it, so check that list too.
The products in the cart
- Open the product and check whether Virtual is checked. A physical product marked virtual skips shipping. A digital product not marked virtual demands shipping it does not need.
- Carrier and table rate methods often need a weight and sometimes dimensions on the Shipping tab of each product, including each variation. A product with no weight can make the whole cart return no rates.
- Note the product’s Shipping class. Some methods treat certain classes differently (Step 4).
Step 3: Fix the shipping zones
Go to WooCommerce > Settings > Shipping > Shipping zones. Read the list from top to bottom, because that is the order WooCommerce uses.
- Order matters. A broad zone (a whole country) placed above a narrow one (a few ZIP codes in that country) catches every address first, so the narrow zone never runs. Drag specific zones above general ones.
- A zone with no methods is a trap. If an address matches a zone that has no enabled methods, WooCommerce does not move on to the next zone. It shows no options. Either add a method or delete the empty zone.
- The catch-all zone. Locations not covered by your other zones handles everything else. If you want to ship worldwide, give it a method; if you do not, make sure your General settings stop customers choosing countries you cannot serve.
- ZIP code rules must match what shoppers type. In a zone’s ZIP code box, put one rule per line. Use a wildcard such as
SW1* or 902* for a prefix, and a range such as 90210...90299 for a numeric range. A rule for 90210 does not match a shopper who types the nine-digit ZIP 90210-1234; use 90210* instead.
- States and countries. A zone limited to certain states or regions will not match a country where shoppers leave the state field empty or where your checkout hides it.
With SSH and WP-CLI you can print the zones and their methods in one go, which is handy on large stores. Run these from the site folder (the one containing wp-config.php); use wp-cli if wp is not available.
wp wc shipping_zone list --user=1 --fields=id,name,order
wp wc shipping_zone_method list 3 --user=1 --fields=instance_id,method_id,enabled,title
What each does: the first lists every zone with its ID and position (the zone’s countries and ZIP codes are easiest to read on its edit screen). The second lists one zone’s methods and whether each is enabled. Placeholders: replace 3 with a zone ID from the first command, and --user=1 with the ID of an administrator (the WooCommerce commands act as that user; wp user list --role=administrator shows the IDs). The catch-all zone has the ID 0. Bad output: a zone whose method list is empty, or where every method shows enabled as false.
Step 4: Check the methods in the matched zone
Click into the zone the debug notice named and look at each method.
| Method |
Why it can return nothing |
What to check |
| Free shipping |
Its condition is not met |
The Free shipping requires setting: a valid free shipping coupon, a minimum order amount, or a combination. If Free shipping is the only method in the zone, any cart below the minimum has no options. Add a paid method as a fallback. |
| Flat rate |
Rarely returns nothing on its own, unless disabled or removed by code |
The method toggle is on, and the cost fields contain valid numbers or formulas |
| Local pickup |
Not offered for the checkout you use |
The block checkout uses its own Local pickup settings page under the Shipping tab with pickup locations; the zone-based Local pickup method belongs to the classic checkout |
| Table rate plugins |
No row matches the cart, or a row is set to abort or hide rates for a class, weight or destination |
Each rule’s conditions against the actual cart weight, item count, class and total |
| Carrier rates (UPS, FedEx, USPS, Royal Mail, Australia Post and others) |
API credentials wrong or expired, the service does not reach that address, the parcel exceeds the service’s limits, or product weights or dimensions are missing |
The plugin’s debug or log option, then WooCommerce > Status > Logs for its error |
A quick isolation test: add a Flat rate method with a cost to the matched zone and reload the checkout. If an option appears, the zone matching is fine and the problem lies with the other method. If nothing appears even with Flat rate, look at Steps 2, 3 and 6.
Step 5: Clear cached rates
Shipping rates are stored in the shopper’s session and in temporary database entries (transients), so a shopper who saw “no options” may keep seeing it after you fix the settings until something in the cart or address changes. Debug mode bypasses this cache while it is on. To clear it for everyone:
- Go to WooCommerce > Status > Tools and run Clear transients.
- If shoppers still see stale results, the same screen offers a tool that clears customer sessions. It empties every shopper’s current cart, so avoid it during busy hours.
- Make sure the cart and checkout pages are excluded from page caching and CDN caching. A cached checkout can show one shopper’s shipping result to another. The cart and session guide lists the exclusions for common caches.
Step 6: Look for code and plugins that remove rates
Snippets that hide some shipping methods are common, for example “hide all paid methods when free shipping is available”. If they are written badly, or interact with a method renamed in an update, they can hide everything. These snippets hook into a filter called woocommerce_package_rates. Search for it from the site folder over SSH:
grep -rl "woocommerce_package_rates" wp-content/themes wp-content/plugins wp-content/mu-plugins
What it does: grep -rl searches every file in those folders and their subfolders (-r) and prints only the names of files that contain the text (-l). If a folder does not exist, grep says so and carries on. Good output: only your shipping plugins. Bad output: your theme’s functions.php or an unknown plugin. Also check any code snippets plugin in the admin for the same filter name, since its code lives in the database rather than in files.
Other plugins that commonly interfere: checkout field editors that hide or rename the ZIP code or state field, address autocomplete tools that fill fields in a format your zones do not expect, multi-currency switchers and plugins that restrict shipping methods by product or user role. Deactivate them one at a time on a staging copy, or use the Health Check & Troubleshooting plugin’s troubleshooting mode, which disables plugins only for your own logged-in session.
Step 7: Classic or block checkout differences
Edit your Checkout page. A Checkout block means the block checkout; the [woocommerce_checkout] shortcode or a Classic Checkout block means the classic one.
- The block checkout calculates rates once enough of the address is filled in. Until then it may show a prompt to enter an address rather than options. Test with a complete address.
- Code that customizes shipping on the classic checkout through checkout field hooks may not apply to the block checkout, which has its own extension system.
- Local pickup on the block checkout is set up separately, as described in Step 4.
If the cart page shows options but the checkout does not, or the other way round, a difference in address fields between the two is the usual reason: for example, the cart’s shipping calculator does not ask for a state while the checkout does. In WooCommerce > Settings > Shipping, the shipping settings tab controls whether the cart shows the shipping calculator and whether costs are hidden until an address is entered.
Common causes at a glance
| Cause |
Fix |
| Address matched a zone with no methods |
Add a method or delete the zone |
| Broad zone above a specific one |
Reorder zones, specific first |
| ZIP code format does not match the rule |
Use wildcards or ranges |
| Free shipping is the only method and the minimum is not met |
Add a paid fallback method |
| Country not in Shipping location(s) |
Add it in General settings |
| Missing product weight for a carrier or table rate |
Add weights and dimensions to every product and variation |
| Carrier API error |
Read the plugin log, fix credentials, contact the plugin vendor |
| Stale cached rates |
Clear transients, exclude cart and checkout from caching |
| Snippet hiding all rates |
Find the woocommerce_package_rates code and fix or remove it |
If none of that worked
If Flat rate in the matched zone still shows nothing and no code filters the rates, collect evidence before asking for help:
- The exact address that fails and one that works.
- A screenshot of the debug notice and of your zone list.
- Your WooCommerce System Status report (WooCommerce > Status, then the button to get a report), which lists versions, active plugins and template overrides.
- Any entries in WooCommerce > Status > Logs from your shipping plugin or under
fatal-errors.
Send carrier problems to the shipping plugin’s vendor with the log lines. If the checkout fails in other ways too, such as a spinner or a payment error, work through the checkout troubleshooting guide. If the trouble started after an update, the WooCommerce update guide covers outdated template overrides and rollbacks. For anything urgent, the store checkout emergency page is the place to start.
See also