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
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.
- Spend $75$10 off the orderoffer 1, fixed
- Spend $15015% off the orderoffer 1, percentage
- Spend $250Free eyeshadow paletteoffer 2, free_gift
- $140.00
Leather Chelsea Boot
US 9 / Qty 1
- $78.00
Wrap Midi Dress
M / Qty 1
- $64.00
Ribbed Knit Cardigan
M / Qty 1
How to set this up
- 1
Campaigns > New campaign
One campaign holds both offers, so the whole ladder shares a schedule and pauses in one place.
- 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
Offer 1 > Tier 1
Threshold $75 with an Amount off reward of $10.
tiers[0].rewardType = fixed
- 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
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
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
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
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.
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 1 type | spend_goal, order class | type |
| Offer 1 tier 1 | minSpend 7500 -> fixed 1000 | tiers[0].rewardType |
| Offer 1 tier 2 | minSpend 15000 -> percentage 15 | tiers[1].rewardType |
| Spend ladder reward types | fixed and percentage only | tiers[n].rewardType |
| Offer 2 type | free_gift, product class | type |
| Offer 2 tier | minSpend 25000 -> free_item | tiers[0].rewardType |
| Gift candidates | primary plus backup, first in stock wins | freeGift.giftVariantIds |
| Combine (spend goal) | with product discounts: true | stacking.combinesWithProductDiscounts |
| Combine (free gift) | with order discounts: true | stacking.combinesWithOrderDiscounts |
| Award rule, within an offer | highest satisfied tier only | tiers |
| Award rule, across offers | both pay out when both qualify | stacking |
| Tier labels | optional, display only | tiers[n].label |
| Slots used | 2 against the active-discount cap | discountMethod |
What Shopify does natively
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.
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.
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
Three spend thresholds, each unlocking a bigger percentage off the order.
A percentage, free shipping, and a gift all unlocking at the same spend threshold.
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.