Customer portal
Families sign in with a magic link. Once signed in they land in a tight, distraction-free hub: wallet, memberships, waivers, recruit links — nothing more.
Authentication
We use Supabase magic links. Family members sign in with the email on thefamilies.primary_user_id or families.secondary_manager_user_idrow. The portal scopes everything to the family for that user; cross-family access is impossible by construction.
Wallet
/{slug}/portal/walletCurrent balance, recent activity, auto-reload settings, and a Stripe Elements top-up flow. Refunds default here instead of going back to the card — money stays in-facility, the customer skips a redirect, you skip the chargeback risk.
Memberships
/{slug}/portal/membershipsEach active subscription renders as a visual card that mirrors the Apple Wallet pass design. One tap on 'Add to Apple Wallet' downloads the signed pkpass.
Waivers
/{slug}/portal/waiversEvery active org-scoped waiver past its requiredFrom shows here. Pending waivers render the content inline with a sign form; signed waivers show in a compact archive. Version bumps automatically move a waiver back into the pending bucket.
Resume nudges
Abandoned flows trigger an SMS within 30 minutes — the link drops the family back into the exact step they left. Booking payment failed in Elements; waiver waiting for a parent signature; event-cart abandoned mid-form. All three resolve to a portal page that picks up where the form left off.