Skip to main content

Rewards & redemption

How to use it

Let customers turn points into real discounts:

  1. Set your redeem rate — how many points equal $1 off. (Loyalty → Setup → Redemption)
  2. Build a reward catalogue — e.g. "500 pts = free shipping", "1,000 pts = free gift". (Loyalty → Rewards)
  3. Turn on margin guardrails — a max discount % and a minimum order. (Loyalty → Setup → Guardrails)
  4. Expose redemption in the storefront widget so customers redeem in one click. (Theme editor)

⏱ ~15 min · 💳 Starter+ · 🎯 Every redemption mints a real Shopify code

Two ways to redeem

Points → discountReward catalogue
What the customer spendsAny amount of pointsA fixed points cost you set
What they getA code worth points ÷ redeem-rateThe reward you defined (amount / % / free shipping / free gift)
Best for"Spend my balance" flexibilityCurated, memorable rewards ("500 pts = free shipping")

Points → discount

The customer chooses how many points to burn; the system mints a fixed-amount Shopify code worth points ÷ redeem_rate. With the default rate, 500 points → a code worth 5 units of currency.

Reward catalogue

Define rewards where the points cost and the value are decoupled — e.g. 500 points for free shipping, or 1,000 points for a free gift product. Reward types:

TypeWhat the code does
amountFixed currency amount off
percentagePercentage off (self-capping)
free_shippingFree shipping
free_giftA 100%-off code for a specific gift product

Redemption is safe by design

Customers never lose points to a glitch — a redemption only completes if the discount code is actually created, and a network retry can't mint a second code or double-charge points. It's all built in; there's nothing for you to configure. Order of operations is deliberate, because minting is an external call that can fail:

The safety mechanics (for the curious)
  • Mint before debit — if Shopify can't mint the code, the customer's points are never touched.
  • Roll back on debit failure — if the ledger write fails after minting, the code is voided, so you never issue a live code without a corresponding debit.
  • Idempotency key — pass a key and a retried/duplicated request returns the first result (same code, same balance) instead of minting a second discount and double-debiting. A database uniqueness rule is the backstop for the concurrent case.

This is what makes redemption safe to expose on a storefront where network retries and double-taps are the norm.

Margin guardrails (enforced at checkout)

Two optional guardrails protect contribution margin. Both are off by default, so redemption behaves exactly as before until you opt in.

GuardrailEffectExample
Max redemption %A fixed-amount code can't exceed this share of the orderA $6 code at 30% requires an order ≥ $20
Minimum purchaseA floor subtotal to use any loyalty code"Loyalty codes need a $25+ cart"

The key detail: these are stamped onto the minted code as a Shopify minimumRequirement. That means Shopify's own checkout enforces them — they are not a client-side check that can be worked around. A percentage or free-shipping reward is self-capping, so the max-% cap only applies to fixed-amount redemptions; the minimum-purchase floor applies to all of them.

Set guardrails before you promote redemption

Without a floor, a "$10 reward" can be used on an $11 order — a 91% discount on that sale. Turn on max-% (a good starting point is 30%) and a sensible minimum before you push customers to redeem.

Points as a liability

Outstanding points are a real financial obligation. Their monetary value — points ÷ redeem_rate — is computed from the single source of truth for the redeem rate, so the liability figure on your Revenue Hub can't drift from the "100 points = $1" disclosure customers see. Points expiry (see Earning points) is what keeps this liability bounded.

Best practices

Lead with the catalogue, not raw redemption. "500 points = free shipping" is more memorable and easier to cost than an open-ended points-to-cash slider.

Always pass an idempotency key when redemption is triggered from the storefront — it's the difference between one code and three on a flaky connection.

Use free_gift rewards to move specific inventory — a slow-moving SKU as a reward costs you COGS, not margin on a hero product.

Don't offer high fixed-amount rewards without a max-% cap — that's the single biggest way loyalty erodes margin.