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’ (WAFS will support shipping packages soon) plugin to setup free shipping for the package that contains the products you want to ship for free.

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
  • 16 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’.


    Leave a Reply