<!-- Source: https://useworkloom.com/dev/events/ · Workloom API v1 -->

# Event list

Every delivery has the same envelope. Here is what each event puts in `data`.

## The envelope

- `id` (string): This delivery. The same on every retry: ignore an id you have already handled.
- `event_id` (string, nullable): The event. The same for every endpoint that receives it.
- `type` (string): The event type, for example `deal.won`.
- `api_version` (string): Always `v1` for now.
- `workloom_version` (string): The dated version this body is shaped in: the endpoint’s.
- `livemode` (boolean): Always true: test keys change nothing, so nothing they do sends a webhook.
- `created_at` (timestamp): When this delivery was made.
- `occurred_at` (timestamp): When the event happened.

## `reply.received`

A contact wrote back: by email (to a sequence email, once Workloom has read what kind of reply it is), on LinkedIn, or by SMS.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `channel` (string): Where they replied.
- `category` (string, nullable): What kind of reply Workloom read it as. Email only; null on LinkedIn and SMS.
- `sentiment` (string, nullable): positive, neutral or negative. Email only.
- `email_id` (string, nullable): The email message, as Workloom stores it.
- `message_id` (string, nullable): The LinkedIn message or SMS, as Workloom stores it.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "reply.received",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "channel": "email",
    "category": "interested",
    "sentiment": "positive",
    "email_id": "66ff10c2e4b0a1b2c3d4ee01",
    "message_id": null
  }
}
```

## `email.opened`

A tracked email was opened. Mail apps and privacy proxies load the tracking image on their own, so one email can send several of these and an open on its own is a weak signal.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `sequence_id` (string, nullable): The sequence the email was sent from, if any.
- `mailbox_id` (string, nullable): The mailbox that sent it.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "email.opened",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "sequence_id": "66fa01d2e4b0a1b2c3d45e01",
    "mailbox_id": "66fa01d2e4b0a1b2c3d45e99"
  }
}
```

## `email.clicked`

A tracked link in an email was clicked.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `sequence_id` (string, nullable): The sequence the email was sent from, if any.
- `url` (string, nullable): The link that was clicked.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "email.clicked",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "sequence_id": "66fa01d2e4b0a1b2c3d45e01",
    "url": "https://brightline.example/pricing"
  }
}
```

## `email.bounced`

An email could not be delivered.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `email_id` (string, nullable): The email message, as Workloom stores it.
- `bounce_type` (string, nullable): hard (the address does not exist) or soft (try again later).
- `sequence_id` (string, nullable): The sequence the email was sent from, if any.
- `mailbox_id` (string, nullable): The mailbox that sent it.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "email.bounced",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "email_id": "66ff10c2e4b0a1b2c3d4ee01",
    "bounce_type": "hard",
    "sequence_id": "66fa01d2e4b0a1b2c3d45e01",
    "mailbox_id": "66fa01d2e4b0a1b2c3d45e99"
  }
}
```

## `meeting.booked`

A meeting with a known contact appeared on a connected calendar.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `meeting_id` (string, nullable): The meeting, as Workloom stores it.
- `title` (string, nullable): The meeting’s title.
- `start_at` (timestamp, nullable): When it starts.
- `provider` (string, nullable): Where it was booked: google, outlook, calendly…

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "meeting.booked",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "meeting_id": "66ff2a30e4b0a1b2c3d4ab12",
    "title": "Brightline intro call",
    "start_at": "2026-10-09T10:00:00.000Z",
    "provider": "google"
  }
}
```

## `meeting.moved`

A booked meeting moved to another time. `start_at` is the new time.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `meeting_id` (string, nullable): The meeting, as Workloom stores it.
- `title` (string, nullable): The meeting’s title.
- `start_at` (timestamp, nullable): When it starts.
- `provider` (string, nullable): Where it was booked: google, outlook, calendly…

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "meeting.moved",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "meeting_id": "66ff2a30e4b0a1b2c3d4ab12",
    "title": "Brightline intro call",
    "start_at": "2026-10-09T10:00:00.000Z",
    "provider": "google"
  }
}
```

## `meeting.cancelled`

A booked meeting was cancelled.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `meeting_id` (string, nullable): The meeting, as Workloom stores it.
- `title` (string, nullable): The meeting’s title.
- `start_at` (timestamp, nullable): When it starts.
- `provider` (string, nullable): Where it was booked: google, outlook, calendly…

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "meeting.cancelled",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "meeting_id": "66ff2a30e4b0a1b2c3d4ab12",
    "title": "Brightline intro call",
    "start_at": "2026-10-09T10:00:00.000Z",
    "provider": "google"
  }
}
```

## `meeting.held`

A meeting took place: a connected call or a meeting note in its window, or its owner said so.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `meeting_id` (string, nullable): The meeting, as Workloom stores it.
- `title` (string, nullable): The meeting’s title.
- `start_at` (timestamp, nullable): When it starts.
- `provider` (string, nullable): Where it was booked: google, outlook, calendly…

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "meeting.held",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "meeting_id": "66ff2a30e4b0a1b2c3d4ab12",
    "title": "Brightline intro call",
    "start_at": "2026-10-09T10:00:00.000Z",
    "provider": "google"
  }
}
```

## `meeting.no_show`

The meeting’s owner said the contact did not join.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `meeting_id` (string, nullable): The meeting, as Workloom stores it.
- `title` (string, nullable): The meeting’s title.
- `start_at` (timestamp, nullable): When it starts.
- `provider` (string, nullable): Where it was booked: google, outlook, calendly…

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "meeting.no_show",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "meeting_id": "66ff2a30e4b0a1b2c3d4ab12",
    "title": "Brightline intro call",
    "start_at": "2026-10-09T10:00:00.000Z",
    "provider": "google"
  }
}
```

## `booking.made`

A visitor booked through a Workloom booking page. The same booking usually also sends meeting.booked once it reaches the calendar.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `booking_page_id` (string, nullable): The booking page.
- `page_url` (string, nullable): The page they booked from.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "booking.made",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "booking_page_id": "66fb11e3e4b0a1b2c3d4b0b0",
    "page_url": "https://useworkloom.com/book-a-demo/"
  }
}
```

## `form.submitted`

A visitor submitted one of your Workloom forms.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `form_id` (string, nullable): The form.
- `page_url` (string, nullable): The page the form was on.
- `answers` (object): What they entered, by field name.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "form.submitted",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "form_id": "66fb11e3e4b0a1b2c3d4f0f0",
    "page_url": "https://useworkloom.com/book-a-demo/",
    "answers": {
      "name": "Priya Nair",
      "email": "priya@brightline.example",
      "team_size": "25"
    }
  }
}
```

## `call.logged`

A teammate finished a call and logged how it went.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `call_id` (string, nullable): The call.
- `direction` (string, nullable): Who called whom.
- `outcome` (string, nullable): The outcome the teammate picked, for example connected, meeting, no_answer, or one of your own.
- `duration_seconds` (integer, nullable): How long the call lasted.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "call.logged",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "call_id": "66ff3b41e4b0a1b2c3d4ca11",
    "direction": "outbound",
    "outcome": "meeting",
    "duration_seconds": 412
  }
}
```

## `call.missed`

Someone called one of your numbers and nobody answered.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `call_id` (string, nullable): The call.
- `from` (string, nullable): The number that called, E.164.
- `to` (string, nullable): Your number they called, E.164.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "call.missed",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "call_id": "66ff3b41e4b0a1b2c3d4ca11",
    "from": "+919820011210",
    "to": "+918045671234"
  }
}
```

## `deal.created`

A deal was opened, by a person, an automation, or the API.

**Fields in data**

- `deal_id` (string): The deal.
- `deal` (Deal): The deal as it is when the delivery is made (it may have moved on since the event).
- `stage` (string): The stage it opened in.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.created",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "deal": {
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats",
      "pipeline_id": "default",
      "stage": "proposal",
      "status": "open",
      "amount": 29900,
      "currency": "USD",
      "probability": 50,
      "forecast_category": "best_case",
      "expected_close_date": "2026-11-14T00:00:00.000Z",
      "next_step": {
        "text": "Call with VP Finance",
        "due_at": "2026-10-09T10:00:00.000Z"
      },
      "company_name": "Brightline",
      "company_domain": "brightline.example",
      "company_id": "66f19b77e4b0a1b2c3d4a1b2",
      "primary_contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
      "contacts": [
        {
          "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
          "role": "champion"
        }
      ],
      "closed_at": null,
      "close_reason_code": null,
      "owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "source": "api:Warehouse sync",
      "custom_fields": {
        "competitor": "Pipedrive"
      },
      "created_at": "2026-09-25T12:00:00.000Z",
      "updated_at": "2026-10-03T08:42:10.000Z"
    },
    "stage": "proposal"
  }
}
```

## `deal.stage_changed`

A deal moved between open stages. Won and lost are their own events.

**Fields in data**

- `deal_id` (string): The deal.
- `deal` (Deal): The deal as it is when the delivery is made (it may have moved on since the event).
- `from_stage` (string, nullable): The stage it left.
- `stage` (string): The stage it moved to.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.stage_changed",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "deal": {
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats",
      "pipeline_id": "default",
      "stage": "proposal",
      "status": "open",
      "amount": 29900,
      "currency": "USD",
      "probability": 50,
      "forecast_category": "best_case",
      "expected_close_date": "2026-11-14T00:00:00.000Z",
      "next_step": {
        "text": "Call with VP Finance",
        "due_at": "2026-10-09T10:00:00.000Z"
      },
      "company_name": "Brightline",
      "company_domain": "brightline.example",
      "company_id": "66f19b77e4b0a1b2c3d4a1b2",
      "primary_contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
      "contacts": [
        {
          "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
          "role": "champion"
        }
      ],
      "closed_at": null,
      "close_reason_code": null,
      "owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "source": "api:Warehouse sync",
      "custom_fields": {
        "competitor": "Pipedrive"
      },
      "created_at": "2026-09-25T12:00:00.000Z",
      "updated_at": "2026-10-03T08:42:10.000Z"
    },
    "from_stage": "discovery",
    "stage": "proposal"
  }
}
```

## `deal.won`

A deal moved to a won stage.

**Fields in data**

- `deal_id` (string): The deal.
- `deal` (Deal): The deal as it is when the delivery is made (it may have moved on since the event).
- `from_stage` (string, nullable): The stage it left.
- `stage` (string, nullable): The stage it is in now.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.won",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "deal": {
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats",
      "pipeline_id": "default",
      "stage": "won",
      "status": "won",
      "amount": 29900,
      "currency": "USD",
      "probability": 100,
      "forecast_category": "best_case",
      "expected_close_date": "2026-11-14T00:00:00.000Z",
      "next_step": {
        "text": "Call with VP Finance",
        "due_at": "2026-10-09T10:00:00.000Z"
      },
      "company_name": "Brightline",
      "company_domain": "brightline.example",
      "company_id": "66f19b77e4b0a1b2c3d4a1b2",
      "primary_contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
      "contacts": [
        {
          "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
          "role": "champion"
        }
      ],
      "closed_at": "2026-10-07T09:12:40.000Z",
      "close_reason_code": null,
      "owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "source": "api:Warehouse sync",
      "custom_fields": {
        "competitor": "Pipedrive"
      },
      "created_at": "2026-09-25T12:00:00.000Z",
      "updated_at": "2026-10-03T08:42:10.000Z"
    },
    "from_stage": "commit",
    "stage": "won"
  }
}
```

## `deal.lost`

A deal moved to a lost stage. `deal.close_reason_code` says why.

**Fields in data**

- `deal_id` (string): The deal.
- `deal` (Deal): The deal as it is when the delivery is made (it may have moved on since the event).
- `from_stage` (string, nullable): The stage it left.
- `stage` (string, nullable): The stage it is in now.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.lost",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "deal": {
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats",
      "pipeline_id": "default",
      "stage": "proposal",
      "status": "open",
      "amount": 29900,
      "currency": "USD",
      "probability": 50,
      "forecast_category": "best_case",
      "expected_close_date": "2026-11-14T00:00:00.000Z",
      "next_step": {
        "text": "Call with VP Finance",
        "due_at": "2026-10-09T10:00:00.000Z"
      },
      "company_name": "Brightline",
      "company_domain": "brightline.example",
      "company_id": "66f19b77e4b0a1b2c3d4a1b2",
      "primary_contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
      "contacts": [
        {
          "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
          "role": "champion"
        }
      ],
      "closed_at": null,
      "close_reason_code": null,
      "owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "source": "api:Warehouse sync",
      "custom_fields": {
        "competitor": "Pipedrive"
      },
      "created_at": "2026-09-25T12:00:00.000Z",
      "updated_at": "2026-10-03T08:42:10.000Z"
    },
    "from_stage": "discovery",
    "stage": "proposal"
  }
}
```

## `deal.parked`

A deal was taken off the board until a date.

**Fields in data**

- `deal_id` (string): The deal.
- `deal` (Deal): The deal as it is when the delivery is made (it may have moved on since the event).
- `from_stage` (string, nullable): The stage it left.
- `stage` (string, nullable): The stage it is in now.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.parked",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "deal": {
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats",
      "pipeline_id": "default",
      "stage": "proposal",
      "status": "open",
      "amount": 29900,
      "currency": "USD",
      "probability": 50,
      "forecast_category": "best_case",
      "expected_close_date": "2026-11-14T00:00:00.000Z",
      "next_step": {
        "text": "Call with VP Finance",
        "due_at": "2026-10-09T10:00:00.000Z"
      },
      "company_name": "Brightline",
      "company_domain": "brightline.example",
      "company_id": "66f19b77e4b0a1b2c3d4a1b2",
      "primary_contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
      "contacts": [
        {
          "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
          "role": "champion"
        }
      ],
      "closed_at": null,
      "close_reason_code": null,
      "owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "source": "api:Warehouse sync",
      "custom_fields": {
        "competitor": "Pipedrive"
      },
      "created_at": "2026-09-25T12:00:00.000Z",
      "updated_at": "2026-10-03T08:42:10.000Z"
    },
    "from_stage": "discovery",
    "stage": "proposal"
  }
}
```

## `deal.returned`

A parked deal came back to the board.

**Fields in data**

- `deal_id` (string): The deal.
- `deal` (Deal): The deal as it is when the delivery is made (it may have moved on since the event).
- `from_stage` (string, nullable): The stage it left.
- `stage` (string, nullable): The stage it is in now.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.returned",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "deal": {
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats",
      "pipeline_id": "default",
      "stage": "proposal",
      "status": "open",
      "amount": 29900,
      "currency": "USD",
      "probability": 50,
      "forecast_category": "best_case",
      "expected_close_date": "2026-11-14T00:00:00.000Z",
      "next_step": {
        "text": "Call with VP Finance",
        "due_at": "2026-10-09T10:00:00.000Z"
      },
      "company_name": "Brightline",
      "company_domain": "brightline.example",
      "company_id": "66f19b77e4b0a1b2c3d4a1b2",
      "primary_contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
      "contacts": [
        {
          "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
          "role": "champion"
        }
      ],
      "closed_at": null,
      "close_reason_code": null,
      "owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "source": "api:Warehouse sync",
      "custom_fields": {
        "competitor": "Pipedrive"
      },
      "created_at": "2026-09-25T12:00:00.000Z",
      "updated_at": "2026-10-03T08:42:10.000Z"
    },
    "from_stage": "discovery",
    "stage": "proposal"
  }
}
```

## `deal.amount_changed`

A deal’s amount changes.

**Fields in data**

- `deal_id` (string): The deal.
- `from` (number or string, nullable): The value before.
- `to` (number or string, nullable): The value now.
- `direction` (string, nullable): Which way it moved: up or down.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.amount_changed",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "from": 24000,
    "to": 29900,
    "direction": "up"
  }
}
```

## `deal.close_date_changed`

A deal’s close date changes.

**Fields in data**

- `deal_id` (string): The deal.
- `from` (number or string, nullable): The value before.
- `to` (number or string, nullable): The value now.
- `direction` (string, nullable): Which way it moved: earlier or later.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.close_date_changed",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "from": "2026-11-14T00:00:00.000Z",
    "to": "2026-11-21T00:00:00.000Z",
    "direction": "later"
  }
}
```

## `tell.fired`

Workloom spotted a buying signal on a contact or their company: a job change, funding, hiring, a pricing page visit…

**Fields in data**

- `tell_id` (string, nullable): The Tell.
- `kind` (string, nullable): job_change, promotion, leadership_change, funding, hiring, news_mention, tech_change, website_change, review_posted, linkedin_post, competitor_mention, email_found or website_visit.
- `title` (string, nullable): What happened, in a line.
- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `company_id` (string, nullable): The company it is about. Fetch it with GET /companies/{id}.
- `on_open_deal` (boolean, nullable): Whether the contact or company has an open deal.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "tell.fired",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "tell_id": "66ff4c52e4b0a1b2c3d4fe77",
    "kind": "funding",
    "title": "Brightline raised a Series B",
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "company_id": "66f19b77e4b0a1b2c3d4a1b2",
    "on_open_deal": true
  }
}
```

## `contact.created`

A new contact was added to the workspace: by hand, an import, a form, Quarry, the API…

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `company_id` (string, nullable): The company it is about. Fetch it with GET /companies/{id}.
- `source` (string, nullable): How they were added, for example import, form, quarry, by_hand, api.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "contact.created",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "company_id": "66f19b77e4b0a1b2c3d4a1b2",
    "source": "import"
  }
}
```

## `company.created`

A new company was added to the workspace.

**Fields in data**

- `company_id` (string, nullable): The company it is about. Fetch it with GET /companies/{id}.
- `source` (string, nullable): How it was added.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "company.created",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "company_id": "66f19b77e4b0a1b2c3d4a1b2",
    "source": "by_hand"
  }
}
```

## `record.owner_changed`

A contact, company or deal was handed to another teammate.

**Fields in data**

- `record_type` (string): What kind of record.
- `record_id` (string): The record.
- `from_owner_seat_id` (string, nullable): Who owned it before. Null when nobody did.
- `to_owner_seat_id` (string, nullable): Who owns it now. Null when nobody does.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "record.owner_changed",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "record_type": "contact",
    "record_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "from_owner_seat_id": null,
    "to_owner_seat_id": "66e0f1a2e4b0a1b2c3d40a0b"
  }
}
```

## `contact.updated`

A field on a contact changed (other than its owner, which has its own event). One delivery per field; the deliveries from one edit share `batch_id`.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `field` (string): Which field, by its API name (`title`, `email`, `custom_fields.<key>` for your own).
- `from` (object): The value before. Any JSON type.
- `to` (object): The value now. Any JSON type.
- `from_display` (string, nullable): The value before, in words, where Workloom has words for it.
- `to_display` (string, nullable): The value now, in words.
- `batch_id` (string, nullable): Shared by every field changed in the same edit.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "contact.updated",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "field": null,
    "from": "+919820011210",
    "to": "+918045671234",
    "from_display": null,
    "to_display": null,
    "batch_id": null
  }
}
```

## `contact.deleted`

A contact was deleted, in Workloom or over the API. A contact deleted over the API stays on the do-not-contact list.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `name` (string, nullable): The contact’s name when it was deleted.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "contact.deleted",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "name": null
  }
}
```

## `company.updated`

A field on a company changed (other than its owner, which has its own event). One delivery per field; the deliveries from one edit share `batch_id`.

**Fields in data**

- `company_id` (string, nullable): The company it is about. Fetch it with GET /companies/{id}.
- `field` (string): Which field, by its API name (`custom_fields.<key>` for your own).
- `from` (object): The value before. Any JSON type.
- `to` (object): The value now. Any JSON type.
- `from_display` (string, nullable): The value before, in words, where Workloom has words for it.
- `to_display` (string, nullable): The value now, in words.
- `batch_id` (string, nullable): Shared by every field changed in the same edit.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "company.updated",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "company_id": "66f19b77e4b0a1b2c3d4a1b2",
    "field": null,
    "from": "+919820011210",
    "to": "+918045671234",
    "from_display": null,
    "to_display": null,
    "batch_id": null
  }
}
```

## `company.deleted`

A company was deleted.

**Fields in data**

- `company_id` (string, nullable): The company it is about. Fetch it with GET /companies/{id}.
- `name` (string, nullable): The company’s name when it was deleted.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "company.deleted",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "company_id": "66f19b77e4b0a1b2c3d4a1b2",
    "name": null
  }
}
```

## `deal.updated`

A field on a deal changed (other than its stage, amount, close date and owner, which have their own events). One delivery per field; the deliveries from one edit share `batch_id`.

**Fields in data**

- `deal_id` (string): The deal.
- `field` (string): Which field, by its API name (`custom_fields.<key>` for your own).
- `from` (object): The value before. Any JSON type.
- `to` (object): The value now. Any JSON type.
- `from_display` (string, nullable): The value before, in words, where Workloom has words for it.
- `to_display` (string, nullable): The value now, in words.
- `batch_id` (string, nullable): Shared by every field changed in the same edit.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.updated",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "field": null,
    "from": "+919820011210",
    "to": "+918045671234",
    "from_display": null,
    "to_display": null,
    "batch_id": null
  }
}
```

## `deal.deleted`

A deal was deleted.

**Fields in data**

- `deal_id` (string): The deal.
- `name` (string, nullable): The deal’s name when it was deleted.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "deal.deleted",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "deal_id": "66f5c3d1e4b0a1b2c3d4c3d4",
    "name": null
  }
}
```

## `contact.unsubscribed`

A contact was opted out of every channel: they asked in a reply, a teammate marked them, a weave suppressed them, or they were deleted over the API.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `source` (string, nullable): reply, weave, person_360 (a teammate on the record), work_session, api… Open-ended.
- `channels` (array of string): The channels they are opted out of.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "contact.unsubscribed",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "source": "import",
    "channels": null
  }
}
```

## `email.sent`

An email left one of your mailboxes: a sequence step, a weave, a teammate’s reply or a send from the inbox. `contact_id` is the contact with that address, when there is one.

**Fields in data**

- `contact_id` (string, nullable): The contact it is about. Fetch it with GET /contacts/{id}.
- `email_id` (string, nullable): The email message, as Workloom stores it.
- `mailbox_id` (string, nullable): The mailbox that sent it.
- `to` (string, nullable): The address it went to.
- `subject` (string, nullable): Its subject line.
- `message_id` (string, nullable): The message id the mail provider gave it.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "email.sent",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "contact_id": "66f2a1c0e4b0a1b2c3d4e5f6",
    "email_id": "66ff10c2e4b0a1b2c3d4ee01",
    "mailbox_id": "66fa01d2e4b0a1b2c3d45e99",
    "to": "+918045671234",
    "subject": {
      "type": "deal",
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats"
    },
    "message_id": null
  }
}
```

## `activity_log.event`

Every entry in your Activity log (Settings › Security), as a sentence and as data. Includes sign-ins with the device and a masked address, so it is never part of `*`: choose it by name. Not part of `*`: subscribe to it by name.

**Fields in data**

- `id` (string): The Activity log entry.
- `text` (string): The entry as a sentence, for example "Asha moved Northwind to Proposal".
- `action` (string): What happened, for example deal.stage_moved, seat.invited, auth.signed_in.
- `category` (string, nullable): pipeline, records, rules, outreach, team, security, credits, sync or settings.
- `source` (string, nullable): Where in Workloom it happened.
- `actor` (object): `{ kind, name }`. kind is person, wren, rule, integration or system.
- `subject` (object, nullable): `{ type, id, name }` of the record it is about.
- `changes` (array of object): Each changed field, `{ field, from, to }`.
- `details` (object): Anything else the entry records.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "activity_log.event",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "id": "evt_66ff5d63e4b0a1b2c3d4aa01",
    "text": "Asha Rao moved Brightline, 10 seats to Proposal",
    "action": "deal.stage_moved",
    "category": "pipeline",
    "source": "pipeline",
    "actor": {
      "kind": "person",
      "name": "Asha Rao"
    },
    "subject": {
      "type": "deal",
      "id": "66f5c3d1e4b0a1b2c3d4c3d4",
      "name": "Brightline, 10 seats"
    },
    "changes": [
      {
        "field": "stage",
        "from": "discovery",
        "to": "proposal"
      }
    ],
    "details": {}
  }
}
```

## `webhook.test`

Sent only by "Send a test" in Settings › API and webhooks, never on its own.

**Fields in data**

- `message` (string): A sentence saying the endpoint works.

**Example payload**

```json
{
  "id": "whd_3f1c0d9a2b7e44c1a8d6b5f0",
  "event_id": "evt_66ff5d63e4b0a1b2c3d4aa01",
  "type": "webhook.test",
  "api_version": "v1",
  "workloom_version": "2026-10-07",
  "livemode": true,
  "created_at": "2026-10-07T09:12:44.000Z",
  "occurred_at": "2026-10-07T09:12:40.000Z",
  "data": {
    "message": "If you can read this, your endpoint and signature check work."
  }
}
```
