SwingOps

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/wallet

Current 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/memberships

Each 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/waivers

Every 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.