How to Fix WooCommerce Shipping Not Showing at Checkout

When shipping options are missing from WooCommerce checkout, the checkout page itself is not always the problem. WooCommerce shows a rate only when the customer matches a shipping zone, the cart contains products that require delivery, and a shipping method can calculate a rate for every package.

The quickest way to find the cause is to follow that calculation from start to finish. The checks below cover shipping zones, customer addresses, product settings, package rules, caching, carrier integrations, and conflicts with themes or plugins.

Begin with a controlled checkout test

Use a simple, repeatable test before changing several settings at once:

  • Add one physical product with a known price and weight.
  • Log out or use a private browser window.
  • Enter a complete shipping address, including country, state or region, and postcode.
  • Choose an address that you know should be covered by the store.

Note the exact result. “No shipping options available,” a missing shipping section, and an incorrect shipping price point to different parts of the setup. Testing one product also removes complications caused by mixed carts.

Check the matching WooCommerce shipping zone

Go to WooCommerce > Settings > Shipping > Shipping zones. Confirm that a zone covers the customer’s country and, where applicable, state, province, or postcode. A zone labelled “United States,” for example, may still exclude particular states or postcode ranges.

Review the order of the zones

WooCommerce uses the first shipping zone that matches the customer’s location. Put narrower zones above broader ones. If a general zone appears first, it can match the customer before a more specific state or postcode zone is considered.

Check that:

  • The customer’s country is included.
  • State, province, and postcode restrictions are accurate.
  • Postcode ranges contain no accidental spaces or incorrect values.
  • The intended zone has at least one enabled shipping method.

Make sure the zone has an active method

Open the matching zone and select Add shipping method. Typical options include flat rate, free shipping, and local pickup. Open the method after adding it, review its settings, and confirm that it is enabled.

A zone with no active method cannot display a shipping option. If rates come from a carrier or table-rate plugin, the plugin’s method must also be added to the correct zone and configured there.

Verify store settings and the customer’s location

WooCommerce can calculate shipping from the customer’s shipping address, billing address, or a default store location. Review WooCommerce > Settings > General, including Store address, Selling location(s), and Shipping location(s).

Next, open WooCommerce > Settings > Shipping > Shipping settings. If the store sells or ships only to selected countries, customers outside those locations will not receive a rate even if a similar shipping zone exists.

For a reliable test, enter the full address manually rather than relying on automatic location detection. A VPN, browser data, geolocation settings, or a saved address in the customer account can produce a different result from the location you intended to test.

Inspect the products in the cart

Open the product in the WordPress editor and review Product data > Shipping. Confirm the following:

  • The product is not marked virtual if it needs delivery.
  • The product is not incorrectly marked downloadable.
  • The shipping class is correct if your rates depend on shipping classes.
  • Weight and dimensions are entered when the carrier integration requires them.

If every cart item is virtual or downloadable, WooCommerce may correctly hide shipping. Test products individually as well. One item with an unsupported shipping class, restriction, or product type can prevent a rate plugin from processing a mixed cart.

Investigate packages and rate calculations

WooCommerce generally creates one shipping package from the cart, but plugins and custom code can split it by warehouse, vendor, shipping class, or product category. A method must be available for every package. If one package has no valid rate, checkout may offer no usable shipping option.

If your shipping plugin supports package splitting, temporarily disable that feature and test a single physical product. This is a useful way to determine whether the problem is connected to package rules rather than the shipping zone itself.

For live carrier integrations, review the plugin’s logs and connection settings. An expired API key, disabled carrier service, missing dimensions, unsupported postcode, incorrect origin, or invalid currency can cause a rate request to fail. Never publish API keys in support threads or frontend code.

Clear caches and test checkout updates

Cached cart or checkout responses can stop shipping rates from refreshing after the customer changes an address. Clear page, server, and CDN caches, along with WooCommerce session data if your caching system provides a safe way to do that. Cart, checkout, and account pages should generally be excluded from full-page caching.

Retest while logged out in a private window. If rates appear only after a manual refresh, inspect the browser’s developer tools for failed checkout or fragment requests. A JavaScript error, an optimization setting, or a deferred script may be preventing the checkout from updating.

Test for theme and plugin conflicts

A conflict becomes more likely when shipping worked before a recent installation or update, or when it works with a standard theme. Make the test on a staging copy if possible. Temporarily switch to a standard WooCommerce-compatible theme and disable non-essential plugins, keeping WooCommerce and the shipping integration active.

Re-enable plugins one at a time and test after each change. Give particular attention to checkout customization tools, discount and pricing plugins, multi-vendor systems, subscriptions, product add-ons, currency switchers, and performance plugins that combine or defer JavaScript.

Review WooCommerce > Status > Logs for relevant entries and check the system status report for outdated templates or version mismatches. If the problem started after an update, compare the timing with your conflict test. Restore a tested backup only when necessary and avoid using an untested backup as the first troubleshooting step.

Use debugging tools safely

Enable WordPress debugging on a staging site rather than displaying errors on a live store. This configuration records errors without showing them to visitors:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Reproduce the issue, then inspect wp-content/debug.log and the relevant WooCommerce log. Logs may contain URLs, customer information, or other technical details, so protect them and disable debugging after testing.

When custom development is appropriate

Some cases require code-level investigation, particularly when shipping disappears only for complex carts, custom packages, marketplace orders, or special postcode rules. A developer can trace package creation, rate filters, checkout AJAX requests, and compatibility issues without applying untested changes directly to the live store.

I provide full-stack WordPress and WooCommerce development for shipping diagnostics, custom rate logic, plugin conflict resolution, and safer checkout improvements. If you need to hire a PHP developer for WordPress, review what to look for and how to start. For larger fixes, my guide to custom WordPress development explains how to scope the work.

For plugin-specific debugging, see this guide to the role of a WordPress plugin developer. If the WordPress admin is also unusually slow, investigate that separately with the guide to fixing a slow WordPress dashboard.

Frequently asked questions

Why does WooCommerce say no shipping options are available?

The customer may not match a shipping zone, the zone may have no active method, the cart may contain only virtual products, or a carrier or shipping plugin may be unable to calculate a rate for one of the packages.

Why does shipping work for one postcode but not another?

Review postcode restrictions, zone order, state rules, and carrier coverage. A broad zone listed before a postcode-specific zone can also match the customer unexpectedly.

Can caching hide WooCommerce shipping rates?

Yes. Cached checkout responses or broken cart fragments can prevent rates from refreshing. Exclude cart and checkout pages from full-page caching and test again in a private window.

Should I add custom PHP to fix missing shipping?

Only after checking configuration and testing for conflicts. Custom filters can support legitimate business rules, but poorly written code may remove rates or create update problems. Use staging, backups, and version control where possible.

Conclusion

Diagnose missing WooCommerce shipping by following the calculation path: customer location, matching zone, enabled method, shippable products, valid packages, carrier response, and conflict-free checkout behavior. A controlled test usually reveals which part is failing. If standard checks do not resolve the issue, custom shipping logic or experienced WooCommerce development is safer than repeatedly changing settings at random.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top