How to Set Up WooCommerce Shipping: Zones, Flat Rates, and Free Shipping (2026)

A customer adds three bottles of your restaurant’s signature sauce to their basket, enters a postcode, and gets “No shipping options available.” The products are ready. The packaging is ready. But one misplaced shipping zone has stopped the sale. WooCommerce shipping isn’t difficult once you understand how its rules fit together. The trouble usually comes...

September 16, 2026 WPSlash

A customer adds three bottles of your restaurant’s signature sauce to their basket, enters a postcode, and gets “No shipping options available.” The products are ready. The packaging is ready. But one misplaced shipping zone has stopped the sale.

WooCommerce shipping isn’t difficult once you understand how its rules fit together. The trouble usually comes from treating zones, prices, and delivery promises as the same thing. They aren’t.

This walkthrough uses a restaurant selling packaged sauces and meal kits as its example. We’ll build local and domestic shipping options, add sensible charges, configure free shipping and collection, then test everything before customers find the gaps.

How WooCommerce Shipping Works Before You Add Any Rules

WooCommerce’s built-in shipping setup has three main parts: zones, methods, and classes. Think of them as where you ship, what customers can choose, and which products need different charges.

A shipping zone is a geographic area. It could contain a few local postcodes, a state, or an entire country. WooCommerce uses the customer’s shipping address to find the matching zone.

A shipping method is an option offered inside that zone. Core options include Flat Rate, Free Shipping, and the zone-based Local Pickup method. You can add multiple methods to a zone, including multiple flat rates with different customer-facing names.

Shipping classes group products with similar shipping requirements. Our example shop might have “Sauce bottles” and “Bulky meal kits” classes. Those labels don’t create delivery options on their own; a method such as Flat Rate must use them to calculate a charge.

Check which products actually need shipping

Physical products normally require shipping or collection. Products marked Virtual don’t require shipping, so an entirely virtual basket won’t need a shipping method. Marking something Downloadable alone doesn’t remove its shipping requirement—a product can include both a physical item and a download.

For our shop, sauce bottles are ordinary shippable products. Meal kits are too, but their packaging and temperature requirements need an operational plan beyond a checkout fee. WooCommerce’s core flat rate doesn’t check carrier suitability, transit times, or cold-chain conditions.

Hot-food delivery is a different workflow again. Postcode shipping rules don’t calculate a driving radius or manage preparation capacity and delivery slots. If you’re also taking prepared-food orders, FoodMaster’s WooCommerce restaurant ordering system is the more appropriate foundation for delivery, pickup, and dine-in ordering. Confirm your particular distance and scheduling requirements separately rather than expecting ordinary shipping zones to handle them.

Create Shipping Zones That Match Where You Deliver

Start with your service area on paper. For this example, we’ll use a US shop that ships locally around two Manhattan ZIP codes and more widely within New York State. These locations are illustrative; use destinations your fulfillment arrangements actually support.

The structure is deliberately simple: a narrow local zone, a broader domestic zone, and no shipping service elsewhere. “Domestic” doesn’t have to mean nationwide.

Add the narrow local zone first

  1. Open WooCommerce → Settings → Shipping → Shipping zones.
  2. Select Add zone and give it an internal name, such as “Local packaged-goods shipping.”
  3. Under zone regions, select the appropriate country and state—in this example, United States and New York.
  4. Choose Limit to specific ZIP/postcodes.
  5. Enter 10001 and 10011, one per line, and save.

The zone name is for administration; customers see the titles of the shipping methods you add later. Naming zones precisely saves confusion when someone else has to maintain the store.

WooCommerce supports individual postcodes, numeric ranges such as 10001…10011, and wildcard matching such as 100*. Use these carefully: a numeric range covers the intervening numbers, while a wildcard can cover a much larger area than intended. Test real addresses at the edges of every rule.

Add your broader domestic zone underneath

Create another zone called “Domestic shipping — New York State.” Select New York as its region, but don’t restrict it to postcodes. Move it below the local zone in the zone list.

Each customer matches only one shipping zone: the first matching zone. A customer in 10001 therefore gets the local zone’s methods, not a combined selection from the local and statewide zones. If the statewide zone comes first, it catches that address before the local rule can apply.

This also means an empty local zone doesn’t fall back to the wider zone’s methods. Add every option you want local customers to receive directly to their matching zone.

Leave unsupported destinations without shipping

Keep the fallback zone, usually labeled “Locations not covered by your other zones,” without an enabled shipping method. Also review the store’s general selling and shipping location settings so they agree with your service area.

A New Jersey shipping address would have no shipping service in this example. That’s intentional—not a fault to “fix” by adding a worldwide flat rate. If collection is available separately, it may still be a valid option.

Finally, postcode coverage is not road distance. Two addresses with similar ZIP codes can involve very different journeys. Avoid labeling this arrangement “Delivery within five miles” unless another system actually enforces that promise.

[IMAGE: WooCommerce shipping zone list showing Local packaged-goods shipping for ZIP codes 10001 and 10011 above a New York State zone, with no methods in the fallback zone]

Set Up Flat Rate Shipping and Shipping Classes

Open your local zone, choose Add shipping method, select Flat Rate, and open its settings. Give it a useful customer-facing title such as “Packaged-goods shipping.” Don’t promise “Next-day delivery” unless your dispatch process and carrier service support it.

For this example, enter a base cost of 4. Use plain numeric values in the cost field rather than adding a currency symbol. We’ll treat all example charges as dollars before any applicable shipping tax.

Check the method’s tax status too. A $4 shipping cost isn’t necessarily the final amount displayed when shipping taxes apply; that depends on your store’s tax configuration and the order.

Create and assign the product classes

Under the Shipping settings, open Classes or Shipping classes, depending on your interface, and create “Sauce bottles” and “Bulky meal kits.” Save them, then edit each product and assign the appropriate class under Product data → Shipping.

Variable products deserve an extra check. Individual variations can use their own shipping class or inherit the parent product’s class, so inspect the actual variations customers buy.

Return to the Flat Rate method. Set the Sauce bottles class cost to 2, the Bulky meal kits class cost to 6, and explicitly set the no-shipping-class cost to 0 for this exercise. Keep the base cost at 4.

Understand per-class versus per-order calculation

With Per class calculation, WooCommerce adds the applicable class costs to the base cost. With Per order, it adds only the most expensive applicable class cost to the base. The base charge doesn’t disappear in either mode.

  • Sauce bottles only: $4 base + $2 class cost = $6 in either mode.
  • One meal kit only: $4 base + $6 class cost = $10 in either mode.
  • Sauces and a meal kit: per-class costs $12; per-order costs $10.

Fixed class costs aren’t automatically multiplied by quantity. Under these settings, three sauce bottles still produce the same $2 sauce-class addition. Quantity-based formulas are possible, but plain fixed amounts are easier to audit while you’re learning.

The customer still selects “Packaged-goods shipping,” not “Bulky meal kits.” Classes modify the method’s price; they aren’t standalone methods. Repeat the setup in your broader zone with charges appropriate to that territory—editing one zone’s flat rate doesn’t update another’s.

Offer Free Shipping Without Surprising Customers

Free shipping should be a deliberate margin decision, not a checkbox you turn on and hope for the best. Glass bottles, insulated packaging, and heavier mixed baskets can make the same threshold profitable for one order and expensive for another.

Inside the relevant zone, add a Free Shipping method and open its settings. Core WooCommerce provides five requirement choices:

  • No requirement.
  • A valid free-shipping coupon.
  • A minimum order amount.
  • A minimum order amount or a valid free-shipping coupon.
  • A minimum order amount and a valid free-shipping coupon.

A valid free-shipping coupon must have its free-shipping permission enabled in the coupon settings and meet its other restrictions. An ordinary discount coupon doesn’t automatically qualify.

Set a threshold and decide how discounts count

Choose a minimum order amount and enter 50. Then inspect the setting labeled along the lines of Apply minimum order rule before coupon discount.

When enabled, it evaluates the qualifying amount before coupon discounts. When disabled, discounts reduce the amount used for eligibility. For a simplified example with no tax complications, a $55 merchandise subtotal with a $10 discount qualifies before discounts, but falls to $45 and fails when assessed after discounts.

Tax-inclusive versus tax-exclusive cart display can also affect the amount WooCommerce evaluates. Test with your real tax configuration rather than assuming the final order total—including shipping—is the threshold basis.

Check what the customer actually sees

Test merchandise subtotals of $49.99, $50, and $50.01. Repeat with a coupon, then repeat in your other zone if it should offer the same promotion.

Don’t assume paid methods disappear when free shipping becomes available. Recent WooCommerce versions include a setting to hide other shipping rates when free shipping is available; inspect your installed version’s Shipping settings for it. Older installations or customized checkouts may behave differently.

If a paid option remains visible, make sure it has a purpose, such as a genuinely faster service. Check pickup visibility separately as well. A free-shipping offer shouldn’t accidentally remove the collection choice your customers prefer.

Add Local Pickup Alongside Shipping

Collection sounds straightforward, but WooCommerce has two distinct pickup arrangements. There’s the traditional Local Pickup shipping method added to zones, and a separate pickup configuration designed for the block-based checkout.

Check your Checkout page in the WordPress editor first. Does it contain a Checkout block, or is it using the classic checkout shortcode? That determines which setup is appropriate.

Using zone-based Local Pickup

For a classic checkout, open the relevant shipping zone and add Local Pickup. Configure its title, cost, and tax status. A label such as “Collect from our Main Street restaurant” is more useful than a bare “Local pickup.”

Because this method belongs to a zone, it’s available only to addresses matching that zone. Add it to each intended zone, remembering that customers don’t inherit methods from broader zones.

Using pickup with Checkout blocks

For a block checkout, inspect WooCommerce → Settings → Shipping → Local pickup for the separate pickup setup. Enable it and configure your collection location details and any applicable charge.

This block-based arrangement can offer collection independently of shipping-zone matching. Zone-based pickup can also appear in block checkout, so avoid enabling both approaches casually—you may produce duplicate or confusing collection options.

Check tax results when choosing between pickup implementations. Collection location and pickup-specific tax handling can affect the calculation; don’t assume a pickup order follows exactly the same rules as an order shipped to the customer.

Neither a clear label nor a pickup address creates a preparation schedule. Add realistic collection instructions, but use suitable additional functionality if you need selectable times, order cutoffs, or capacity limits. For restaurants, FoodMaster’s delivery, pickup, and dine-in ordering plugin is a natural starting point for that wider workflow; verify the specific scheduling behavior before promising time slots.

[IMAGE: Mobile checkout showing packaged-goods shipping and Collect from our Main Street restaurant options, with the pickup address and collection instructions clearly displayed]

Test Your Shipping Setup and Fix Missing Options

Test shipping as a customer, not just as an administrator looking at saved settings. Use a private browser session and your payment gateway’s supported test mode or a staging environment. Complete orders as well as checking displayed prices.

Check both cart and checkout. Some carts won’t show a final rate until enough address information is entered, so compare results after supplying the same complete shipping address.

A practical pre-launch test matrix

  • Local address: use a valid 10001 address. Confirm the local zone’s methods and prices appear.
  • Wider domestic address: use a supported New York address outside the two local ZIP codes. Confirm the statewide rates.
  • Unsupported address: test New Jersey and an overseas destination. Neither should receive an accidental shipping rate.
  • Incomplete address: remove the postcode or state, then restore it. Confirm the rates recalculate correctly.
  • Mixed classes: test sauces alone, meal kits alone, both together, and an unclassified product. Check quantities too.
  • Free-shipping boundary: test $49.99, $50, and $50.01, then apply a discount and check the expected eligibility.
  • Pickup: select collection, inspect any charge and taxes, and verify the location appears correctly in order details.
  • Virtual products: test an entirely virtual basket, then add a physical product and confirm shipping becomes necessary.

Work through missing options in order

First, inspect the customer’s shipping address—not just the billing address. Check zone priority and postcode rules next. A broad zone above a narrow one is a common culprit, as is a valid postcode missing from an overly restrictive list.

Then open the matched zone and verify that its methods are enabled. Remember: WooCommerce won’t move on to a broader zone simply because the first matching zone has no methods or its free-shipping requirement isn’t met.

Inspect product settings too. Accidentally marking sauces as Virtual removes their shipping requirement. A wrong shipping class usually explains an incorrect charge rather than a missing zone.

If the configuration looks right, check that any shipping extensions support your checkout type. Where available, shipping debug mode can identify the matched zone and help with rate-cache troubleshooting; disable it afterward. Also make sure page caching excludes cart and checkout, and investigate plugin conflicts on staging rather than during dinner service.

Your final launch check

Before opening orders, confirm zone order, enabled methods, class assignments, tax treatment, coupon behavior, collection instructions, and mobile checkout. Place one complete shipping order and one pickup order, then check the confirmation emails and the information staff receive.

For the related setup work, use WPSlash’s WooCommerce tax tutorial search and WooCommerce coupon tutorial search to find the relevant guides. Those settings directly affect the totals and eligibility you’ve just tested.

A good shipping setup is pleasantly boring: the right option appears, the price makes sense, and the kitchen or packing team can fulfill what checkout promised. That’s the standard to launch with.

Commission-free ordering

Run restaurant orders on your own WordPress site

FoodMaster adds delivery, pickup, dine-in, POS, and kitchen tools — with zero per-order fees.

Get FoodMaster

Leave a Comment

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

×

🔥 ONE DAY ONLY OFFER 🔥

Upgrade FoodMaster Today

Normally your license is limited to 1 Website.

Today only, get a LIFETIME Unlimited Websites License for just:
$499

✔ Unlimited Client Websites
✔ Unlimited Personal Projects
✔ Future Updates Included
✔ Save Hundreds on Additional Licenses

Offer Ends In: