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

  1. Pick a club, see isolated dataSwitch the club in the selector above the phone. Members, plans, prices and revenue change completely.
  2. Member: dynamic QRRole : the code rotates every 30 s with a countdown. Old codes stop working.
  3. Reception: scan and verifyRole : tap "Scan" and try four cases: live QR, expired membership, an old screenshot, a member of another club.
  4. Take a payment, renewReception "Pay" tab: pick member and plan, cash or local method. It lands in the log with the employee name.
  5. Owner: retention and rolesRole : expiring / expired / inactive (7, 10, 15+ days) with a WhatsApp action, plans, staff permissions, audit log.
  6. 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

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
Prototype with sample data. Names are fictional.