Loyalty & rewards
The building blocks
Purchases × tier multiplier, plus campaigns, milestones, purchase-threshold and action bonuses.
Bronze → platinum with perks synced to Shopify, VIP nudges, and a paid membership club.
Points → real discount codes, a reward catalogue, and margin guardrails at checkout.
Dual-sided refer-a-friend — the friend gets a discount, the referrer earns points.
Daily check-in streaks (liability-capped), birthday bonuses, verified-review rewards.
The storefront widget and the Customer Account extension your shoppers actually use.
How to use it
Launch a rewards programme customers can see and spend — no code required:
- Set your earn rate & rewards. Points earned per $1, what points are worth, and your reward catalogue. (Loyalty → Setup)
- Choose tiers & perks. Rename tiers, set thresholds, pick perks like free shipping. (Loyalty → Tiers)
- Add the storefront widget. Drop the loyalty block into your theme so shoppers see their balance and rewards. (Theme editor → Add block)
- Switch on the extras you want. Referrals, daily check-in, birthday bonuses. (Loyalty → Settings)
- Announce it. Send a launch email or WhatsApp so customers start earning.
⏱ ~20 min to launch · 💳 Starter+ (check-in Pro+) · 🎯 First points earned same day
Why this matters for your business
Repeat customers are the cheapest revenue you have — no ad spend, higher AOV, better margins. But most loyalty apps are bolt-ons: points that don't connect to anything, a separate liability spreadsheet, discounts that blow your margin because there's no floor on redemption. This programme is built into the platform: it reads the same Customer 360 every other engine reads, its liability is a real accounting figure on your Revenue Hub, and every redemption is a native Shopify discount your checkout already understands.
How it works
Under the hood — the points ledger
The ledger is the source of truth. Every event — earn, redeem, expire, bonus, adjustment — is a row with a before/after balance, so a customer's balance is always reconstructable and auditable. Lifetime points (never decremented) drive the tier; the redeemable balance drives redemptions.
What earning looks like (defaults)
| Event | Default reward |
|---|---|
| Every 1 unit of store currency spent | 10 points × your tier multiplier |
| Account sign-up | 200 points |
| Verified product review | 50 points |
| Birthday (annual) | 500 points |
| Friend's first order (referral) | 100 points to the referrer |
| Daily check-in | 5 points/day + streak bonuses (Pro+) |
Every value above is a default — a store that hasn't touched the config behaves exactly like this, and each number is editable per store. Points are worth 1 unit of currency per 100 points when redeemed, and expire after 12 months by default (set to 0 for never).
The tier ladder (defaults)
| Tier | Lifetime points | Earn multiplier | Perks |
|---|---|---|---|
| Bronze | 0 | 1.0× | — |
| Silver | 500 | 1.5× | Early access to sales |
| Gold | 2,000 | 2.0× | Free shipping · early access |
| Platinum | 5,000 | 3.0× | Free shipping · early access · birthday gift · priority support |
Tier is lifetime-based, so redeeming points never demotes a customer. When
someone crosses a threshold, their tier is mirrored to the Shopify customer
metafield loyalty.tier — a theme block or a Shopify Function reads that to
grant free shipping or early access. See Tiers & VIP.
Guardrails that protect your margin
Two optional guardrails, off by default so nothing changes until you opt in:
- Max redemption % — cap a fixed-amount redemption at a share of the order. A $6 code at 30% requires an order of at least $20, so the discount can never exceed 30% of the cart.
- Minimum purchase — a floor subtotal required to use any loyalty code.
Both are enforced natively — they're stamped as a minimumRequirement on the
minted Shopify code, so Shopify's checkout enforces them and they can't be
bypassed client-side. Details in Rewards & redemption.
Programme status
A programme is active, paused, or draft:
| Status | New earning | Existing balances | Redemption |
|---|---|---|---|
| Active | ✓ | ✓ | ✓ |
| Paused / draft | ✗ (stops accruing) | untouched | ✓ still allowed |
Pausing never claws back points a customer already earned — it only stops new accrual. Customers can still redeem what they have.
Plan tiers
| Capability | Free | Starter | Pro | Agency | Enterprise |
|---|---|---|---|---|---|
| Points ledger + purchase earning | — | ✓ | ✓ | ✓ | ✓ |
| Tiers + Shopify metafield sync | — | ✓ | ✓ | ✓ | ✓ |
| Reward catalogue + redemption | — | ✓ | ✓ | ✓ | ✓ |
| Referrals (dual-sided) | — | ✓ | ✓ | ✓ | ✓ |
| Campaigns + milestones | — | ✓ | ✓ | ✓ | ✓ |
| Daily check-in / streaks | — | — | ✓ | ✓ | ✓ |
| Paid membership club | — | — | ✓ | ✓ | ✓ |
| Nudge holdout (causal lift) | — | — | ✓ | ✓ | ✓ |
Why this exists — the long version
Loyalty is the highest-ROI retention lever most stores never operate well, because the tooling is disconnected from everything else. A standalone loyalty app doesn't know a customer's predicted LTV, can't feed its tier into your ad audiences, and treats redemption liability as an off-platform spreadsheet. Worse, most of them mint discounts with no floor, so a "$10 reward" gets used on a $12 order and torches the margin on that sale.
This programme is built as a first-class engine on the same data spine as the rest of the platform. Points are a real ledger, tiers sync to Shopify so your storefront and Functions can act on them, redemptions are native discount codes with checkout-enforced guardrails, and the outstanding liability is a real number your finance view already tracks. The result is a loyalty programme you can actually reason about financially — not a black box that quietly erodes contribution margin.