Skip to main content

[Admin] Waiver & forms enforcement at signup

Who's In enforces waiver acceptance at every new-member signup surface — free joins, paid Checkout, and waitlist joins. Existing members are grandfathered at the waiver version they accepted.

Where to configure your waiver: - Clubs: Admin → Settings → Waiver section. Toggle "Require waiver at join" + enter your waiver text and upload the signed PDF. - Studio: Admin → Settings → Waiver section (same shape).

What the member sees at signup: - A required checkbox: "I have read and accept the {Club/Studio} waiver" - A link to the full waiver text (rendered inline for quick read, with downloadable PDF if you uploaded one) - No "Join" / "Continue to Payment" CTA until the box is ticked

What we record on every acceptance: - `waiverAcceptedAt` (server-side Timestamp) - `waiverVersion` (the version number active at signup — increments when you change the waiver text) - `waiverTextSnapshot` (hash of the accepted text for legal audit)

If your waiver changes: - `waiverVersion` bumps. - Existing members keep their accepted version — they're grandfathered. - New signups must accept the new version.

Legal best-practice alignment: - Explicit consent (required checkbox, not a pre-checked box) - Snapshot of accepted content at the exact moment of acceptance - Immutable audit record via Firestore security rules - Member can always re-download their signed version from the member dashboard

Free signups (joinClub): waiverAccepted flag required; backend rejects missing. Paid signups (createClubMembershipPayment, studioCreatePlanCheckout): waiverAccepted passed through Stripe Checkout metadata; webhook stamps at membership creation. Frontend enforces at signup form.

Still have questions?