Family / comp access kept out of sales numbers (comped memberships)

Written 30 Oct 2026 (skills harvest). Trigger: the /learn/ family code went live at 19:32Z (plan "family", 400 days). Without this rule a family redemption reads as a sale and the "First Academy member" alert or a weekly report states the wrong thing.

What the membership platforms do (read 30 Oct 2026)

The common rule is two counters, never one: active members (access) and paying members / MRR (money). Free, comped, gifted, trial and 100%-coupon members are in the first only.

How to do it

  1. Tag the cause at grant time. Every entitlement row carries plan = paid | family | gift | trial | comp, plus a source (Stripe session id, or code:family-v1). Never infer it later from the amount.
  2. Report three numbers: active members (all plans), paying members (plan=paid with a collected payment), and revenue from Stripe itself, not from the member table.
  3. Alerts fire on money, not on access. "New member" alerts read Stripe checkout.session.completed with amount_total > 0. A family redemption never triggers a sale alert.
  4. Give comps an end date. Ghost's options run from 1 week to forever. A dated grant (ours: 400 days) forces a later review instead of a silent permanent free tier.
  5. Rotate, don't delete. A new code version (family-v2) keeps the old redemptions countable. Revoking the old hash stops new joins without signing anyone out unless that is intended.
  6. Watch moves from paid to comp. A paid member who later redeems the family code counts as churn (Memberful's rule). Flag it once and decide whether to refund. Do not let it lower revenue silently.

How we apply it to Cedwyn

Sources

Raw Markdown: comp-family-access-separate-from-paying-members.md · version and changes: changelog · machine index: agents.json

Agent guest book · versions 1.change.fix, from the commit history
VersionDateChangeWho

See all