Free shipping is one of the easiest ways to push a customer from a one-time purchase to a subscription. It is also one of the settings that goes wrong most often, because a subscription is not a normal order. The first payment happens at checkout, and then every renewal is charged later by WooCommerce on its own schedule.
This guide shows four ways to offer free shipping on WooCommerce Subscriptions: the built-in Free Shipping method, a free shipping coupon, the “One time shipping” product option, and a short PHP snippet for stores that need more control. It also covers what to do about subscriptions that already exist.
Quick answer: for most stores, add a Free Shipping method to your shipping zone and set a minimum order amount. If you want free shipping only for people who sign up for a subscription, use the PHP snippet in Method 4. Whichever you pick, test a renewal before you go live.
Why free shipping is different for subscriptions
WooCommerce Subscriptions treats a subscription as an extension of an order. According to the official data structure documentation, a subscription stores its own line items, including shipping, tax, and coupons. Renewal orders are created from that record.
That has two practical effects:
- At checkout, WooCommerce calculates shipping twice: once for the initial order and once for the recurring cart (you see this under “Recurring totals”).
- If you change your shipping rules later, subscriptions that already exist may keep the shipping they were created with.
Everything below assumes you use the official WooCommerce Subscriptions plugin. If you use another subscriptions plugin, the settings screens and the code check in Method 4 will be different.
Method 1: Use the Free Shipping method in a shipping zone
This is the simplest option and needs no code.
- Go to WooCommerce → Settings → Shipping and open the shipping zone that covers your customers.
- Click Add shipping method, choose Free shipping, and save.
- Click Edit on the new method and look at Free shipping requires…. WooCommerce gives you these choices: no requirement, a valid free shipping coupon, a minimum order amount, a minimum order amount or a coupon, and a minimum order amount and a coupon.
- For “free shipping on orders over X”, choose A minimum order amount and enter the amount.
- Save the changes.
If you pick one of the minimum amount options, you also get a checkbox called Apply minimum order rule before coupon discount. When it is unchecked, the amount is checked after coupons are subtracted. When it is checked, the amount before the discount is used. The WooCommerce Free Shipping guide has the full explanation with examples.
Watch out: thresholds and the recurring cart
A minimum amount can behave in a surprising way on subscriptions. A store owner described this in a WooCommerce feature request: the main cart qualified for free shipping because other products pushed it over the threshold, and the recurring section also showed free shipping, even though the subscription product alone was under the threshold. In that case, the customer gets free shipping on every renewal when you may not have intended it.
The fix is to check the Recurring totals block at checkout with a realistic cart (subscription plus other products), not just a cart with a single subscription. If the result is not what you want, use Method 3 or Method 4.
Method 2: Offer free shipping with a coupon
A free shipping coupon works well for launches, email campaigns, and affiliate deals.
- Go to Marketing → Coupons → Add coupon (or WooCommerce → Coupons, depending on your version).
- Enter a coupon code, for example
SUBSHIP. - On the General tab, tick Allow free shipping.
- Set any limits you want, such as an expiry date or usage limit, and publish the coupon.
- Go back to your shipping zone and edit the Free Shipping method. Under Free shipping requires… choose A valid free shipping coupon, or A minimum order amount OR a coupon if you want both routes to work.
Test renewals before you promise anything. A coupon can make the first order ship free, but whether that discount carries into later renewals depends on your Subscriptions version and how the coupon is set up. Do not advertise “free shipping forever” until you have processed a test renewal and confirmed the result (the steps are in the testing section below).
Method 3: Charge shipping once with “One time shipping”
Sometimes you do not want free shipping at all. You want the customer to pay for shipping on the first order only. WooCommerce Subscriptions has a product-level option for this. The plugin’s developer documentation refers to it as the One Time Shipping option, and it is stored as product meta.
- Edit the subscription product.
- In the Product data box, open the Shipping tab.
- Tick One time shipping (the exact wording can differ slightly between versions) and update the product.
With this on, shipping is charged on the initial order and not on each renewal. Combine it with a Free Shipping method if you also want the first delivery to be free.
Method 4: Free shipping for subscription products only (PHP snippet)
The built-in methods apply to the whole cart. If you want free shipping only when the cart contains a subscription product, and normal rates for everything else, you need a small filter. This snippet uses the woocommerce_package_rates filter, which WooCommerce runs whenever it calculates shipping rates for a package.
Add it to a child theme’s functions.php, a small custom plugin, or a snippets plugin:
<?php
/**
* Free shipping when the shipping package contains a subscription product.
* Written for the official WooCommerce Subscriptions plugin.
*/
add_filter( 'woocommerce_package_rates', 'wcn_free_shipping_for_subscriptions', 20, 2 );
function wcn_free_shipping_for_subscriptions( $rates, $package ) {
// Do nothing if WooCommerce Subscriptions is not active.
if ( ! class_exists( 'WC_Subscriptions_Product' ) ) {
return $rates;
}
// Is there at least one subscription product in this package?
$has_subscription = false;
foreach ( $package['contents'] as $item ) {
if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
$has_subscription = true;
break;
}
}
if ( ! $has_subscription ) {
return $rates;
}
// Which shipping methods should become free. Change this list to suit your store.
$free_methods = apply_filters( 'wcn_subscription_free_shipping_methods', array( 'flat_rate' ) );
foreach ( $rates as $rate_id => $rate ) {
if ( in_array( $rate->get_method_id(), $free_methods, true ) ) {
$rate->set_cost( 0 );
$rate->set_taxes( array() );
}
}
return $rates;
}
What the snippet does
- It checks every product in the shipping package. If any item is a subscription, the chosen methods drop to a cost of zero.
- It only touches the methods in the
$free_methodslist. By default that is Flat rate, so a premium express method keeps its price. - It also clears the shipping tax on those rates, so a free rate does not produce a tax line.
- Recurring carts use the same filter, so renewals get the same treatment. Confirm that in the Recurring totals block.
The snippet checks for WC_Subscriptions_Product, which belongs to the official plugin. For another subscriptions plugin, swap in that plugin’s own “is this a subscription product” check.
What about subscriptions that already exist?
Changing a shipping zone, adding a coupon, or switching on the snippet affects new checkouts. Existing subscriptions store their own shipping line, so you may need to update them by hand:
- Open WooCommerce → Subscriptions and edit the subscription.
- In the Items section, edit the shipping line and set the cost to 0, or remove it.
- Save the subscription.
For a large number of subscriptions, ask a developer to script the change, and back up your database first.
How to test it before customers see it
- Use a staging site if you can.
- Add a subscription product to the cart, with and without other products, and watch both Shipping and Recurring totals at checkout.
- Complete a test order with a test payment gateway.
- Open the new subscription in the admin. In the subscription actions box, choose Process renewal. This creates a renewal order immediately.
- Open the renewal order and check the shipping line.
Which method should you use?
| Your goal | Best method |
|---|---|
| Free shipping over a set order value | Method 1 (Free Shipping with a minimum amount) |
| A promotion or campaign offer | Method 2 (free shipping coupon) |
| Customer pays shipping once, on the first order | Method 3 (One time shipping) |
| Free shipping only for subscription products | Method 4 (PHP snippet) |
Troubleshooting
| Problem | What to check |
|---|---|
| Free shipping does not show at checkout | Make sure the customer’s address matches the shipping zone, the method is enabled, and the minimum amount or coupon requirement is actually met. |
| Free on the first order, charged on renewals | Check the Recurring totals block, then the shipping line on the subscription itself. Test with Process renewal. |
| Free on renewals when it should not be | A cart-wide threshold may be qualifying the recurring cart. Use Method 3 or 4 instead. |
| Old subscriptions still charge shipping | Edit the shipping line on each subscription. New rules do not rewrite existing ones. |
| Snippet seems to do nothing | Confirm WooCommerce Subscriptions is active, that the shipping method ID is in your list, and clear any cache. Shipping rates are cached in the session, so empty the cart and start again. |
Keep subscriber shipping and renewals in your CRM
Free shipping is a perk your sales and support team should know about, especially when a renewal fails and a customer writes in. A few ways to connect it to the rest of your store:
- Send subscription and order events to your other tools with our guide on sending WooCommerce order data to a webhook.
- Keep customer and order records in one place by learning how to sync WooCommerce orders with your CRM automatically.
- Tell subscribers when an order ships by following our guide to WooCommerce WhatsApp order notifications.
- Browse more copy-paste code in our free WooCommerce snippets library.
Frequently asked questions
How do I enable free shipping with WooCommerce Subscriptions?
Add the Free Shipping method to your shipping zone, set its requirement (a minimum order amount, a coupon, or both), and test a checkout and a renewal. If you want free shipping only for subscription products, use the snippet in Method 4.
Does free shipping apply to renewal orders?
It depends on how the subscription was created. Renewals are built from the subscription’s stored data, so test with Process renewal and read the shipping line on the renewal order. Do not assume.
Can I give a customer a free shipping coupon for a subscription?
Yes. Create a coupon with Allow free shipping ticked, then set your Free Shipping method to require a valid coupon. Check whether it also applies to renewals in your version before you promote it.
How do I charge shipping only on the first subscription order?
Use the One time shipping option on the subscription product’s Shipping tab. Shipping is charged on the initial order and not on later renewals.
Why is free shipping not showing for my subscription?
The usual causes are a shipping zone that does not match the address, a minimum amount that is not met, a coupon that is not marked Allow free shipping, or a method that is disabled. Work through the troubleshooting table above.
Will this work with other subscription plugins?
Methods 1 and 2 use core WooCommerce shipping, so they work with any plugin that follows normal shipping rules. Method 3 is specific to WooCommerce Subscriptions, and Method 4 needs a different subscription check for other plugins.
Wrap-up
Free shipping on subscriptions comes down to two checks: what the customer sees at checkout, and what the renewal order contains weeks later. Pick the method that matches your offer, test one renewal, and fix any existing subscriptions by hand. If you want the order and subscription data to flow into your CRM at the same time, take a look at our WooCommerce CRM connectors and the Hook and Filters WooCommerce Bundle.