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
  • 26 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 😉

    Cheers,
    Jeroen

    Chris Bakker March 23, 2016 at 3:33 pm

    Hey,

    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.

    Jeroen

    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.

    Cheers,
    Jeroen

    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

    Hi,

    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.

    Cheers,
    Jeroen

    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 :))

    Thanks
    Lisa

    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.

    Cheers,
    Jeroen

    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?

    Thanks.

    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 🙂

    Cheers,
    Jeroen

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

    Cheers,
    Jeroen

    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 http://www.lightingrus.co.uk if you wish to try it out.

    I hope it makes sense,

    Kind regards,
    Emily.

    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!
    Jeroen

    Jeremy November 22, 2017 at 8:36 am

    Jeroen,

    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 🙂
    Jeroen

    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

    Hi,

    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.

    Regards,
    Jeroen

    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.
    Deb

    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.

    Regards,
    Jeroen

    Leave a Reply