event field in the envelope, e.g. webinar.created) and an enum name used when creating subscriptions (e.g. WEBINAR_CREATED). Subscribe using the enum name; match on the wire name in your receiver.
| Wire name | Subscription enum | When it fires |
|---|---|---|
webinar.created | WEBINAR_CREATED | A webinar is scheduled. |
webinar.started | WEBINAR_STARTED | A webinar goes live. |
webinar.ended | WEBINAR_ENDED | A webinar ends. |
registrant.created | REGISTRANT_CREATED | Someone registers for a webinar. |
attendee.joined | ATTENDEE_JOINED | A registrant joins the live webinar. |
registrant.did_not_attend | REGISTRANT_DID_NOT_ATTEND | A registrant did not attend the webinar. |
The payloads below show the
data object of the envelope. Test events (fired via sendTestEvent) carry the same shape with an added "test": true marker and obviously synthetic values, so you can build and validate your parser without a real webinar.Webinar events
webinar.created, webinar.started, and webinar.ended share a common webinar shape. started adds actual_start_time; ended adds actual_end_time and attendee_count.
data (webinar.ended)
| Field | Type | Notes |
|---|---|---|
event_id | string | The webinar this event relates to. Equals id for webinar events. |
id | string | The webinar id. |
title | string | null | Webinar title. |
description | string | null | Webinar description. |
scheduled_start_time | string | null | ISO-8601. Planned start. |
scheduled_end_time | string | null | ISO-8601. Planned end. |
timezone | string | null | IANA timezone the webinar was scheduled in. |
type | string | Webinar type, e.g. live. |
studio_id | string | The studio hosting the webinar. |
studio_slug | string | null | Slug of the hosting studio. |
project_id | string | Owning project. |
production_id | string | null | Owning production. |
hosted_by | string | null | Display name of the host. |
created_by_user_id | string | null | User who created the webinar. |
actual_start_time | string | ISO-8601. Present on webinar.started and webinar.ended. |
actual_end_time | string | ISO-8601. Present on webinar.ended. |
attendee_count | integer | Present on webinar.ended. |
Registrant & attendee events
registrant.created, attendee.joined, and registrant.did_not_attend share a common registrant shape. attendee.joined adds joined_at and sets participated: true; registrant.did_not_attend sets participated: false with a zeroed attendance.
data (attendee.joined)
| Field | Type | Notes |
|---|---|---|
event_id | string | The webinar this registrant belongs to. |
first_name | string | Registrant first name. |
last_name | string | null | Registrant last name. |
email | string | Registrant email. |
registered_at | string | ISO-8601. When they registered. |
approved | boolean | Whether the registration was approved. |
join_url | string | null | Personal join link. |
participated | boolean | true once they join; false for no-shows. |
joined_at | string | ISO-8601. Present on attendee.joined only. |
attendance_rate | number | null | Fraction of the webinar attended. 0 for no-shows. |
duration | string | null | Time attended (mm:ss). "00:00" for no-shows. |
referrer | string | null | Referring URL captured at registration. |
utm | object | null | UTM attribution (source, medium, campaign, term, content — each nullable). |
custom_fields | object | null | Custom registration form responses, keyed by field label. Values are a string, boolean, or a phone-number object ({ countryCode, phoneNumber }). |