Fitness (GYM) - Operational Workflows & State Machines
Membership lifecycle, class booking and waitlist progression, access decision flow, PT session state machines, and state transition tables for the Fitness (GYM) domain.
Operational Workflows & State Machines
Fitness club operations follow deterministic, state-driven lifecycles. Every membership agreement, class booking, waitlist promotion, access attempt, and personal training session executes through controlled state transitions guarded by domain invariants.
1. End-to-End Member Operational Journey
The member journey orchestrates commercial onboarding, contractual activation, daily access, class participation, and long-term retention:
flowchart TD
A["Prospect Selects Membership Plan"] --> B["Membership Agreement Created (Pending Activation)"]
B --> C["Joining Fee & First Period Settled"]
C --> D["Agreement Activated & Credential Issued"]
D --> E["Member Presents Credential at Turnstile"]
E --> F{"Access Decision"}
F -->|Granted| G["Check-in Recorded in Attendance Ledger"]
F -->|Denied: Expired / Frozen / Suspended| H["Denial Recorded with Reason & Front Desk Alerted"]
G --> I["Member Books Class Within Advance Window"]
I --> J{"Capacity Available?"}
J -->|Yes| K["Booking Confirmed"]
J -->|No| L["Waitlist Entry Created in Arrival Order"]
L --> M["Seat Released → Promotion Offer Sent"]
M --> K
K --> N["Member Attends & Checks In"]
N --> O["Session Completed; Attendance Verified"]
K -.->|Late Cancel / No-Show| P["Strike Accrued per Policy"]
D -.->|Renewal Approaching| Q["Auto-Renewal & Billing Cycle Advance"]
D -.->|Member Request| R["Freeze Window: Access Blocked, Expiry Extended"]
D -.->|Notice Given| S["Cancellation After Notice Period"]
2. Membership Agreement State Machine
The MembershipAgreement aggregate enforces the contractual lifecycle protecting recurring revenue and access integrity:
stateDiagram-v2
[*] --> PendingActivation: Plan Selected & Terms Accepted
PendingActivation --> Active: Joining Fee & First Period Settled
PendingActivation --> Abandoned: Onboarding Expired Without Payment
Active --> Frozen: Member Freeze Request Approved
Frozen --> Active: Scheduled Freeze End or Early Resume
Active --> PaymentSuspended: Recurring Payment Failed
PaymentSuspended --> Active: Outstanding Balance Cured
PaymentSuspended --> Terminated: Dunning Exhausted
Active --> Expired: Final Billing Period Elapsed Without Renewal
Expired --> Active: Renewal Payment Settled (Grace Window)
Active --> Cancelled: Notice Period Elapsed
Frozen --> Cancelled: Notice Period Elapsed During Freeze
Cancelled --> [*]
Terminated --> [*]
Abandoned --> [*]
Membership Agreement State Transition Table
| Current State | Target State | Triggering Event / Action | Guard Conditions | Primary Actor | Domain Event Emitted |
|---|---|---|---|---|---|
PendingActivation | Active | Joining fee and first billing period settled | Single Active Membership Law holds; member snapshot verified | Membership Consultant | MembershipActivated |
PendingActivation | Abandoned | Onboarding window elapsed without payment | No settled invoice for the first period | System (timeout) | MembershipOnboardingAbandoned |
Active | Frozen | Member requests freeze with start and end dates | Freeze quota not exhausted; no overlapping freeze window | Member | MembershipFreezeStarted |
Frozen | Active | Scheduled freeze end reached or member resumes early | Expiry recalculated from actual freeze days | Member / System | MembershipFreezeEnded |
Active | PaymentSuspended | Billing reports recurring payment failure | Dunning policy initiated | Billing (via ACL) | MembershipPaymentSuspended |
PaymentSuspended | Active | Outstanding balance successfully collected | Settlement confirmed by Billing | Billing (via ACL) | MembershipReactivated |
PaymentSuspended | Terminated | Dunning retries exhausted per policy | Formal termination notice recorded | Club Manager | MembershipTerminated |
Active | Expired | Final billing period elapsed without renewal | Auto-renewal disabled or payment not attempted | System (schedule) | MembershipExpired |
Expired | Active | Renewal payment settled inside the grace window | Grace window not elapsed; billing anchor preserved | Member | MembershipRenewed |
Active / Frozen | Cancelled | Cancellation notice period elapsed | Commitment period satisfied or penalty settled | Member | MembershipCancelled |
3. Class Booking & Waitlist State Machine
The ScheduledClassSession aggregate governs seat reservations, ordered waitlists, and penalty-bearing exits:
stateDiagram-v2
[*] --> Requested: Member Books Within Advance Window
Requested --> Confirmed: Capacity Available
Requested --> Waitlisted: Session Full
Waitlisted --> PromotionOffered: Seat Released
PromotionOffered --> Confirmed: Offer Accepted Within Window
PromotionOffered --> Waitlisted: Offer Expired (Position Retained)
PromotionOffered --> Dropped: Offer Expired (Policy Drop)
Confirmed --> EarlyCancelled: Member Cancels Before Cutoff
Confirmed --> LateCancelled: Member Cancels After Cutoff
Confirmed --> CheckedIn: Member Verified at Access Point
CheckedIn --> Completed: Session Delivered
Confirmed --> NoShow: Session Started Without Attendance
EarlyCancelled --> [*]
LateCancelled --> [*]
Completed --> [*]
NoShow --> [*]
Dropped --> [*]
Class Booking State Transition Table
| Current State | Target State | Trigger / Action | Guard Conditions | Primary Actor | Domain Event Emitted |
|---|---|---|---|---|---|
Requested | Confirmed | Booking accepted against open capacity | Within advance booking window; member booking privileges active; capacity law holds | Member | ClassBookingConfirmed |
Requested | Waitlisted | Session at full capacity | Arrival position assigned atomically | Member | ClassBookingWaitlisted |
Waitlisted | PromotionOffered | Confirmed seat released | Strict first-in-first-offered order | System | WaitlistPromotionOffered |
PromotionOffered | Confirmed | Member accepts within the offer window | Offer not expired; capacity law re-verified | Member | ClassBookingConfirmed |
PromotionOffered | Waitlisted / Dropped | Offer window elapsed unaccepted | Retention or drop per club policy, recorded explicitly | System (timeout) | WaitlistPromotionExpired |
Confirmed | EarlyCancelled | Member cancels before the cancellation cutoff | Seat released; waitlist promotion triggered | Member | ClassBookingCancelled |
Confirmed | LateCancelled | Member cancels after the cutoff, before start | Seat released; one strike accrued | Member | ClassBookingLateCancelled |
Confirmed | CheckedIn | Member credential verified at access point on session day | Active membership; zone entitlement valid | Access Point | ClassAttendanceCheckedIn |
CheckedIn | Completed | Session delivered by instructor | Instructor closes the session roster | Instructor | ClassSessionCompleted |
Confirmed | NoShow | Session started without member check-in | Roster reconciliation at session start | System | ClassNoShowRecorded |
4. Personal Training Session State Machine
The PtSessionAppointment aggregate governs one-to-one coaching appointments and their credit consequences:
stateDiagram-v2
[*] --> Draft: Member Requests Trainer Slot
Draft --> Confirmed: Credit Consumed & Trainer Reserved
Draft --> Abandoned: No Credits / Slot Released
Confirmed --> Completed: Session Delivered & Signed Off
Confirmed --> EarlyCancelled: Member Cancels Before Cutoff
Confirmed --> LateCancelled: Member Cancels After Cutoff
Confirmed --> NoShow: Member Absent at Start
Confirmed --> TrainerCancelled: Trainer / Club Cancels
Completed --> [*]
EarlyCancelled --> [*]
LateCancelled --> [*]
NoShow --> [*]
TrainerCancelled --> [*]
Abandoned --> [*]
PT Session State Transition Table
| Current State | Target State | Trigger / Action | Guard Conditions | Primary Actor | Domain Event Emitted |
|---|---|---|---|---|---|
Draft | Confirmed | Member confirms the appointment | At least one unexpired credit available; trainer slot free | Member | PtSessionConfirmed |
Draft | Abandoned | Confirmation window elapsed or credits unavailable | Slot released back to trainer availability | System (timeout) | PtSessionRequestAbandoned |
Confirmed | Completed | Trainer delivers and signs off the session | Both parties present; duration fulfilled | Personal Trainer | PtSessionCompleted |
Confirmed | EarlyCancelled | Member cancels before the cancellation cutoff | Consumed credit restored to the package ledger | Member | PtSessionCreditRestored |
Confirmed | LateCancelled | Member cancels after the cutoff | Consumed credit forfeited | Member | PtSessionCreditForfeited |
Confirmed | NoShow | Session start elapsed without the member | Consumed credit forfeited | System | PtSessionCreditForfeited |
Confirmed | TrainerCancelled | Trainer or club cancels the appointment | Credit always restored regardless of timing; rebooking offered | Club / Trainer | PtSessionCreditRestored |
5. Access Decision Flow
Every credential presentation executes a deterministic evaluation pipeline guarded by the Active Membership Access Law:
flowchart TD
Scan["Credential Presented at Access Point"] --> CredValid{"Credential Valid & Not Revoked?"}
CredValid -->|No| DenyCred["DENY: CredentialRevoked"]
CredValid -->|Yes| HasAgreement{"Active-Family Agreement Exists?"}
HasAgreement -->|No| PassCheck{"Valid Day Pass / Guest Pass for Today?"}
PassCheck -->|No| DenyNone["DENY: NoValidAccessRight"]
PassCheck -->|Yes| ZonePass{"Zone Covered by Pass?"}
ZonePass -->|No| DenyZonePass["DENY: ZoneNotEntitled"]
ZonePass -->|Yes| Grant["GRANT: Check-in Recorded"]
HasAgreement -->|Yes| StateCheck{"Agreement State = Active?"}
StateCheck -->|Frozen| DenyFrozen["DENY: MembershipFrozen"]
StateCheck -->|Payment Suspended| DenyPay["DENY: PaymentSuspended"]
StateCheck -->|Expired / Cancelled| DenyExp["DENY: MembershipExpired"]
StateCheck -->|Active| PeakCheck{"Peak Window & Off-Peak Plan?"}
PeakCheck -->|Yes| DenyPeak["DENY: PeakHoursRestricted"]
PeakCheck -->|No| ZoneCheck{"Zone Entitled by Tier?"}
ZoneCheck -->|No| DenyZone["DENY: ZoneNotEntitled"]
ZoneCheck -->|Yes| Grant
Access Decision Rules
- Determinism: The same member state and the same presentation context must always produce the same decision; front desk staff cannot silently override a denial — assisted entry requires a documented override record.
- Denial Transparency: Every denial carries a reason code renderable on the turnstile display, so the member immediately understands why entry was refused.
- Ledger Completeness: Granted and denied decisions are both written to the immutable attendance ledger; occupancy manifests and safety evacuation lists depend on denied attempts being visible as well.