Webhook Events
Every webhook delivery — whether to a dashboard-configured endpoint or a subscription API hook — is a JSON envelope with the same outer shape:
{
"id": "5f8c7e0a-1b2c-4d3e-9f4a-6b7c8d9e0f1a",
"type": "booking.created",
"version": 1,
"created_at": "2026-06-11T17:00:00.000Z",
"studio": {
"id": "9a1b2c3d-0000-4000-8000-000000000001",
"slug": "dance-trance"
},
"data": { "…": "event-specific fields, see below" }
}
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Unique event ID — stable across delivery retries; use it for deduplication |
type | string | Event type, e.g. booking.created |
version | integer | Payload schema version for this event type (currently 1 for all types); bumped on incompatible changes |
created_at | string (ISO 8601) | When the event occurred |
studio.id | string (UUID) | The studio the event belongs to |
studio.slug | string | The studio's subdomain |
data | object | Event-specific payload, documented per type below |
Monetary amounts are integer cents in the studio's currency. Fields
typed string | null are null when the value is unavailable (for
example, bookings without a guest email).
booking.created
A class booking was created (paid checkout or class-pack credit).
| Field | Type |
|---|---|
booking_id | string |
schedule_item_id | string | null |
guest_name | string | null |
guest_email | string | null |
payment_method | "card" | "pack_credit" |
amount_cents | integer | null |
class_name | string | null |
class_start_time | string | null |
instructor_name | string | null |
{
"booking_id": "7f0d6f9e-0000-4000-8000-000000000001",
"schedule_item_id": "7f0d6f9e-0000-4000-8000-000000000002",
"guest_name": "Alex Rivera",
"guest_email": "alex@example.com",
"payment_method": "card",
"amount_cents": 2500,
"class_name": "Morning Yoga Flow",
"class_start_time": "2026-06-12T09:00:00+00:00",
"instructor_name": "Jordan Lee"
}
booking.cancelled
A booking was cancelled.
| Field | Type |
|---|---|
booking_id | string |
guest_name | string | null |
guest_email | string | null |
refund_amount_cents | integer |
penalty_amount_cents | integer |
cancellation_reason | string |
class_name | string | null |
class_start_time | string | null |
instructor_name | string | null |
{
"booking_id": "7f0d6f9e-0000-4000-8000-000000000001",
"guest_name": "Alex Rivera",
"guest_email": "alex@example.com",
"refund_amount_cents": 2500,
"penalty_amount_cents": 0,
"cancellation_reason": "Cancelled by user",
"class_name": "Morning Yoga Flow",
"class_start_time": "2026-06-12T09:00:00+00:00",
"instructor_name": "Jordan Lee"
}
checkin.completed
A client checked in to a class (self check-in, kiosk, or instructor).
| Field | Type |
|---|---|
booking_id | string |
guest_name | string | null |
guest_email | string | null |
checkin_method | "self" | "kiosk" | "instructor" |
class_name | string | null |
class_start_time | string | null |
instructor_name | string | null |
{
"booking_id": "7f0d6f9e-0000-4000-8000-000000000001",
"guest_name": "Alex Rivera",
"guest_email": "alex@example.com",
"checkin_method": "self",
"class_name": "Morning Yoga Flow",
"class_start_time": "2026-06-12T09:00:00+00:00",
"instructor_name": "Jordan Lee"
}
payment.completed
A class checkout payment completed.
| Field | Type |
|---|---|
booking_id | string |
payment_intent_id | string | null |
amount_cents | integer |
guest_email | string | null |
class_name | string | null |
class_start_time | string | null |
instructor_name | string | null |
{
"booking_id": "7f0d6f9e-0000-4000-8000-000000000001",
"payment_intent_id": "pi_sample_123",
"amount_cents": 2500,
"guest_email": "alex@example.com",
"class_name": "Morning Yoga Flow",
"class_start_time": "2026-06-12T09:00:00+00:00",
"instructor_name": "Jordan Lee"
}
refund.issued
A refund was issued for a booking.
| Field | Type |
|---|---|
booking_id | string |
guest_name | string | null |
guest_email | string | null |
refund_amount_cents | integer |
stripe_refund_id | string | null |
class_name | string | null |
class_start_time | string | null |
instructor_name | string | null |
{
"booking_id": "7f0d6f9e-0000-4000-8000-000000000001",
"guest_name": "Alex Rivera",
"guest_email": "alex@example.com",
"refund_amount_cents": 2500,
"stripe_refund_id": "re_sample_123",
"class_name": "Morning Yoga Flow",
"class_start_time": "2026-06-12T09:00:00+00:00",
"instructor_name": "Jordan Lee"
}
ping
A synthetic test event sent on demand from the StudioBase dashboard ("send test event"). It is not subscribable through the subscription API, but any endpoint may receive it — treat unrecognized event types as a no-op and return 2xx.
| Field | Type |
|---|---|
message | string |