Membership plans
Tiers, prices, class credits, freezes, and Stripe price IDs.
/dashboard/platform/membership-plans edits MembershipTier with generated CRUD: price per cycle (monthly, annual), class credits, freeze rules, access hours, and Stripe product and price IDs. Online checkout needs a Stripe product ID and a price above zero on at least one plan. The IDs are format-checked only.
Members buy plans on /join. Credits are granted per service period as a MembershipCreditGrant, and every change is a MembershipCreditEntry.