Applying free shipping on orders can be great incentive for (potential) customers to order on your website. In some cases it is not possible to ship all products free and you only want to ship a specific product or group of products to ship for free. In this post I will go through setting this up. Note that there are different use cases, plugins etc that can be used by people. I will try to go over the most common ones in this blog post.

Using WooCommerce Advanced Free Shipping

WooCommerce Advanced Free Shipping (WAFS) is a plugin that I created that allows you to setup free shipping for the entire order. There is no way for that plugin to allow free shipping for one specific product (as it doesn’t know how the original shipping cost has been setup). This question arises from time to time, so I wanted to make this clear.

Apply free shipping when using a shipping carrier plugin

When you’re using a shipping carrier plugin like UPS, FedEx USPS etc that is getting live quotes from their respective API you can accomplish this in various ways.

Setting weight/dimensions

One of those ways is by setting either (or both) the weight and dimensions to 0. Depending on the shipping carrier, they may use the weight or size to calculate the shipping cost based on that. When a product has 0 weight it shouldn’t take that in account for shipping.
I’ve never used shipping carrier plugins like this, but I’ve had multiple users confirm this to me.

This may or may not work for you was you will have inaccurate data for some products in case you were using the weight/dimensions field.

Splitting the order

A user of the WAFS plugin came with this solution, and it works really well in many cases. I’ve written about splitting shipping packages before. When you split an order into multiple packages, you can use the ‘WooCommerce Advanced Shipping’ plugin to setup free shipping for the package that contains the products you want to ship for free.

Another method is to have a regular (WC Core) free shipping rate, and hide it by excluding it from the paid shipping packages (you’d have to keep up with this if you create more packages in the future).

Apply free shipping when setting up your own shipping cost

This is a hard one as it is really dependent on how you calculate your shipping cost.

Shipping class

If you’re using shipping classes to setup the shipping cost you can easily assign a ‘free shipping’ class to those products who you want to have free shipping, and assign shipping costs to the other classes.

Weight based shipping cost

If you’ve setup your shippnig cost to be weight based it can be difficult, but there are still some options available.

1) Splitting the order into multiple packages as described above (and below again)
2) Setting the weight in the product to 0. This will make sure that you weight shipping rules do not take this product in account.
3) Changing the matching function. This one is with my own plugins in mind, as they allow the matching function to be changed, letting you create your own matching functionality, and thus exclude the weight of the free shipping products from the total weight. This requires custom coding and does require programming knowledge.

Flat rate

If you have a flat rate for shipping than this shouldn’t change much.

Splitting the order

The same technique can be used here as described above. By splitting the order and setting up free shipping for the package that contains the free shipping products.

I need your help

Did you read the post and didn’t find a solution useful for your case? Please let me know in the comments below. If its a good use case I will add it to the post. That way I can extend the post to include more and better solutions.

Jeroen Sormani

I'm a professional WordPress plugin developer on a mission to create the best plugins for my clients. I'm specialised in developing general WordPress, WooCommerce and Easy Digital Downloads plugins.

Interested in talking about a WordPress project? Get in touch!

Follow me on Twitter

59 thoughts on “Apply Free Shipping for Specific Products in WooCommerce

Susan March 2, 2016 at 4:59 pm

We have USPS and UPS shipping options. I tried to zero out weight and dimensions on the products that offer free shipping. But it still brings up USPS priority mail shipping charges on those products, it removes the UPS shipping charges. Any other thoughts on how we can achieve removing the shipping for those set of products? We have to be able to allow multiple address shipping as well for the entire cart which could have free shipping products and cost shipping products. Thank you!!

jeroen March 2, 2016 at 9:45 pm

Hi Susan,

One suggestion would be to make it a virtual product, but that could also have some unexpected side-effects, so be careful!

Another is suggested in the post, by splitting the order into multiple packages and create a free shipping package. It could be that the multiple address plugin is also making use of this, so that should be taken into account 😉


Chris Bakker March 23, 2016 at 3:33 pm


I am using woocommerce to sell products, but the 20kg bags i sell should have free shipment, but the other products should have shipment costs,

i only get free shipment on € not on weight, how do i change this?

jeroen March 24, 2016 at 10:46 pm

Hi Chris,

Not sure what you mean with “i only get free shipment on € not on weight”
But what I’d advise is the way of splitting the shipment in two packages, and setup free shipping for the one with the 20kg bags.


Jan September 20, 2016 at 11:18 am

Thanks for the tip of applying free shipping with a shipping carrier plugin, used weight and that worked exactly as it should – displaying an extra shipping option if a product with weight was added to the cart.

Randy Maningas December 6, 2016 at 9:54 pm

Was wondering if you could help me? I am trying to configure our shipping so that only product variations selected to have free ground shipping only show the “Free Ground Shipping” option only in the cart. In other words if you don’t select the variation “Free Ground Shipping” will not show in the shipping options. We are using a UPS (Basic) WooCommerce pluglin. And I have set the Shipping class and zones for free ground shipping. I hope you can help me!

Jeroen December 7, 2016 at 2:23 pm

Hi Randy,

You should be able to set this up using my Advanced Shipping plugin. Here you can setup the condition to ‘contains shipping class’ and check whether a free shipping product is in the cart. There’s also the option to hide all the other rates when free is available, which may also be useful for your scenario.


Jeroen January 17, 2017 at 6:02 pm

I’m looking for a solution for the following:

If a customer orders a minimum amount of a specific product AND lives in a specific shippingzone (based on zipcode) shipping should be free. Otherwise the fixed shippingcost should be applied.

Any ideas how to achieve that, or which plugin I could use?

Jeroen January 17, 2017 at 10:10 pm


You could use my Advanced Shipping plugin. With a custom condition extension script you can setup the condition for the quantity of a certain product -> allowing you to setup a free shipping rate.

Hope that fits your scenario / helps.


Lisa Beavan June 12, 2017 at 1:49 pm

Hi Jeroen,

I have a number of products that are shipped at a flat rate of $5. There are 2 products that are free shipping.

The free shipping no longer applies if it is purchased with a product that has the flat rate of $5.

Are you able to let me know if this will work with your plugin? I’m not sure if it’s late at night here so my brain isn’t working, but my brain isn’t working :))


Jeroen June 12, 2017 at 2:05 pm

Hi Lisa,

I don’t think the Advanced Shipping Packages plugin is what you’d need, it would allow you to split the cart accordingly, but that won’t do any good on its own. Instead the Advanced Shipping would allow you to setup your shipping cost accordingly with $5 flat for some and free shipping for others.


Lucie July 3, 2017 at 11:18 am

Hey Jeroen

I think my issue is similar to Lisa’s. I have a flat rate shipping cost. If spending is over £10.00 there is free shipping.

I have a pre order item I would like to offer free shipping on, but as it is £8.00 it still shows up with the flat rate.

Is there anyway to get this to work with your plugin?

I hope that all makes sense

William September 6, 2017 at 4:54 pm

Hi Jeroen,

I have some products are free-shipping , some are weight-based fee charge. Say if free shipping for order >100 but exclude these already free-shipping items (I set up category not equal to free-shipping category). I tried your plugin yesterday , it works great with weight-based items only but if I add a $90 free-shipping item and $10 weight-based items free-shipping option will still be given which shouldn’t. Is there a way to set up for this situation?


Jeroen September 6, 2017 at 7:16 pm

Hi William,

I believe you can accomplish this using the WAS Advanced Pricing extension, in there you can setup shipping cost based on the shipping class / category, including based on the subtotal of the shipping class. That way you can use shipping classes (free-shipping / paid-shipping, instead of categories) .

Hope that answers your Q 🙂


Lindsey September 14, 2017 at 3:05 am

Hi Jeroen,

I’d like to offer free shipping based on 2 conditions: that it’s ground shipping and that it’s within the US.
I uploaded the Advanced Free Shipping plugin and see how to set it for the US, but there’s no way to tell it to only offer ground shipping as the free option.

Any suggestions?

Thanks in advance!

– Lindsey

Jeroen September 14, 2017 at 7:40 am

Hi Lindsey,

You can name your own shipping rates in the AFS plugin, which would allow you to say ‘Free ground shipping’.


Emily Jones November 2, 2017 at 12:02 pm

Hey Jeroen,

I love the Advanced Free Shipping plugin, it’s my go-to for shipping! However there’s one small thing that bugs me! How do I hide/not display the free shipping option, when products in the basket are not valid for free shipping?

We only offer free shipping on orders over £39. We don’t apply it to “Pacific Lifestyle” or furniture items either.

My website is if you wish to try it out.

I hope it makes sense,

Kind regards,

Jeroen November 2, 2017 at 4:38 pm

Hi Emily,

You’d need to setup the conditions accordingly. E.g. if you don’t want the free shipping option to appear when those products are in the cart, you can exclude the using ‘contains product – not equal – pacific lifestyle’. Same goes for shipping class or category conditions.

If you still want to continue and give free shipping for the partial order that isn’t those products, you want to look into this blog post and probably go with the Split shipping packages solution to fit your requirements.

Hope that helps 🙂

Have a great day!

Jeremy November 22, 2017 at 8:36 am


I’m working on a site where I have two flat rate shipping classes. For the sake of this example let’s assume one category is 9.99 flat rate and the second category is 19.99 flat rate. If the cart contains items from both categories then the max shipping is 19.99. I’ve been able to incorporate this just fine.

However, I want to make the entire order free ship, if an item from category three is added to the cart.

Do you have any suggestions on how to set this up?

Jeroen November 22, 2017 at 10:42 am

Hi Jeremy,

You can setup those kinds of shipping rates/rules with my Advanced Shipping plugin.
Using the conditions you can ensure only the free shipping shows up when Cat 3 in the cart, only 19.99 when Cat 2 is in there (no Cat 3) and only 9.99 when Cat 1 is in there (w/o Cat 2/3)

Hope that helps 🙂

Rogério Machado November 28, 2017 at 6:46 pm

Hello Jeroen

I have a store with 6 products and i want to give free shipping in all orders above 50€ But only on 4 selected products. This can be done? if so, how?

Thank you

Jeroen November 29, 2017 at 9:43 am


If you only want to use the 4 products’ subtotal then this wouldn’t be possible by default. The ‘Subtotal’ condition is based on the cart totals, no of specific products.
In case you do want to do it on the cart totals, then you could do it by using the Advanced Shipping Packages plugin to create a separate package for the 4 products when the total is above $50.


Allie December 12, 2017 at 9:49 pm

Hi Jeroen,

I have set up zones and classes for Free Shipping and Flat Rate as I have some products that will ship free and some that have a shipping cost. it’s working fine except on checkout, the user has the ability to choose between free or flat rate on the flat rate products. How can I fix this? Here’s a link to the staging site.

Jeroen December 13, 2017 at 9:45 am

Hi Allie,

You can exclude shipping rates if you’re using the Advanced Shipping Packages plugin.

Or you can use the Advanced Shipping plugin to ensure only the correct shipping rates shows up. There’s also a setting in there to ‘hide other rates when free is available’.

Or you can use a code snippet to do the last mentioned.

Deb December 13, 2017 at 11:05 pm

Hello Jeroen,
Great plugin – very helpful.
On all my products (books) I utilize weight based ship.
Occasionally we promo a coupon with “$2 off retail price and free ship” .
If a person adds the product + the coupon it allows free ship (by utilizing the condition for the product.)
But if a different person with no coupon adds the product to the cart, I WANT to charge shipping.
How would I do that?

Thanks for your time.

Jeroen December 14, 2017 at 9:08 am

Hi Deb,

I’d recommend to take a look at the Advanced Shipping Packages plugin, it has the option to setup conditions / packages based on the contents of the cart and which coupons are applied.

You can also do it programatically, but I don’t have a code snippet ready to go for that.


Steve DeFrancesco January 11, 2018 at 5:12 pm

Hi Jeroen,

I believe I’m asking the same thing that a few others have asked, but I’m still not following it. I’m using Table Rate Shipping and the Advanced Shipping plugin to calculate shipping costs for different types of items that I sell. For simplicity, let’s say of have Product X and Product Y. I offer free shipping when at least $100 of Product X is purchased, or free shipping when $150 of Product Y is purchased on their own. This works fine in the current setup. I also offer free shipping when at least $100 of Product X is purchased AND any quantity of Product Y is in the cart. This is where I’m having a problem since the Advanced Shipping plugin is looking at the cart subtotal and not the product category subtotal. As an example, if the cart contains $100 worth of Product X AND Product Y, it’s showing a shipping amount (which is correct) and then another line item for free shipping (which should not be an option). Is there a way to create rules based on product category subtotal? Thanks

Demi January 26, 2018 at 2:19 pm

I’m trying to find a solution to applying free shipping for certain products, only available to users with a specific role. Is there any way to overcome this?

Jeroen January 26, 2018 at 3:29 pm

Hi Demi,

You can overcome this with the technique described in this post; using shipping packages (plugin) to have separate packages for the paid and free shipping products.


Sarah RKcom February 12, 2018 at 1:42 pm

Hello ! Question?… I’m using woocommerce! Love it. Confused on how to setup flate shipping per product BUT when you purchase a certain product its FREE shipping.. Make sense? Thanks for any advice you may have on this.

Jeroen February 12, 2018 at 9:55 pm

Hi Sarah,

Using the Advanced Shipping and WAS Advanced Pricing extension you can setup shipping cost per product, and not apply any shipping cost for the products you’d like to ship for free.


ML Emerson March 19, 2018 at 12:22 am

Our problem is not addressed at all in the above! We want to offer coupon for 15% discount, and Free Shipping, on specific products for a company’s Employee Discount Program. Those same products are also being sold to general public with no coupon. I can add the 15% discount coupon easily by assigning the products they can get the discount on. But..when I try to add Free shipping, it shows Free Shipping, and gets confused if the cart has products with no coupon and are charged shipping. Need a plugin with cart that can have a product with a coupon and free shipping, and also in same cart products charged shipping–calculation to work and customer to not be confused. Using wooc. and it seems not to clear the shipping cost variable. Don’t want to give Free shipping across the board.

Jeroen Sormani March 19, 2018 at 9:39 am

You can use the Advanced Shipping Packages plugin to split the cart into two packages, one for the free shipping and the other for the paid shipping.
You can exclude the free shipping option from the paid shipping package using the plugin’s functionality.


Sérgio March 30, 2018 at 12:37 pm


I added the shipping class to 5 products, I want to allow free shipping if a user only buys at least 2 of those products on that shipping class but it seems to be impossible.

I set the quantity to two and “contains shopping class”, but if a user ads one with that shipping class and other without it, it allows free shipping.

Daniel Borge June 8, 2018 at 1:25 am

Hi there Jeroen and greetings from Norway!

I was wondering if there was a way to give free shipping to the entire order if, let’s say, 4 or more of a specific category is in the cart. Even if the cart contains items of a different catergory.


Jeroen Sormani June 8, 2018 at 10:16 am

Hi Daniel,

It is possible to setup free shipping like that, but it is a bit harder then a regular free shipping option. My best advise is to create a custom condition for the Advanced Shipping plugin to check for the quantity of the category that is present in the cart.

– Jeroen

Uriel November 1, 2018 at 7:13 pm

Hi! Thanks for your script, I’m using Woodmart theme and I’d like to show message in the mini-cart widget, I tried to set it in this line:

if ( ! is_cart() && ! is_checkout() && ! is_mini-cart() )

but it gets error, can you help me?

Jeroen Sormani November 5, 2018 at 12:11 pm

Hi Uriel,

Thats a peace of invalid code – if you’re not experienced with coding I’d recommend having your developer assist you with this. Customizing code without experience can be real time consuming and break your site.


Skip Walker November 3, 2018 at 6:41 am


I am new to WordPress and Woo, so forgive the lack of knowledge. We are moving our site to woo soon. We ship books in the US only.

We charge a flat rate for shipping up to a set number of books – regardless of type. All the same, a mixed selection, etc. As long as the total is under the threshold. Over the threshold, shipping is free.

Can your plugin handle that logic? I’d assume yes, but wanted to check to make sure.

Jeroen Sormani November 5, 2018 at 12:10 pm

Yes, this is possible 🙂

Brenda November 5, 2018 at 6:09 am

THANK YOU for this plugin! Super helpful.

Jason November 17, 2018 at 7:48 pm


Is there a way to set the free shipping option as the default setting while still showing the other shipping options? Sometimes people qualify for free shipping, but want to upgrade to Express shipping. Other times people forget to click on the free shipping.



Marc C. November 24, 2018 at 6:53 am

Hi Jeroen,
Thank you for your plugins and guidance. I have a WordPress site that is using the Woocommerce storefront and currently all my products are set to ship via USPS Priority Mail based on their package dimensions and package weight. I need to add a new product that needs to ship for free and in a separate package. So far, I have not been able to do this and have only been able to add a free shipping option that allows the customer to select free shipping for their entire order and not just the single product which does qualify for free shipping.

Do you have the plugins that would allow a customer to purchase some of my regular products and pay the shipping on those while also order the free shipping product on the same order and allow that to ship for free, in an automated way?

Thank you, sir.

Jeroen Sormani November 24, 2018 at 10:57 am

Hi Marc,

Thats exactly one of the most common use cases of the plugin 🙂


Nadia November 26, 2018 at 3:24 am

Hi, I have set up a package- how do I now apply this so that it gets considered in an order. I am using advanced shipping etc. Your posts explain how to set it up- but then how does it get applied in the cart?

Michele December 5, 2018 at 11:05 am

Hello! I have the following situations:

1) Minimum free delivery cost is 300 euro;
2) I have products which for 2 pieces from the same product I offer a discount and for 3 pieces for the same product I offer a bigger discount, but if the amount of these pieces do not match with minimum 300 euro order, I charge delivery taxes;
3) The exception: I have products for whice one I offer for 2 pieces from the same product a discount and free delivery as well, even if total amount in basket it is under 300 euro (minimum amount for free delivery).

How could I fix this? So, I do need to apply discount for 2 or 3 pieces from the same product and in the same time to apply delivery rules for under 300 euro total amount and for those which I offer only discount (not free delivery) to be applied the global rule for free delivery when the customer match the minimum amount of 300 euro!

Ross Turner March 4, 2019 at 6:47 pm

Hi there,

Firstly, great plugin thank you!

I use flat rate shipping based on postcode. What I want to achieve is that is someone spends over 24.00 on category A they receive free shipping. I have set this up and it works.

However if in the order the customer has 3 products from category A, totalling £30 and 1 product from Category B, totalling £5 pounds – free shipping is not added.

I currently have my conditions set to subtotal over or equal to 24.00 and category equals to A.

Is there a fix? Your help is greatly appreciated.

Kind regards,
Ross Turner

Jeroen Sormani March 5, 2019 at 9:50 am

Hi Ross,

For support questions about my Advanced Shipping plugin, please reach out through


Stephane April 19, 2019 at 11:33 am


I’m trying to do this with your plugin:

For shipping class “A” I want free shipping when subtotal is greater than 60.
For shipping class “B” shipping is free.
But, when customers want the two kinds of products, shipping class “B” make the shipping free because the subtotal is greater than 60, but the subtotal for shipping class “A” is under 60. So, shipping should not be free.

Can you help?

Jeroen Sormani April 20, 2019 at 9:40 am

Hi Stephane,

The ‘Subtotal’ condition is always based on the cart amount, not of individual packages as explained here. I’d recommend creating a custom condition that’ll fit your needs for this for the Advanced Shipping plugin.


vahid May 1, 2019 at 4:54 am

I have free shipping products and paid shipping products in my website. paid shipping products are configured as per weight based shipping as am selling some heavy items. So i need the following scenarios to be configured.
1. Free shipping method should be applied when only free shipping products available in cart,
2. Weight based shipping method should be applied when a customer add any other products along with free shipping products.

Hope my idea is clear to you. Any help would be apreicated

Jeroen Sormani May 1, 2019 at 9:46 am

Hi Vahid,

You can set this up with my Advanced Shipping plugin 🙂

Mikkel November 12, 2020 at 6:11 pm

Hi Jeroen.

I am looking for a solution that can fulfil a need we have to have one shipping class overrule another.

At the moment:
– We have two products which ship for free. They have the shipping class “Free Partner Shipping”. All other products have no shipping class and there is a flat fee for all these products.
– If a customer includes a product within the shipping class “Free Partner Shipping” and also a product with no shipping class, the flat fee is applied.

What we want to achieve:
– If a customer includes a product within the shipping class “Free Partner Shipping” and also a product with no shipping class, the “Free Partner Shipping” will overrule the flat fee from no shipping class and the customer will have free shipping on the entire order.

Hope it makes sense and that you can help 🙂

Jeroen Sormani November 12, 2020 at 7:25 pm

hi Mikkel,

You can create a conditional free shipping rate like this with the Advanced Free Shipping plugin.


Mikkel November 13, 2020 at 7:26 pm

Hi again Jeroen.

It has no updates since 2017. How can we make sure it’s not going to disturb other plugins or similar?

Do you offer either full support or a money back guarantee?

Sean December 9, 2020 at 10:06 pm

I am unsure if free shipping is automatically applied if I use this plugin. It might be good to also give notice that they have qualified with a popup, but mainly I just want it to be applied to the total of the cart and be applied automatically. Is this the case with this plugin?


Jeroen Sormani February 15, 2021 at 10:33 am

No popup or anything, but it will be automatically available at the checkout when the conditions have matched.

Natalie February 15, 2021 at 9:26 am

Hi good day, I have different free shipping rules for different shipping zones.
May I know how to I add in a series of zipcodes into AFS? currently zipcode can only be added one by one.

Thank you

Jeroen Sormani February 15, 2021 at 10:32 am

Hi Natalie,

Try using a comma separated list of zipcodes.


Leave a Reply