How to give free shipping to specific customers on Shopify
A shipping offer can be limited to customers carrying a tag such as vip. The offer is evaluated against the signed-in customer, so it deliberately does nothing for a logged-out cart rather than leaking to everyone.
- Free shipping
- Offer type
- free_shipping
- Reward
- 100% off shipping
- Who gets this offer
- Customers with tags
- Tags
- vip
- Logged-out carts
- offer does not apply
A signed-in customer carrying the vip tag sees shipping at zero. Everyone else sees normal rates, and no message hints that a hidden discount exists.
How to set this up
- 1
Campaign > Offer type
Pick Free shipping.
type = free_shipping
- 2
Who gets this offer
Switch the audience from everyone to customers with tags, then add the tag.
customerTarget.scope = tags
- 3
Tags
Enter the tag exactly as it appears on the customer record. If you currently use a customer segment, convert it to a tag first, because segments cannot be read at discount time.
customerTarget.ids = ["vip"]
- 4
Stacking
Opt into combining with product and order discounts so the VIP shipping survives alongside a public sale.
stacking.combinesWithShippingDiscounts = not applicable, shipping never combines with shipping
- 5
Preview
Test signed in as a tagged customer, as an untagged customer, and signed out. The signed-out case must show no discount, which is the intended behaviour.
Every setting, spelled out
These are the real configuration keys the offer is saved with, so you can check your own setup against this table field by field.
| Setting | Value | Config key |
|---|---|---|
| Offer type | free_shipping | type |
| Audience scope | tags | customerTarget.scope |
| Tags | exact match, comma separated | customerTarget.ids |
| Logged-out behaviour | offer emits nothing (fail closed) | customerTarget.scope |
| Discount class | shipping | discountClasses |
| Method | automatic | discountMethod |
See it built end to end
The episode is not up yet
We are recording this one. The written recipe above is complete, so you can build it today.
What Shopify does natively
A native discount can be limited to specific customers or to a customer segment, so a manually maintained VIP list is possible without an app.
Native customer targeting is set on the discount node, which does not give you tag matching evaluated at checkout time, and it cannot be combined with the per-offer stacking controls this recipe relies on.
Watch out for
- A logged-out cart gets nothing. This is deliberate: a targeted offer must never leak to anonymous shoppers. It also means your own signed-out test will look like a bug.
- Customer segments cannot be read at discount time, so a segment has to be converted to a tag first.
- Tags match exactly. A trailing space or a capital letter difference means the customer does not qualify.
- An audience of tags with no tags entered is rejected at save time, because the offer could never apply to anyone.
Common questions
- Why does the discount not apply when I test it?
- Almost always because the test cart is signed out. A tag-targeted offer is evaluated against the signed-in customer and emits nothing when there is no identity.
- Can I target a customer segment instead of a tag?
- No. Segments are not queryable inside the discount function, so the supported route is to convert the segment into a customer tag.
- Are tags case sensitive?
- Match the tag exactly as it appears on the customer record.
- Can I target several tags?
- Yes. A customer carrying any of the listed tags qualifies.
Related examples
A standing discount for tagged customers only, with no code that can leak.
Wholesale pricing scoped to specific B2B companies rather than to individual customers.
Free shipping once the cart passes a threshold, with a progress nudge in the cart.
Build this in your own store
Every recipe in this library runs on the same server-side engine, so the cart total and the checkout total agree.