> ## Documentation Index
> Fetch the complete documentation index at: https://docs.riverside.fm/llms.txt
> Use this file to discover all available pages before exploring further.

# Event Types

> The catalog of webhook events you can subscribe to, and the payload each one delivers.

Each event has a **wire name** (the `event` field in the [envelope](/webhooks/overview#the-event-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. |

<Info>
  The payloads below show the `data` object of the [envelope](/webhooks/overview#the-event-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.
</Info>

## 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`.

```json data (webinar.ended) theme={null}
{
  "event_id": "sample-webinar-123",
  "id": "sample-webinar-123",
  "title": "Q3 Product Launch Webinar",
  "description": "A live walkthrough of everything shipping this quarter.",
  "scheduled_start_time": "2026-07-15T16:00:00.000Z",
  "scheduled_end_time": "2026-07-15T17:00:00.000Z",
  "timezone": "America/New_York",
  "type": "live",
  "studio_id": "sample-studio-789",
  "studio_slug": "product-webinars",
  "project_id": "sample-project-012",
  "production_id": "sample-production-345",
  "hosted_by": "Ada Lovelace",
  "created_by_user_id": "sample-user-345",
  "actual_start_time": "2026-07-15T16:01:23.000Z",
  "actual_end_time": "2026-07-15T17:04:08.000Z",
  "attendee_count": 142
}
```

| 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.

```json data (attendee.joined) theme={null}
{
  "event_id": "sample-webinar-123",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "email": "ada@example.com",
  "registered_at": "2026-07-01T10:15:30.000Z",
  "approved": true,
  "join_url": "https://riverside.fm/studio/product-webinars?audienceToken=sample-token-abc123",
  "participated": true,
  "joined_at": "2026-07-15T16:03:45.000Z",
  "attendance_rate": null,
  "duration": null,
  "referrer": "https://example.com/landing",
  "utm": {
    "source": "newsletter",
    "medium": "email",
    "campaign": "q3-launch",
    "term": null,
    "content": "header-cta"
  },
  "custom_fields": {
    "Company": "Acme Inc.",
    "Job Title": "Engineering Manager"
  }
}
```

| 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 }`). |
