Multi-gym membership & QR check-in: clickable prototype
One platform, many independent gyms. Switch roles above the phone and walk through the main flows from your brief.
Demo, honestly labelled: this is a browser mock-up with sample data, built to agree on screens and flows before development. It is not the Flutter app. Payments are a stub; no real charge, no real WhatsApp send, the QR is illustrative.
Try these in order
Pick a club, see isolated dataSwitch the club in the selector above the phone. Members, plans, prices and revenue change completely.
Member: dynamic QRRole : the code rotates every 30 s with a countdown. Old codes stop working.
Reception: scan and verifyRole : tap "Scan" and try four cases: live QR, expired membership, an old screenshot, a member of another club.
Take a payment, renewReception "Pay" tab: pick member and plan, cash or local method. It lands in the log with the employee name.
Owner: retention and rolesRole : expiring / expired / inactive (7, 10, 15+ days) with a WhatsApp action, plans, staff permissions, audit log.
Super Admin: gyms and local offersRole : activate or suspend gyms, create an offer, then see it in the Member "Offers" tab.
Covered from the brief
Multi-tenant clubs
Dynamic secure QR
Staff scan + photo check
Check-in history
Custom plans
Payments + revenue
Inactive members
WhatsApp link
Owner / Manager / Reception
Audit log
Super Admin
Local offers
How isolation is enforced (production)
-- every table carries gym_id
-- rule is checked by the database, not the app UI
create policy tenant_isolation on members
using (gym_id = (auth.jwt()->>'gym_id')::uuid);
-- role is a signed claim; reception cannot
-- read revenue even by calling the API directly