Engagement & streaks
How to use it
Add engagement earning that stays financially safe:
- Enable daily check-in and set points/day plus the per-cycle cap. (Loyalty → Settings → Check-in — Pro+)
- Add streak bonuses at milestone days (e.g. day 30, day 60). (Loyalty → Settings → Check-in)
- Turn on birthday & review rewards to earn beyond purchases. (Loyalty → Settings → Actions)
- Schedule expiry reminders so customers redeem before points lapse. (Loyalty → Reminders)
⏱ ~15 min · 💳 Check-in Pro+ · 🎯 Per-customer liability is capped automatically
Daily check-in & streaks Stable · Pro+
A logged-in customer can check in once per UTC day for a small points award; consecutive days build a streak, and reaching streak milestones grants one-off bonuses.
| Setting | Default | Meaning |
|---|---|---|
| Points per day | 5 | Awarded on each check-in |
| Grace days | 1 | Missed days forgiven before the streak resets |
| Streak bonuses | day 30 → 100, day 60 → 300 | One-off bonus at a streak length |
| Cycle length | 60 days | The window the liability cap applies over |
| Cycle cap | 1,200 points | Hard ceiling on check-in points per customer per cycle |
The cap is what makes this safe
The whole mechanic is bounded by a cycle cap: a customer can earn at most
cycleCapPoints from check-ins per rolling cycleDays window. When the cap is
exhausted, the streak still advances (so the customer doesn't feel punished) but
zero points are granted until the cycle rolls over. This is a server-enforced
ceiling on check-in liability — the reason a "log in every day for points"
mechanic doesn't quietly become an unbounded giveaway.
Check-in earning is:
- Idempotent per UTC day — a double-tap or refresh can't double-award.
- Fail-closed and Pro+ gated — if the plan check errors, the award is denied rather than given away.
- Killable instantly — an environment kill-switch halts all check-in earning across every store without a deploy, in case the mechanic is being abused.
Birthday bonus
Customers capture their birthday (month + day, no year) via the storefront widget. A daily sweep awards the birthday bonus (default 500 points) to everyone whose birthday is today, de-duped per calendar year. Leap-year birthdays (Feb 29) are awarded on Feb 28 in non-leap years, so they're never skipped.
Verified-review rewards
Reward customers for reviewing products they've bought. The reward (default 50 points) is gated to verified purchases — a customer can only earn for a product they actually purchased (recorded from paid-order line items) — and grants once per product. The storefront can check eligibility up front, so a review form only appears when there are points to earn.
This system rewards reviews; showing review content on the storefront is the job of your reviews/UGC surface. Keeping them separate means the reward logic (anti-farming, verified-purchase gate) stays clean.
Expiry reminders
Customers with points lapsing in the next N days are a high-intent re-engagement audience — they have a concrete reason to come back now. The programme computes the at-risk balance per customer (clamped to their live balance, so someone who already redeemed isn't counted) and feeds a "use your points before they expire" nudge over your messaging channels.
Measuring true lift — the nudge holdout Beta · Pro+
You can't ethically withhold the whole loyalty programme to measure it — but you can withhold the communications. Turn on the nudge holdout and a deterministic random slice of members (up to 50%) is held out of loyalty nudges as a control arm. The dashboard then measures the real incremental lift of loyalty messaging — treated vs. control repeat-order rate — instead of an un-causal correlation. Assignment is stable per member, so the reminder path and the lift readout always agree on who's in the holdout.
Best practices
✅ Treat check-in as an engagement loop, not a discount. Keep points-per-day small and lean on the streak bonuses and cap — the cap is your liability control.
✅ Run the expiry reminder on a cadence. Expiring-points nudges are among the highest-converting loyalty messages.
✅ Turn on the nudge holdout before you claim loyalty ROI. Without a control arm, "loyalty customers buy more" is confounded by the fact that your best customers self-select into loyalty.
❌ Don't raise the check-in cap to juice engagement metrics — you're raising uncapped liability, not revenue.