The message
"There are no shipping options available. Please ensure that your address has been entered correctly, or contact us if you need any help." The customer has entered a perfectly good address in a country you ship to. You have shipping zones set up. And yet.
Shipping in WooCommerce is a chain of matching rules, and this message means the chain produced nothing. Here is where it breaks, in the order to check.
1. The shipping cache
Before anything else: WooCommerce caches calculated shipping rates per cart and address in the session and in transients. You change a zone setting, reload the checkout, and see the old result. Every subsequent check you make is against stale data.
Fix: after any shipping change, WooCommerce, Status, Tools, "Clear customer sessions" and "Clear transients", or open the checkout in a new private window. Do this before every test below. Half the "I changed it and it didn't work" reports are this.
2. Zone matching order
Zones are matched top to bottom; the first zone whose region matches the customer's shipping address wins, and only that zone's methods are offered. If the first matching zone has no methods, or methods that do not apply, the customer gets nothing, even if a zone lower down would have matched with a working method.
Check: WooCommerce, Settings, Shipping. Which zone matches the test address? Zones can be regions (countries, states), postcodes or ranges, and a postcode zone above a country zone will catch addresses you expected the country zone to handle. Drag zones to reorder.
The "Locations not covered" zone at the bottom catches everything else. If it has no methods, any address outside your defined zones gets the message. Decide whether that is intended.
3. Shipping classes and method conditions
Flat rate methods can have per-class costs and, crucially, a "No shipping class cost" and per-class costs that, when left blank in certain configurations, produce no rate. Table rate and conditional shipping plugins add rules by weight, dimensions, cart total, class, quantity. A cart that matches no rule gets no rate.
Check: the products in the failing cart. Which shipping class is each in? Does the matched zone's method have a rule that covers that class and that weight or total? A product accidentally in a "Bulky" class with no bulky rate in the customer's zone is a common cause. A product with no weight when the rule is weight-based is another.
4. Free shipping conditions not met, and it is the only method
A zone with Free Shipping requiring a minimum spend or a coupon, and nothing else, shows nothing when the condition fails.
Check: add a paid method to the zone as a fallback, or check the "free shipping" method's condition against the test cart.
5. Address not complete enough to match
Zones match on the shipping address. Until the customer has entered enough (country, state where used, postcode), matching cannot happen, and some themes or checkout customisations hide fields WooCommerce needs.
Check: does the message appear before the address is complete, or after? Are all address fields present on the checkout? A checkout customiser that removed the postcode field on a store with postcode zones breaks matching.
6. Product-level shipping settings
A product marked "virtual" needs no shipping and is skipped. A product with the "Only ship to specific locations" restriction (via a plugin) that excludes the address. Products that are individually excluded from a method.
Check: the product edit screen, Shipping tab, and any per-product restrictions added by plugins.
7. Live rates failing
Carrier-calculated methods (UPS, FedEx, USPS, Royal Mail, Australia Post via their extensions) call the carrier's API with the package details. If the call fails, the method returns no rate and, if it was the only method, the customer sees the message.
Common causes: expired or wrong API credentials; the carrier rejecting a package because a product has no weight or dimensions; a package exceeding the carrier's limits; the carrier's API being down; the request timing out on slow hosting.
Check: WooCommerce, Status, Logs, the carrier extension's log. It records each request and response. Product weights and dimensions on every product. A flat-rate fallback method in the same zone so a carrier outage does not close the store.
8. Debug mode
WooCommerce, Settings, Shipping, Shipping options, "Enable debug mode". This disables the shipping cache and shows, on the cart and checkout, which zone matched and which methods were evaluated. It is the single most useful switch for this problem. Turn it off afterwards; it is visible to customers.
The fast version
- Clear sessions and transients, open a private window.
- Turn on shipping debug mode.
- Add the failing product, enter the failing address, read what debug says matched.
- If a zone matched with no rates: check that zone's methods against the cart's classes, weight and total.
- If no zone matched: check zone order and the "not covered" zone.
- If a live-rate method: read its log.
- Turn off debug mode.
Ten minutes, nearly every time.
Preventing it
Every zone has at least one method that always produces a rate, even if it is a high flat rate, so a rule gap or a carrier outage degrades to "expensive" rather than "impossible". Every product has a weight and dimensions. Shipping changes are tested in a private window with a cart that spans your shipping classes. And after any WooCommerce or shipping plugin update, a test checkout to your most common destination, which is on the post-update list for every store on our WooCommerce books, because a store that cannot quote shipping cannot sell.