Skip to content

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.

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.

[
{
"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.

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.

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.

  1. Deduplicate by envelope id.
  2. Identify the participation by data.ClassId plus data.UserId.
  3. Upsert the complete snapshot for Created and Updated.
  4. Remove only that participation for Deleted.
  5. Reconcile one known booking with GET /Classes/{classId}/Participants/{userId}.
  6. Use GET /Classes/Bookings for paginated club-wide reconciliation, GET /Classes/{classId}/Bookings for one large Class, or the existing GET /Classes/{classId}/Participants array for a complete non-paginated Class refresh.