Beginners’ Guide to WooCommerce Shipping Zones

WooCommerce 2.6 introduced shipping zones into the core platform, providing more shipping options for merchants directly within WooCommerce.

Rather than being limited to “Flat rate” and “International Flat Rate” in terms of core shipping methods, merchants can now set up additional shipping options within WooCommerce itself. For example, you can offer multiple flat rates for customers in the US, different rates for international customers, pickup options for local customers, and free shipping to certain postcodes.

While shipping zones give merchants more flexibility and options for shipping, it also complicates the shipping set up for new merchants. Let’s go over some tips and best practices so setting up your own WooCommerce shipping zones and shipping methods.

WooCommerce Shipping Zones: Create Zones

The first thing I’d recommend doing is creating your new zones. Each zone should be a geographical area that will have its own shipping methods and rates. The “Rest of the World” zone is a default, catch-all zone that we’ll get to last.

WooCommerce 2.6 Review: WooCommerce 2.6 shipping zones
WC 2.6 shipping zones

When you create your zones, there’s a very important thing you need to consider: zones are matched in order. This means the first zone in your list will be checked to see if it matches the customer first, then the next zone in the list, etc. If no zone matches the customer location, “Rest of the World” is used (which is why you can’t remove it).

In my case, this means I’d like to set up my local or “more restrictive” zones first, then set up more general zones lower in my list. Example: let’s say I want customers in Philadelphia to be able to select “local pickup” as an option. I should have the “Philadelphia” zone above any other general US zones so that this is matched to the customer first and used instead of other zones that may match.

Likewise, this lets you do some “exclusions” as well. For example, if you don’t use USPS for US-based shipping, you may need a more expensive rate for shipping to Hawaii and Alaska (as providers like UPS tend to charge more for this). You can set a zone above the US zone for these states, and customers will be matched to this zone rather than the general US zone.

WooCommerce Shipping Zones: Create zones

If you add some zones, but find you need to re-order them later, you can drag and drop them by clicking the “move” icon on the far left. This will let you change the priority of zones and thus change which zones are matched first.

WooCommerce Shipping Zones: How is a customer matched to a zone?

Zones are always matched in order, from the top zone in the list to the bottom. Therefore, if a customer matches a zone at the top of your list, the rates for this zone will be offered to the customer.

With my current set up, here are some examples on how WooCommerce will find rates:

  • Example 1: Customer in Pittsburgh — WooCommerce will first check the Philadelphia zone. While, this customer is in Pennsylvania, the address doesn’t match the defined zipcodes for the zone, so it’s skipped. WooCommerce next checks if the customer is in Alaska or Hawaii. As this isn’t the case, the customer is matched to the “Contiguous US” zone, and only the rates for that zone are offered at checkout.
    WooCommerce 2.6 US shipping zone

  • Example 2: Customer in zipcode 19131 — WooCommerce checks the Philadelphia zone. As this customer matches the state and limited zipcodes, this zone is matched and it doesn’t need to check any other zones. Therefore, only the rates in the Philadelphia zone will be shown to the customer.
    WooCommerce 2.6 Philadelphia shipping zone

  • Example 3: Customer in the UK — WooCommerce will check these zones in order. The customer does not match any of the US zones or the North America zone. As a result, the default rates in the “Rest of the World” zone will be offered to this customer.
    WooCommerce 2.6 World shipping zone

  • Example 4: Customer in Alaska — The Philadelphia zone is checked and skipped, and then WooCommerce checks our Alaska / Hawaii zone. As this matches the customer, the zone for Alaska / Hawaii is used and its rates are offered rather than the Contiguous US rates.

    WooCommerce 2.6 Alaska shipping zone

You can create as many WooCommerce shipping zones as you’d like to offer different shipping methods and rates to customers around the globe.

WooCommerce Shipping Zones: Create Shipping Classes (Optional)

This step may not be needed for every WooCommerce store, but it’s a good one to complete before you start adding methods to each zone.

If you have some items that are exceptions for shipping or will require certain costs (ie a cost per item), then a shipping class is a helpful way to indicate this.

For example, if you have one or two items that would require freight shipping (such as a shower door or a weight lifting power rack), you can create a shipping class that will let you dictate the rate for these items. To do so, go to WooCommerce > Shipping > Shipping Classes and click “Add shipping class”.

WooCommerce Shipping Zones: Add shipping class
add shipping class

Now when you create products that require this class, you can apply under the “Product Data”.

WooCommerce Shipping Zones: apply class

Once a zone has been created, you’ll be able to set a shipping fee for this zone when adding your methods and rates. This rate could be per class, which means its rate is assessed for every product purchased with this class, or per order, meaning the highest shipping class charge is used once for the order.

WooCommerce Shipping Zones: Add Rates

Before we start adding rates to our zones, you should note that zones are not “combined”. If you have a flat rate of $3.99 for all packages in the “Contiguous US” zone, you may want to add this to the “Philadelphia” zone as well, or it won’t be offered to the customer.

A customer is only offered the methods and rates for the single zone s/he is matched to, and is not offered rates from any other zones, even if they could match the customer as well. This prevents conflicting rates from being offered (ie US Ground at $3.99 and $5.99).

To start adding methods and rates to a zone, you can click on the zone’s name from your zone list.

WooCommerce 2.6 Review: view a zone
View Zone

From here, you’ll be able to click “Add shipping method” and select what kind of method should be added to this zone.

WooCommerce 2.6 Review: choose method type
Choose method type

Once you’ve added the method, click on its name to adjust its settings and rate. If you’ve leveraged shipping classes, you’ll see them here as well to add your customized costs.

WooCommerce 2.6 Review: Configure shipping method
Configure method

Once you’ve added the available methods for this zone, you can drag and drop them the same way you can zones themselves. This will adjust the way they’re shown to the customer at checkout.

WooCommerce Shipping Zones: methods

The zone that’s highest towards the top will always be the default selected zone for the customer (if available).

WooCommerce Shipping Zones: available methods

You can repeat these steps for each zone. Remember, a zone should have all methods you want offered to a customer within that zone; a customer can only match one zone at a time.

Managing WooCommerce Shipping Zones

That’s it! You now have super-specific WooCommerce shipping rates that respond automatically to your customer location.

WooCommerce Shipping Zones: all methods

Each of your WooCommerce shipping zones will offer its set rates, and WooCommerce will check the zones in order from top to bottom until a customer is matched to a zone. This lets you:

  • offer free shipping only for certain states or countries easily
  • as free shipping is now zone-dependent, you can require different order amounts for free shipping in different zones (which is my favorite part — allowing international free shipping for large orders!)
  • offer multiple flat rates, such as ground and expedited, for a zone
  • limit pickup or other methods to local customers only (for example, give free shipping to your neighbors)

As the legacy shipping methods will be removed in the future, I’d recommend setting up new shipping zones and taking advantage of the improvements they offer soon smile


  1. Hi Beka,

    Very very useful post. However, I have a question:

    I have a bunch of variable products on my website and different suppliers these products. They all have different shipping rates and can’t really figure out how to set the shipping classes and methods in my e store because of that.

    For example, I sell posters for a supplier whose shipping costs for UK are 2$ for A4 posters and 3$ for A3 posters. However, for EU or USA shipping costs are 8$ for A4 and 10$ for A3 posters.

    Also, I have a different supplier that charges me 2.5$ for all the UK shipping and 3.85 for any other location.

    I also have a few more suppliers that charge differently for the shipping of their products.

    My question is: How do I set the shipping costs for each products based on the information provided above. I am very confused as I can’t figure out a way to do it and they get mixed out at the check out. I would really appreciate your help as I don’t know who else to ask….

    Thanks very much!


    1. Hey Marius, you could do this typically with Shipping Classes + zones. For example, an A4 poster shipping class could have a set cost for the UK zone, and a different cost when added to the USA zone.

      However, you seem to be using different suppliers that supply the same products at different shipping rates — there is no way in WooCommerce core to designate that one product could come from multiple places. How should WooCommerce know that for this sale, an A4 poster in the UK is coming from Supplier1 at $2, but for the next sale it’s coming from Supplier2 at $2.50? There is no way to mark the shipping cost of a product differently without any criteria. If you can’t have concrete rules for it, WooCommerce can’t do it :)

      My best advice would be to use shipping classes for the product type + zones (this will let you vary the cost for the product by location), and if you could have multiple rates for a shipping class within a zone, just use the higher cost.

  2. Hi Beka,

    Thanks for your reply.

    The thing is that I also have other different products coming from different suppliers such as lamps or vases that have totally different shipping rates and in most cases, much higher than the shipping rates for posters.

    Any suggestions on how to set up the shipping in this case?


    1. Gotcha, then it sounds like you’ll need a shipping class for every product type that can have different rates so you can do the same thing as my A4 example above — each shipping class can have its own rate per zone.

  3. Hi Beka,

    Again, thanks so much for your input. You are helping me a lot and I think your suggestion will work :)

    One more question though: When setting up the shipping for a product you need to select a Shipping Class so considering that I name my shipping class “Lamp Shipping” – this will only be used once and will only have one rate but if there are different rates for shipping inside and outside the country for the same product? What do i do in this situation?

    Thank you for your time in writing these answers. You re doing a great job.


    1. Correct, this is where the zones come in :) You can set different rates for a class in every zone, so in the UK the UK rate for “Lamp Shipping” would be used. In zones, that zone’s rate for the class would apply.

  4. Hi Beka,

    This is really helpful.

    I have an online clothing store and want to setup conditional pricing based on quantity of Products within a Shipping Class. It would look something like:

    Quantity=1: $5.00
    Quantity≥2 and Quantity≤5: $7.00
    Quantity>5: $8.00

    Is this possible to calculate this in the “Shipping Class Cost” field? I know there are plugins that could do this, but was wondering if it was possible without an additional plugin.


  5. How do I add a product and by default just have it show 1 rate on checkout — I have set up Standard post ( letter ) and Parcel post all on the same zone — I just had a client choose the cheaper option ( letter )even though I instructed her to use the Parcel post option on checkout as I need to send the product by parcel post not letter as it is too big for a letter class ? When you add more flat rates — everything appears on the checkout and only confuses the buyer as they have no idea what postage to actually choose that is correct for their order.

    Simply put I need to set the correct postage at the product level and then and only then does that postage appear on the checkout AND if I set the postage to be letter on another product then it will added automatically to the parcel postage if it is in the shopping cart — the more expensive option is always shown by default. Parcel post will always override the letter post.

    hope you can help ?

  6. HI Beka,

    I coming back to you with another question. Hopefully you can help me.

    I have a supplier who charges me £5 for shipping product A and £7 for shipping product B. If a customer buys products A & B from me I don’t want him to pay £12 for shipping. I would like to able to charge him, say, 5£ for product A + another 5£ for product B so he ends up paying £10 for shipping, not £12.

    Then, if he also wants to add in the cart another product whose normal shipping costs are 3£.I want to be able to charge the customer £1 if added this product as an additional item on top of products A & B, how can I do that?

    It’s a bit confusing…

    Thanks for your time.


  7. Hi Beka,

    Thanks for a clearer understanding of the new shipping zones. We’ve been using Woocommerce for quite a while, so I’m one of those grumps who hates that they’re messing with something I had finally gotten to work just fine for me! :-)

    Now we’re redoing our whole website, so I’m starting from scratch again, and I’m flummoxed as to how to use the shipping zones to reflect that SOME of my products have free shipping. No coupon, no minimum order. Yes, I’ve set up a shipping class that doesn’t charge a shipping fee but then the cart displays ‘Flat Rate’ rather than ‘Free Shipping.’ Granted, there’s no amount shown, but I don’t want my customers to wonder about whether they’re getting free shipping or not.

    Any ideas?


  8. Hello,

    So I’ve set up my shipping zones and my shipping classes and applied the ‘free shipping’ classes to specific products and have also created ‘free shipping coupons’ BUT my question is that no matter what I do, the flat rate shipping is always there. Even after I’ve applied the free shipping coupon etc. How do I make it so once the free shipping coupon has been entered, the flat shipping will also disappear?

    Thank you.

    1. Hey Anni, WooCommerce doesn’t do hide other methods by default in case your other rates would be faster than free shipping and customers can choose. If you’re using a true free shipping method (not just a free, flat rate method), this sample snippet would hide anything but a free shipping rate when it’s available, which would at least cover the coupon scenario.

  9. Any idea how to get other plugins to still show when a shipping zone is triggered?

    IE I use a plugin for a delivery service called FastWay which covers most of my clients shipping needs. However, they allow local pickup and local delivery for a set fee just within the Postcode their shop is located. I’ve set these up using the shipping zones, targeting the one Postcode. The problem is, on the website, if this postcode is used ONLY the shipping zone options show up, but not the Fastway options, which I still need to show.

    This only affects the one Postcode I’ve got set up using the shipping zones.

    1. Hey James, every shipping plugin that I have that does not support zones is still available at checkout, and is always offered as an option, regardless of which zone applies. It sounds like the Fastway plugin may not have full zone support yet, so I’d recommend getting in touch with their team to troubleshoot, or to just use it outside of a zone if possible, since it sounds like it handles limiting itself at checkout on its own (without the need for zones).

  10. Hi Beka
    Thanks for the information on this page. It has been really helpful. It is far better than the Woocommerce documentation.

    I’m still struggling with understanding how to set up the Flat rate shipping though. Are you able to help?

    At the moment I have table rate shipping set up in my store. However I want to change this to the zone shipping so that it charges for each additional item in the basket.

    For the purpose of shipping I will have 2 different shipping classes.

    In the settings for flat rate postage how would I go about setting up the following example?

    Product shipping class A:
    Flat rate shipping for 1 item =£1
    Each additional item from this class would cost another £0.40

    Product shipping class B:
    Flat rate shipping for 1 item=£1.80
    Each additional item from this class would cost another £0.70

    Customers regularly mix and match products A and B.

    If a customer buys 2 products from shipping class A and 2 products from shipping class B I want it to choose the highest price of postage for the first item and then add on the cost of each additional item like below:

    1st product in shipping class B=£1.80
    2nd Product in shipping class B=£0.70
    2 x products from shipping class A – 2x£0.40
    Total = £3.30

    Is this something that is possible?


    1. Hey Sarah, the Product A shipping class / Product B shipping class pricing shouldn’t pose a problem, it’s the last part that does. There’s no core way to say, “add this per-order fee, but compare it to other fees and then determine which one to add”. The shipping classes in WooCommerce aren’t really aware of each other in that way. Your best bet would be to set up the shipping classes only using the [qty]*class_fee set up, like 0.40*[qty], then having some custom code to add a per-order fee based on which shipping classes are present in the order.

      1. Hi Beka
        Thanks for your reply. The nearest I’ve come to what I want is similar to what you suggested. I found that if I added a base cost in the top part where it says “cost” and then + ( 0.4 * [qty] ) for one product class and something similar to another shipping class it is close to what I’m after. It’s not ideal but I’m going to run with it and see how it goes.
        Thanks for your help.

  11. I have 1 product in my shop that I want to offer with Free Shipping. I’ve found that the Free Shipping zone only allows by price or coupon, so I setup a shipping class in the Flat Rate section. This “free” class works.. I can apply it to the one product, and it doesn’t charge shipping. But in the cart, it lists “Shipping: Flat Rate”. Do you know how to add 0.00 next to that OR change the wording to “Free Shipping” when the amount is 0? I’ve found that people are confused by the wording and don’t recognize that it is free. Thanks in advance.

  12. HI Beka,
    Useful info and can I echo the comment above that this is better than the actual Woocommerce info.

    I used Table Rate shipping when I started my business in 2013 but it I needed a little more complexity as some of the items I sell are classified as dangerous goods. So I upgraded to a pay version called Table Rate plus by Mangohour. It worked perfectly, but something seems to have happened to them and the plugin is no longer supported and so conflicts were occuring.

    So I decided to bite the bullet and try setting up using the Woocommerce Shipping Zones.

    All seems straight-forward except that I do sell small CO2 Gas Cylinders for lifejackets from here in the UK and I cannot sell them to my Rest of World Zone.

    So I have 6 shipping classes, all set up, but when I come to the Rest of World Zone I only want my 5 classes in there.

    I do not want to have my Gas Cylinder Shipping Class available to RoW.

    Is there a way I can disable or remove this Shipping Class from the RoW zone so that when a customer from (for example) Fiji tries to order CO2, it blocks the order as a shipping option isn’t available, in the way that Table Rate does?

    I’m trying to think of one, but haven’t managed so far. Perhaps I’ll have to look for a suitable alternative to the Mangohour plugin I’ve used for two years.

  13. Hi Beka,
    I’m missing the legacy shipping options. :( I want to be able to have some products local pick up only, and some products with a choice of local pick up or flat rate mail. I can’t seem to be able to do that anymore.

  14. Hi there,

    I am trying to set up my shipping – US &

    US shipping is $3.00 for 1 item, and $2.00 for each additional item
    Canada will be $10 fr 1 item, and $2.00 for each additional item

    Is this doable?

  15. Is it possible to have shipping based on price in cart?

    Say $0 to $25 = $9.99
    $25.01 to $50 = $12.99
    and so on?

  16. Thanks for your reply Beka it’s a shame they make you pay so much for such a needed thing in ecommerce.

  17. Hi Beka,

    Coming back to you for help as this article doesn’t cover this subject…

    Is there a way to add custom text instead of shipping price in wordpress? For example, if someone from Italy wants to buy one of my products I can’t restrict that person from buying and when they calculate their shipping price the message “There is no shipping method available…….” pops up. However, they could understand this as Free Shipping which is not my intention. Therefore, I would like to able to change the above text with something along the lines of “This item does not ship to your country” or something like that.

    Any help?



  18. hI Beka, what do you recommend me to use for using a zone with zip code plus freight changes depending on product quantity?

  19. Hi Beka, I have set up Shipping Zones with Hawaii at the top Region: Hawaii, 967*, 968*. Then ‘US’ in 2nd row ‘United States (US)’, Canada next, then International (‘Rest of the World’).

    I test the checkout by selecting ‘Hawaii’ and even entering a Hawaii zipcode, and nothing I do makes the cart update to the Hawaii shipping amount. It stays the United States (US) amount. No matter what I do, the shipping for Hawaii does not add in.

    I even tried adding each individual US State (EXCEPT Hawaii) into a zone region for ‘US Domestic’ — then the cart geolocated me to the ‘International Zone’.

    All the other shipping zones work correctly except this one. Can you think of anything that might cause this?


      1. Beka, thank you for your reply! I initially tried just using ‘Hawaii’ for the ‘Zone region’ (with no zip codes). Then I added wildcard zip codes, each on a separate line. I previously tried every single zip code too. Still no love. Now I am using both. By the way, the Hawaii zone is first in the ‘Shipping Zones’ list too (before US).

        If it helps to see a screenpic of this, it is here:

        This was happening before the 3.0 and 3.0.1 WC updates too.

        I appreciate any other thoughts you might have. All other shipping seems to be working (thank goodness :)

        1. Hey Christina, this exact set up works for me to match Hawaii. Here’s what I’d do:
          1. Double-check to be sure Hawaii is the first / top zone.
          2. Enable the shipping debug mode setting (Shipping > Shipping options) to see what you’re matched against if not the HI zone
          3. Deactivate all plugins and switch to a default theme
          4. If all of this doesn’t yield any results, I’d recommend pinging the Woo help desk as there may be something wrong with the server or your site database if no other plugins are active and you still can’t get matched to the right zone.

  20. Hi Beka,
    OK, so it must be something in the site. I will follow your suggestions. Thank you so much for your expertise and help with this.

  21. Hi Becka,

    I find this blog very helpful. But I’m struggling on how to create the shipping zones base on my requirements. I’ve already set cost per zones but some of the items have different cost per zones.

    Item A: UK:£2 Zone1:£5 Zone2:£6 Zone4:£8 Zone5:Free
    Item B: UK:£5 Zone2:£8 Zone3:£12 Zone4:Free Zone5:Free
    Item C: UK:£8 Zone1:£13 Zone3:£17 Zone4:£20 Zone5:£25

    How do I do this?


    1. Hey Philip, check out the tips on shipping classes, as you’d need to have items in a shipping class, and change the cost of that class per zone.

  22. Hi Beka, sorry to bother you – again a problem with setting up shipping zones. I am using WooCommerce 3.0.5.
    The first shipping zone – there are few EU countries and a very long list of range of postcodes. Each range of postcodes is in separate line. The costs of shipments are higher for those areas.
    The second shipping zone – There are the same contries as above and some more EU contries and no postcodes indicated.
    For example there are some postcodes concerning Italy, among others like below:
    My problem is that if we choose shipment to Italy and the postcode 29010 the system does not skip the first zone and indicates the higher shipping costs, although this postal code is not included in the very long list of codes.
    Can you please think of anything that I may check or change?

  23. I’ve been trying to get shipping to work for over a week now without success. I have two shipping zones set, UK & Ireland. For the UK the flat rate is €10 and free if the order is over €75. For Ireland the flat rate is €5 and free if the order is over €50.

    Here’s the problem. Only the shipping zone which appears first in the list of shipping zones within settings gets used. For example, if Ireland is the first shipping zone, when on the actual website, a customer with a UK delivery destination is presented with Ireland shipping rates.

    If in the admin settings, i move the UK shipping zone to the top of the list then only UK rates apply on the actual website (no matter which country is selected as the delivery destination, UK or Ireland).

    It’s as though all shipping zones in settings which appear below the first in the list are ignored (even though there’s only one/ with two shipping zones in total). There is no matching a customer to the correct shipping zone via their address.

    Any thoughts or suggestions from your own experience would be greatly appreciated.

    1. Hey John, I can’t replicate this one — having Ireland first and using “Ireland” as the checkout country shows Irish rates, while selecting UK shows UK rates. Likely there’s a conflict here, so I’d recommend deactivating all plugins aside from WC, switching themes, and if you still see the issue, opening a thread with the help desk.

  24. Hi Beka

    Thanks for this great blog!
    Also struggling for a few hours now with free shipping setup.
    The freeshipping coupon works perfect as long as the user is not logged in.
    The moment we log in and apply the coupon, we get the message that it is successfully applied but it does not deduct the shipping cost. My thought is that the moment someone log in the coupon will be checked against their location. All Zone Regions are added to the Shipping Class. Free Shipping is added as a Shipping Method. I’ve moved Free Shipping to the top of the Shipping methods but it did not have any impact. The “rest of the world” Shipping Zone does not have any Shipping methods. I’ve tested by adding free shipping as a method to it as well. Any idea why the coupon won’t work for logged in users

    1. Hey Stephan, I’m afraid I’m not able to replicate any issues in allowing free shipping for my customers, logged in or otherwise, while using a coupon. I’d be sure your free shipping method for each zone can be activated by using a coupon (check the settings for the method in every zone), and then if it is, post this on the forums or submit a help thread since this may indicate a deeper issue.

  25. Hi Beka

    I have a dilemma. I offer free shipping on all my products standard, then offer upgrades to express overnight shipping, 3-day shipping etc. via USPS and UPS. I have one product which is an aerosol can and can only ship via ground, not air. When I try to set up a shipping class, it does not give me the options for all of the USPS and UPS ground shipping methods, which are variable costs based on shipping locations. I want to exclude the options for air shipments for any orders containing that aerosol can product, but show all the remaining options for ground shipping. No flat rates apply. Any suggestions?

  26. Hi Beka,

    Thanks for this useful article. I am setting up distance wise shipping for one of my website, I want to setup 1 price for distance upto 40 km as per grams, and another price for same upto 40 km but for 100 grams, and for upto 200 grams for upto 40km rates are different, and this rate will for more km and more grams.

    Also I want to add certain amount to this amount then it exceeds 500 grams.

    Kindly help.
    Thank you

<em>Hmm, looks like this article is quite old! Its content may be outdated, so comments are now closed.</em>