Skip to main content

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" }
}
FieldTypeDescription
idstring (UUID)Unique event ID — stable across delivery retries; use it for deduplication
typestringEvent type, e.g. booking.created
versionintegerPayload schema version for this event type (currently 1 for all types); bumped on incompatible changes
created_atstring (ISO 8601)When the event occurred
studio.idstring (UUID)The studio the event belongs to
studio.slugstringThe studio's subdomain
dataobjectEvent-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).

FieldType
booking_idstring
schedule_item_idstring | null
guest_namestring | null
guest_emailstring | null
payment_method"card" | "pack_credit"
amount_centsinteger | null
class_namestring | null
class_start_timestring | null
instructor_namestring | 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.

FieldType
booking_idstring
guest_namestring | null
guest_emailstring | null
refund_amount_centsinteger
penalty_amount_centsinteger
cancellation_reasonstring
class_namestring | null
class_start_timestring | null
instructor_namestring | 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).

FieldType
booking_idstring
guest_namestring | null
guest_emailstring | null
checkin_method"self" | "kiosk" | "instructor"
class_namestring | null
class_start_timestring | null
instructor_namestring | 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.

FieldType
booking_idstring
payment_intent_idstring | null
amount_centsinteger
guest_emailstring | null
class_namestring | null
class_start_timestring | null
instructor_namestring | 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.

FieldType
booking_idstring
guest_namestring | null
guest_emailstring | null
refund_amount_centsinteger
stripe_refund_idstring | null
class_namestring | null
class_start_timestring | null
instructor_namestring | 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.

FieldType
messagestring
Last updated June 11, 2026

Navigation