Blog

How to Fix WooCommerce Shipping Rates Not Showing at Checkout

How to Fix WooCommerce Shipping Rates Not Showing at Checkout

A customer can have the right products in their cart and a valid Canadian address, yet still get stuck at checkout because WooCommerce cannot find an available shipping method. The fix is usually in the shipping configuration, product details, carrier connection, or checkout behaviour, not the payment gateway.

Start by finding out whether rates are missing for every order or only certain addresses and products. That distinction can save you from changing settings that were working perfectly well.

Start with one repeatable test

Open your store in a private browser window and add one physical product to the cart. Enter a complete delivery address within an area you actually serve, including the country, province, city, and postal code.

Use an address you are authorized to use, rather than copying a customer's details into screenshots or support messages. Record the product, quantity, destination, and exact message shown at checkout.

  • No shipping section appears: Check whether the cart requires shipping and whether the checkout is collecting a delivery address.
  • “No shipping options” appears: Check shipping zones, enabled methods, method conditions, and carrier responses.
  • Rates appear for some destinations only: Focus on zone matching, postal-code restrictions, and carrier coverage.
  • Rates disappear after adding a product: Inspect that product's shipping data, shipping class, and any packaging restrictions.
  • The shipping area spins or never refreshes: Look for checkout script errors, failed requests, caching, or plugin conflicts.

Change one thing at a time and repeat the same test. If you change the address, product, shipping method, and cache settings together, you will not know which change mattered.

Before updating plugins, disabling extensions, or changing custom code, take a fresh backup and use a staging copy where possible. Do not restore an older live-store database casually, because that can overwrite orders placed since the backup.

1. Confirm that the cart actually requires shipping

WooCommerce does not need to offer shipping for a cart containing only virtual products. Open the affected product's settings and check whether it has accidentally been marked as virtual.

Downloadable and virtual are different settings. A downloadable product can still require shipping, such as a printed workbook that also includes a digital file.

For variable products, inspect the variation the customer selected, not just the parent product. Variation-specific settings can explain why one option gets rates while another does not.

Also review WooCommerce's general location settings. Confirm that shipping is enabled for the countries you serve, and that selling-location and shipping-location restrictions match your actual business policy.

2. Check which shipping zone matches the address

Go to WooCommerce > Settings > Shipping and review your shipping zones. Labels and screen layouts can change, but zones remain the starting point for most shipping-rate problems.

WooCommerce matches a shipping destination to the first applicable zone in the list. It does not combine all the methods from every matching zone.

That means a broad Canada-wide zone placed above a more specific New Brunswick zone can prevent the provincial zone from being used. Put narrower zones before broader ones.

Look inside the matching zone

A zone can match an address correctly and still provide no usable methods. Open the matching zone and confirm that the intended shipping method exists, is enabled, and has its required settings saved.

A common mistake is creating a specific local zone with only conditional free shipping. Customers in that zone will not inherit a paid method from a broader Canadian zone when they fail the free-shipping condition.

  • Place local postal-code zones before provincial zones.
  • Place provincial zones before a Canada-wide zone.
  • Check that the matching zone contains a paid method if customers need one below a free-shipping threshold.
  • Review the “Locations not covered by your other zones” area if you intentionally serve destinations outside your named zones.

Do not add worldwide shipping as a quick fix unless you genuinely accept those orders. Making checkout available does not mean you can fulfil the shipment at a sensible cost.

Check Canadian postal-code restrictions

If you restrict zones by postal code, compare the rules against the exact destination you are testing. An incomplete entry, overly narrow pattern, or unsupported format can leave an otherwise valid address outside the intended zone.

Use WooCommerce's current documentation for supported postal-code matching syntax. Test the way shoppers actually enter Canadian postal codes, including spacing and letter case, rather than assuming a rule behaves as intended.

If your installed WooCommerce release provides shipping debug mode, it can help identify the matched zone and bypass cached shipping rates during testing. Use it briefly, preferably on staging, and turn it off afterwards because diagnostic information may be visible to shoppers.

3. Review conditions that make a method unavailable

A shipping method can be enabled but unavailable for the current cart. Free-shipping requirements, table-rate rules, conditional-shipping plugins, and custom code can all remove an option.

Free shipping thresholds and coupons

Check whether free shipping requires a minimum order amount, a qualifying coupon, or a combination of both. Review whether the minimum is evaluated before or after coupon discounts where that setting is available.

Test a cart below the threshold, one above it, and one with a discount applied. If free shipping is your only method, customers who do not qualify may have no way to complete an order.

Some stores also use settings or extensions that hide other rates when free shipping becomes available. That can explain why paid methods disappear, even when the checkout is functioning correctly.

Shipping classes and conditional rules

Shipping classes group products for shipping calculations; they do not create shipping methods by themselves. Assigning a product to a class called “Oversized” will not automatically produce an oversized delivery rate.

Check how each method handles the product's class, products without a class, mixed carts, and quantities. With table-rate or conditional extensions, look for gaps between weight bands, order-value limits, and excluded product categories.

If an extension splits the cart into multiple shipping packages, inspect every package. A valid rate for one package does not solve a missing rate for another.

4. Verify weights, dimensions, and packaging

Live carrier rates usually depend on accurate product and package data. Missing weights, incorrect units, or an impossible package size can prevent a shipping extension from returning usable services.

  • Check the store's weight and dimension units in WooCommerce settings.
  • Confirm that product values use those units consistently.
  • Inspect variation-specific weights and dimensions where applicable.
  • Review configured boxes and the extension's packing method.
  • Test one item first, then increase the quantity.

For example, a weight intended to represent grams but entered into a kilogram field can make an ordinary item appear far too heavy. A single item may also fit a configured box while several items exceed its limits.

Do not enter made-up measurements just to make checkout display a rate. That can produce undercharges, carrier adjustments, or a service you cannot actually use.

If you use flat-rate shipping, missing dimensions alone usually are not the cause. Focus on product data when the selected shipping method or its rules actually depend on it.

5. Isolate carrier problems from WooCommerce problems

If your zones look right but Canada Post or another carrier returns nothing, test a basic WooCommerce flat-rate method in the same matching zone on staging. This checks whether WooCommerce can offer a method without contacting the carrier.

If the flat-rate method appears but the live carrier method does not, focus on the carrier extension, its conditions, and its API connection. If neither appears, revisit zone matching, checkout behaviour, and rules that hide shipping methods.

A temporary flat rate is a diagnostic tool, not automatically a safe live-store workaround. Only offer it to customers if you have checked the cost and can honour it across the destinations and products it covers.

Check the carrier connection

Review the extension's connection status and current official setup documentation. Credential requirements, account permissions, and production-versus-test settings vary by carrier and extension.

  • Confirm that the connected account is active and authorized for the required rating service.
  • Check that the extension is using the intended test or production environment.
  • Verify the shipping origin, including its Canadian postal code.
  • Check that appropriate carrier services are enabled.
  • Look for service exclusions, package limits, and destination restrictions.
  • Check for a carrier outage or a recent connection error.

A valid Canadian postal code does not guarantee that every carrier service supports that destination or package. Remote destinations and oversized shipments deserve separate tests.

For Canada Post-specific setup checks, see How to Add Canada Post Shipping Rates to Your WooCommerce Store.

Read logs rather than guessing

WooCommerce logs are typically available under WooCommerce > Status > Logs, while some shipping extensions provide their own diagnostics. Enable the extension's logging temporarily if needed, reproduce the problem once, and inspect entries from that time.

Authentication errors point toward the connection or permissions. Invalid-package responses suggest product or packing data, while timeouts can indicate a carrier or hosting connection problem.

Logs may contain addresses, account details, or credentials. Remove sensitive information before sharing excerpts, and disable verbose logging when the investigation is finished.

6. Check caching and checkout refresh problems

Shipping depends on the customer's current cart, session, and address. A checkout page served from shared page cache can show stale information or fail to update properly.

Confirm that your caching plugin, host, and CDN handle WooCommerce correctly. Cart, checkout, customer-specific sessions, and dynamic checkout requests should not be treated like ordinary public content.

Clearing the cache may temporarily change the symptoms, but incorrect cache rules will bring the problem back. Fix the exclusions and request handling rather than repeatedly pressing “purge.”

If checkout keeps spinning

On staging, temporarily disable JavaScript delay, combination, or similar optimization features and repeat the test. These features can interfere with checkout updates when they delay a required script.

A developer can inspect the browser console and network requests for script errors or failed checkout requests. The relevant requests differ between classic checkout and the Checkout block, so avoid applying fixes intended for a different checkout type.

If a firewall is blocking a legitimate checkout request, investigate that specific event. Do not switch off the store's entire security layer as a permanent solution.

A fresh private window can help rule out an old browser session. Avoid clearing all WooCommerce customer sessions on a busy live store without understanding the effect, because it can disrupt active carts.

7. Check Checkout block compatibility and plugin conflicts

Some shipping extensions and customizations support classic checkout but need additional compatibility work for the Checkout block. This is especially relevant if rates disappeared after rebuilding the checkout page.

Check the shipping extension's official compatibility documentation. On staging, compare the current checkout with a supported alternative rather than replacing the live checkout without testing payments, taxes, coupons, and shipping together.

If the problem started after an update, record which components changed. Then use a staging copy to test with WooCommerce, the required shipping extension, and a compatible standard theme, temporarily disabling unrelated extensions and custom snippets.

Re-enable components one at a time until the problem returns. Pay particular attention to conditional shipping, currency conversion, address validation, checkout customization, and optimization plugins.

Do not deactivate payment or shipping plugins indiscriminately on the live store. For a safer testing approach, see WooCommerce Staging: Why You Need a Test Site.

Verify the fix across realistic orders

One successful address is a useful start, not a complete test. Before calling the issue resolved, check the combinations your store actually supports.

  • A local address and an address in another served province.
  • A remote destination, if you accept orders there.
  • A cart below and above any free-shipping threshold.
  • A discounted cart.
  • A product variation and a mixed-product cart.
  • Multiple quantities and any oversized products.
  • Guest checkout and a returning customer's saved address.
  • Mobile checkout as well as desktop.

For destinations you do not serve, confirm that checkout clearly communicates the restriction. The goal is correct shipping availability, not forcing a rate to appear for every possible address.

Use How to Test Your WooCommerce Checkout Flow to check that the shipping fix has not disrupted the rest of the order process.

When to get help

Get a developer involved when rates depend on custom code, multiple shipping packages, recurring API errors, or a checkout request that keeps failing. Those problems need evidence from the affected request and configuration, not another shipping plugin installed on top.

Ambrite's WooCommerce maintenance options include a WooCommerce health check on Growth and Complete. Complete also includes staging-tested updates and cart and checkout testing after major updates.

If you need help investigating, send a ticket or email with the affected product, destination region, exact checkout message, when it started, and any recent changes. You work directly with the developer, and a repeatable example is much more useful than sharing customer records or passwords in an ordinary message.

This article was written with the help of AI and reviewed by Ambrite. Pricing, features, and technical details may change, so always verify with official sources before making decisions.

Was this article useful?

Related Articles

How to Set Up Moneris Payment Processing on Your Canadian WooCommerce Store
Setting up Moneris on your WooCommerce store feels like wrestling with government paperwork,...
How to Add Canada Post Shipping Rates to Your WooCommerce Store
Running a Canadian e-commerce store means dealing with Canada Post shipping rates, and if...
How to Speed Up a Slow WooCommerce Store
Your WooCommerce store is hemorrhaging money. Every second it takes to load costs you...
Backing Up Your WooCommerce Store Properly
Your WooCommerce store crashed yesterday. The database is corrupted. Your last backup? Three...
When to Update WooCommerce (and When to Wait)
Your WooCommerce store just notified you about a new update. Should you click that update...