Skip to content
Examples

How to give a different reward at each discount tier on Shopify

Reward type is chosen per tier, so one spend ladder can pay $10 off at the first rung and a percentage at the second. A rung that pays in product is a different discount class, so it becomes a second offer in the same campaign, and that changes whether the rungs replace each other or add up.

  • Spend goal
  • Free gift
What the shopper sees

The cart names the reward in its own terms: a dollar amount at the first rung, a percentage at the second. At $250 the palette arrives on top of the percentage rather than replacing it, because it comes from a different offer. Escalating between shapes reads as a bigger jump than escalating a single percentage.

Escalating rewardsInside an offer the highest rung wins
  • Spend $75$10 off the orderoffer 1, fixed
  • Spend $15015% off the orderoffer 1, percentage
  • Spend $250Free eyeshadow paletteoffer 2, free_gift
Two money rungs in one offer, and a product rung that has to be its own.
Lumiere$282.00
  • Leather Chelsea Boot

    US 9 / Qty 1

    $140.00
  • Wrap Midi Dress

    M / Qty 1

    $78.00
  • Ribbed Knit Cardigan

    M / Qty 1

    $64.00
Spend goal - 15% off over $150-$42.30
Free gift - Sunset eyeshadow paletteFREE
Total at checkout-$42.30$282.00$239.70
At $282 both offers pay out: the top money rung and the gift. Rungs inside one offer replace each other, separate offers do not.
Build it

How to set this up

  1. 1

    Campaigns > New campaign

    One campaign holds both offers, so the whole ladder shares a schedule and pauses in one place.

  2. 2

    Offer 1 > Offer type

    Pick Spend goal. This offer carries every rung that pays in money, and it is order class.

    type = spend_goal

  3. 3

    Offer 1 > Tier 1

    Threshold $75 with an Amount off reward of $10.

    tiers[0].rewardType = fixed

  4. 4

    Offer 1 > Tier 2

    Threshold $150 with a Percent off reward of 15. Amount off and Percent off are the only two reward types a spend ladder offers, because a set price and a free item are both defined by a unit count rather than by spend.

    tiers[1].rewardType = percentage

  5. 5

    Offer 2 > Offer type

    Add a second offer and pick Free gift. This is the $250 rung. It is product class, and it is where the gift itself is named, which is why it cannot live on the spend goal.

    type = free_gift

  6. 6

    Offer 2 > Tier and gift

    One tier at $250, then choose the palette as the gift and add a backup in case it sells out.

    freeGift.giftVariantIds = [palette, backup]

  7. 7

    Both offers > Stacking

    On the spend goal turn on combining with product discounts, and on the free gift turn on combining with order discounts. Without both switches the $250 cart gets one reward instead of two.

    stacking.combinesWithProductDiscounts = true

  8. 8

    Preview

    Simulate at $80, $160, and $260. Confirm the money rung changes shape at $150 and that the $260 cart carries the percentage and the gift together, 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 typespend_goal, order classtype
Offer 1 tier 1minSpend 7500 -> fixed 1000tiers[0].rewardType
Offer 1 tier 2minSpend 15000 -> percentage 15tiers[1].rewardType
Spend ladder reward typesfixed and percentage onlytiers[n].rewardType
Offer 2 typefree_gift, product classtype
Offer 2 tierminSpend 25000 -> free_itemtiers[0].rewardType
Gift candidatesprimary plus backup, first in stock winsfreeGift.giftVariantIds
Combine (spend goal)with product discounts: truestacking.combinesWithProductDiscounts
Combine (free gift)with order discounts: truestacking.combinesWithOrderDiscounts
Award rule, within an offerhighest satisfied tier onlytiers
Award rule, across offersboth pay out when both qualifystacking
Tier labelsoptional, display onlytiers[n].label
Slots used2 against the active-discount capdiscountMethod
Without an app

What Shopify does natively

What you can do

Each individual rung can be built as its own native discount with a minimum purchase amount, and the native combinations settings let a product discount and an order discount coexist.

Where you need an app

Native discounts have no concept of a ladder, so three separate minimum-spend discounts all fire on a large cart rather than the money rungs replacing one another. Getting escalation out of them means editing thresholds by hand every time the sale changes.

Before you publish

Watch out for

  • If the gift arrives in the cart but is NOT free, the two offers are not combining. Open the Free gift offer and turn on "Combine with order discounts". Without it Shopify keeps whichever discount is worth more, the order percentage usually wins, and nothing is left to zero the gift, so the shopper is charged full price for a product your storefront told them they had unlocked.
  • Inside one offer the rungs replace each other: a $200 cart gets the 15%, not the 15% plus the $10. Across offers they accumulate, which is why the $250 cart gets the percentage and the gift together.
  • A spend ladder cannot pay out in product. A free item reward is only valid on a Free gift or Buy X Get Y offer, and the gift itself is named on the Free gift offer, so the product rung has to be its own offer.
  • This uses two slots against the active-discount ceiling rather than one. Ladders that change reward class are cheap in effort and not free against the cap.
  • Amount-off and percentage rewards of zero are rejected. If you want a rung worth nothing yet, leave it out rather than setting it to zero.

Common questions

Can one offer mix percentages and dollar amounts?
Yes. Reward type is a per-tier setting, so one spend ladder can pay an amount off at one rung and a percentage at the next.
Can the top tier of a spend goal be a free product?
Not on the spend goal itself. A free item reward is only valid on a Free gift or Buy X Get Y offer, so the product rung is a second offer in the same campaign, gated at the same threshold.
Do the rewards add up across tiers?
Within one offer, no: the cart receives the single highest tier it qualifies for. Across two offers, yes: each is evaluated on its own, so a cart over $250 receives the percentage and the gift.
Shopify allows one discount to span classes. Why does this take two offers?
Because the one-offer version would behave worse, not because the platform forbids it. Inside a single offer only the highest tier pays out, so a product rung at $250 would REPLACE the 15% rung rather than add to it: the shopper would lose their percentage at the exact moment they spent the most. Splitting the product rung into its own offer is what lets a $282 cart keep the 15% and receive the gift. We would rather the default be the outcome merchants actually mean.
Why not build every rung as its own offer?
Because then they all fire at once on a large cart instead of escalating, and each one consumes a slot against the active-discount limit. Keep everything that pays in the same class inside one offer, and split only when the class changes.

Related examples

Spend more, save more

Three spend thresholds, each unlocking a bigger percentage off the order.

Multiple perks on one threshold

A percentage, free shipping, and a gift all unlocking at the same spend threshold.

Tiered free gift with purchase

A different gift at each spend threshold, with the highest qualifying gift awarded.

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.