Skip to main content

Engagement & streaks

How to use it

Add engagement earning that stays financially safe:

  1. Enable daily check-in and set points/day plus the per-cycle cap. (Loyalty → Settings → Check-in — Pro+)
  2. Add streak bonuses at milestone days (e.g. day 30, day 60). (Loyalty → Settings → Check-in)
  3. Turn on birthday & review rewards to earn beyond purchases. (Loyalty → Settings → Actions)
  4. 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.

SettingDefaultMeaning
Points per day5Awarded on each check-in
Grace days1Missed days forgiven before the streak resets
Streak bonusesday 30 → 100, day 60 → 300One-off bonus at a streak length
Cycle length60 daysThe window the liability cap applies over
Cycle cap1,200 pointsHard 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.

Rewarding is separate from displaying

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.