Skip to content
Examples

How to stack product and collection discounts on Shopify

Two product-class discounts can both apply to one cart as long as they land on different cart lines. This recipe runs a 15% volume tier on Skincare and a flat 10% off Accessories, with both offers opted into combining, so a mixed cart gets both.

  • Volume
What the shopper sees

A shopper with three skincare products and a tote sees two separate savings lines in the cart, one for each collection, and the same total carries into checkout and accelerated checkout. Nothing is silently dropped and there is no code to enter.

Lumiere$146.00
  • Radiance Vitamin C Serum

    50ml / Qty 1

    $42.00
  • Hydra-Dew Moisturizer

    Qty 1

    $34.00
  • Gentle Foaming Cleanser

    Qty 1

    $18.00
  • Woven Straw Tote

    Qty 1

    $52.00
Skincare volume tier - 3+ items - 15% off-$14.10
Accessories - 10% off-$5.20
Total at checkout-$19.30$146.00$126.70
One cart, two product-class discounts. Each applies to its own line, so both survive to checkout.
Build it

How to set this up

  1. 1

    Campaigns > New campaign

    Create one campaign to hold both offers so they share a schedule and can be paused together. Name it for the sale, not the mechanic.

  2. 2

    Offer 1 > Offer type

    Pick Volume for the Skincare tier, since the reward depends on how many units are in the cart.

    type = volume

  3. 3

    Offer 1 > Target

    Target the Skincare collection. Collection targeting follows the collection, so new products inherit the offer automatically.

    target.scope = collections

  4. 4

    Offer 1 > Tiers

    Add one tier at 3 units for 15% off. Leave counting at per product so three different skincare products count as three.

    tiers[0] = minQty 3, percentage 15

  5. 5

    Offer 1 > Stacking

    Turn on combining with other product discounts. This is the switch that stops checkout from keeping one discount and dropping the other.

    stacking.combinesWithProductDiscounts = true

  6. 6

    Offer 2 > Offer type and target

    Add a second offer in the same campaign, targeting the Accessories collection at a flat 10% off with no quantity condition.

    target.scope = collections

  7. 7

    Offer 2 > Stacking

    Turn on the same combine switch here. Combining is decided per offer, so setting it on only one of the two is the most common reason this recipe fails.

    stacking.combinesWithProductDiscounts = true

  8. 8

    Preview

    Build a cart with items from both collections and confirm two separate savings lines appear and the total matches. Then publish.

The exact settings

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.

SettingValueConfig key
Offer 1 typevolumetype
Offer 1 targetcollections: Skincaretarget.scope
Offer 1 tierminQty 3 -> 15%tiers[0].rewardType
Offer 2 typevolumetype
Offer 2 targetcollections: Accessoriestarget.scope
Offer 2 tierminQty 1 -> 10%tiers[0].rewardType
Combine with product discountstrue on BOTH offersstacking.combinesWithProductDiscounts
Discount classproductdiscountClasses
Countingper_productcounting
MethodautomaticdiscountMethod
Same-line stackingoff (Shopify Plus only)stacking.sameLineProductTags
Without an app

What Shopify does natively

What you can do

Shopify can create both discounts natively, and the admin exposes a combinations setting on each one. If the two discounts genuinely never touch the same product, native automatic discounts can cover this case without an app.

Where you need an app

Native discounts cannot express a quantity tier on a collection, so the 3+ for 15% half has to be rebuilt as separate fixed discounts per quantity, and each one you add eats into the limit on how many discounts can be active at once. There is also no way to preview a mixed cart before publishing.

Before you publish

Watch out for

  • Two product-class discounts cannot both apply to the SAME cart line outside Shopify Plus. If a product sits in both Skincare and Accessories, that line gets one discount, not two. Keep the collections disjoint, or accept the single discount on the overlap.
  • The combine switch is per offer. Turning it on for one offer and leaving it off on the other produces the exact symptom this recipe is meant to fix, and checkout gives no warning.
  • Shopify limits how many discounts can be active with overlapping schedules. Splitting one campaign into many single-quantity discounts is the fastest way to hit that ceiling.
  • Collection targeting is evaluated at checkout, not at publish time, so a product added to Skincare tomorrow starts qualifying tomorrow. That is usually what you want, but it means the offer scope is not frozen when you hit publish.

Common questions

Why does Shopify apply only one of my two discounts?
Because combining is opt-in per discount. Unless a discount is explicitly set to combine with the other class, checkout keeps one and drops the other silently. Both offers in this recipe set combinesWithProductDiscounts to true.
Can I stack two product discounts on the same item?
Only on Shopify Plus, and only through tag-gated same-line combination. On every other plan a cart line takes one product discount. This recipe works because the two offers land on different lines.
Do I need a discount code for this?
No. Both offers are automatic, so the savings appear as soon as the cart qualifies. You can switch either offer to a code if you want it gated.
What happens if the shopper only buys accessories?
Only the 10% Accessories offer applies. Each offer is evaluated independently against the cart, so a partially qualifying cart gets the part it qualifies for.

Related examples

Discount plus free gift

An order discount and a free gift on the same threshold, both applying to one cart.

Staying under the discount cap

How the active-discount cap is counted, and how to model a big sale so you never hit it.

Tiered volume discount

Bigger percentage as unit count rises, with control over how mixed variants are counted.

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.

We use essential cookies to run this site, and, only with your permission, analytics cookies to understand traffic. Read our Cookie Policy.