Class participant events
Class participant events describe an athlete’s participation in one Class. The
subject is Classes/{classId}/Participants/{userId}. All three event types
use the same enriched booking snapshot in data, including Class, trainer,
cost, and UserSubscription context when available.
| Event type | Meaning |
|---|---|
ClassParticipant.Created |
The athlete was added as a confirmed participant or placed in the queue. |
ClassParticipant.Updated |
Participation properties changed, including transitions between queue and confirmed states. |
ClassParticipant.Deleted |
The participation was removed; data contains its last saved snapshot. |
See Class participants for booking rules, payments, attendance interpretation, and domain conflicts.
Common data contract
Section titled “Common data contract”Booking properties:
| Property | Meaning |
|---|---|
ClassId, UserId |
Composite identity of the participation. |
CreatedAtUtc |
Booking creation time; it also determines queue order. |
Mode |
InSite or Remote. |
State |
Participant for a confirmed place or InQueue. |
NoShow |
Current saved no-show flag. It is not proof of physical check-in. |
Trial |
Whether the participation is treated as a trial. |
ActorId |
UserId of the operation actor, or null when unavailable. |
Class context:
| Property | Meaning |
|---|---|
ClubId |
Club that owns the Class and scopes the event. |
ClassName |
Current Class name. |
ClassBegin, ClassEnd |
Complete Class interval as absolute instants. |
CalendarType |
Club, PT, or Services. |
ClassType |
Course, Single, or Group. |
TrainingType |
Activity classification associated with the Class. |
Location |
Class location, or null. |
TrainerId, TrainerName |
Assigned trainer identity when available. |
BookAsNoShow |
Whether the Class initially marks bookings as no-shows. |
Payment and membership context:
| Property | Meaning |
|---|---|
CreditsCost |
Credits associated with the booking. It is not a signed charge or refund for this event. |
SubscriptionCost |
Membership activities associated with the booking. It is not a signed balance change. |
TotalCredits |
Resulting credit balance when available; otherwise omitted. |
UserClassSubscriptionId |
UserSubscription assignment associated with the booking, or null. |
ClassSubscriptionId, SubscriptionName, SubscriptionType |
Product information, or null when unavailable. |
SubscriptionFrom, SubscriptionTo |
Assignment interval, or null. |
MaxActivities |
Assignment limit; 0 means unlimited, and null means no assignment data. |
AvailableActivities |
Remaining activities after the saved operation, or null. |
A queued booking can reference a UserSubscription without having consumed an activity yet. Treat the event as a complete snapshot of the booking at that operation, not as a continuously updated view of the Class or membership.
ClassParticipant.Created
Section titled “ClassParticipant.Created”[ { "id": "example-participant-created-event", "topic": "club-100001-events", "subject": "Classes/700001/Participants/300001", "data": { "ClubId": 100001, "ClassName": "Evening yoga", "ClassBegin": "2026-09-18T18:30:00+02:00", "ClassEnd": "2026-09-18T19:15:00+02:00", "CalendarType": "Club", "ClassType": "Group", "TrainingType": "Yoga", "Location": "Studio 1", "TrainerId": 800001, "TrainerName": "Example Trainer", "BookAsNoShow": false, "CreditsCost": 0, "SubscriptionCost": 1, "UserClassSubscriptionId": 600001, "ClassSubscriptionId": 500001, "SubscriptionName": "Monthly classes", "SubscriptionType": "Membership", "SubscriptionFrom": "2026-09-01T00:00:00+02:00", "SubscriptionTo": "2026-10-01T00:00:00+02:00", "MaxActivities": 10, "AvailableActivities": 9, "ClassId": 700001, "UserId": 300001, "CreatedAtUtc": "2026-09-18T09:12:25.980Z", "Mode": "InSite", "State": "Participant", "NoShow": false, "Trial": false, "ActorId": null, "TotalCredits": 99 }, "eventType": "ClassParticipant.Created", "eventTime": "2026-09-18T09:12:26.153Z", "dataVersion": "1.0" }]Creation does not guarantee a confirmed place: always inspect State, because
a successful booking can create an InQueue entry.
ClassParticipant.Updated
Section titled “ClassParticipant.Updated”An update uses the same complete data shape. Common cases include queue
promotion, a change to Mode, NoShow, Trial, payment association, or
another saved participation property.
Replace the local participation snapshot rather than inferring the transition from a previous event. Delivery can be duplicated or out of order, and no event is generated merely because a Class reaches its end time.
ClassParticipant.Deleted
Section titled “ClassParticipant.Deleted”The deletion event carries the last saved participation snapshot using the same
shape. Costs remain the amounts associated with the removed booking. When
provided, TotalCredits and AvailableActivities reflect
the state after any refund.
Remove the record identified by ClassId plus UserId. The Class, athlete,
and UserSubscription are not themselves deleted. Process the operation
idempotently.
Recommended consumer flow
Section titled “Recommended consumer flow”- Deduplicate by envelope
id. - Identify the participation by
data.ClassIdplusdata.UserId. - Upsert the complete snapshot for
CreatedandUpdated. - Remove only that participation for
Deleted. - Reconcile one known booking with
GET /Classes/{classId}/Participants/{userId}. - Use
GET /Classes/Bookingsfor paginated club-wide reconciliation,GET /Classes/{classId}/Bookingsfor one large Class, or the existingGET /Classes/{classId}/Participantsarray for a complete non-paginated Class refresh.