Fitness (GYM)

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 StateTarget StateTriggering Event / ActionGuard ConditionsPrimary ActorDomain Event Emitted
PendingActivationActiveJoining fee and first billing period settledSingle Active Membership Law holds; member snapshot verifiedMembership ConsultantMembershipActivated
PendingActivationAbandonedOnboarding window elapsed without paymentNo settled invoice for the first periodSystem (timeout)MembershipOnboardingAbandoned
ActiveFrozenMember requests freeze with start and end datesFreeze quota not exhausted; no overlapping freeze windowMemberMembershipFreezeStarted
FrozenActiveScheduled freeze end reached or member resumes earlyExpiry recalculated from actual freeze daysMember / SystemMembershipFreezeEnded
ActivePaymentSuspendedBilling reports recurring payment failureDunning policy initiatedBilling (via ACL)MembershipPaymentSuspended
PaymentSuspendedActiveOutstanding balance successfully collectedSettlement confirmed by BillingBilling (via ACL)MembershipReactivated
PaymentSuspendedTerminatedDunning retries exhausted per policyFormal termination notice recordedClub ManagerMembershipTerminated
ActiveExpiredFinal billing period elapsed without renewalAuto-renewal disabled or payment not attemptedSystem (schedule)MembershipExpired
ExpiredActiveRenewal payment settled inside the grace windowGrace window not elapsed; billing anchor preservedMemberMembershipRenewed
Active / FrozenCancelledCancellation notice period elapsedCommitment period satisfied or penalty settledMemberMembershipCancelled

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 StateTarget StateTrigger / ActionGuard ConditionsPrimary ActorDomain Event Emitted
RequestedConfirmedBooking accepted against open capacityWithin advance booking window; member booking privileges active; capacity law holdsMemberClassBookingConfirmed
RequestedWaitlistedSession at full capacityArrival position assigned atomicallyMemberClassBookingWaitlisted
WaitlistedPromotionOfferedConfirmed seat releasedStrict first-in-first-offered orderSystemWaitlistPromotionOffered
PromotionOfferedConfirmedMember accepts within the offer windowOffer not expired; capacity law re-verifiedMemberClassBookingConfirmed
PromotionOfferedWaitlisted / DroppedOffer window elapsed unacceptedRetention or drop per club policy, recorded explicitlySystem (timeout)WaitlistPromotionExpired
ConfirmedEarlyCancelledMember cancels before the cancellation cutoffSeat released; waitlist promotion triggeredMemberClassBookingCancelled
ConfirmedLateCancelledMember cancels after the cutoff, before startSeat released; one strike accruedMemberClassBookingLateCancelled
ConfirmedCheckedInMember credential verified at access point on session dayActive membership; zone entitlement validAccess PointClassAttendanceCheckedIn
CheckedInCompletedSession delivered by instructorInstructor closes the session rosterInstructorClassSessionCompleted
ConfirmedNoShowSession started without member check-inRoster reconciliation at session startSystemClassNoShowRecorded

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 StateTarget StateTrigger / ActionGuard ConditionsPrimary ActorDomain Event Emitted
DraftConfirmedMember confirms the appointmentAt least one unexpired credit available; trainer slot freeMemberPtSessionConfirmed
DraftAbandonedConfirmation window elapsed or credits unavailableSlot released back to trainer availabilitySystem (timeout)PtSessionRequestAbandoned
ConfirmedCompletedTrainer delivers and signs off the sessionBoth parties present; duration fulfilledPersonal TrainerPtSessionCompleted
ConfirmedEarlyCancelledMember cancels before the cancellation cutoffConsumed credit restored to the package ledgerMemberPtSessionCreditRestored
ConfirmedLateCancelledMember cancels after the cutoffConsumed credit forfeitedMemberPtSessionCreditForfeited
ConfirmedNoShowSession start elapsed without the memberConsumed credit forfeitedSystemPtSessionCreditForfeited
ConfirmedTrainerCancelledTrainer or club cancels the appointmentCredit always restored regardless of timing; rebooking offeredClub / TrainerPtSessionCreditRestored

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.

Our Premium Sponsors

Obelaw is proudly open-source. Continued development, bug fixes, and community support are made possible by the generosity of our sponsors.

Sponsor Obelaw