Skip to content
Webhooks

Events

Every event, when it's sent, and the fields it carries.

The fields below are a contract: we may add fields, but we never rename or remove one. Ignore the ones you don't know. All times are ISO 8601 in UTC, and money is in cents.

There is no event for "a customer", because a customer is worked out from a business's records and has no moment of being created. To follow people, use the events that make the records.

lead.created

A message came in from a form on the site. Messages that look like spam are never sent.

{
  "id": "…", "type": "lead.created", "created": "2026-11-02T14:05:00.000Z",
  "business": { "id": "…", "name": "Clay Co" },
  "data": {
    "id": "ckx…",
    "form": "Quote request",
    "page": "/contact",
    "name": "Dana Reyes",
    "email": "dana@example.com",
    "phone": "+1 828 555 0100",
    "message": "Hi, can you quote a patio?",
    "fields": [{ "label": "Budget", "value": "$5,000" }],
    "language": null,
    "consent": true,
    "photos": 2,
    "receivedAt": "2026-11-02T14:05:00.000Z"
  }
}

fields holds the form's other questions in the order it asks them. photos is how many photos came with it; the photos themselves aren't sent. language is "es" for a message sent from the Spanish pages, otherwise null.

lead.stage_changed

A lead moved to another stage, from the Inbox, the dashboard, a reply or a message to your business's assistant. Putting a lead in the stage it already has sends nothing.

"data": {
  "id": "ckx…",
  "stage": "won",
  "previousStage": "quoted",
  "name": "Dana Reyes",
  "email": "dana@example.com",
  "changedAt": "2026-11-03T09:12:00.000Z"
}

stage and previousStage are new, replied, quoted, won or lost. A message with no stage is new. id is the same as the lead.created event's.

contact.subscribed

Someone joined your email list, and agreed to get your news: they confirmed a signup, or you added them and ticked that they agreed. Someone who was already on the list sends nothing, and a person who signed up but hasn't confirmed isn't sent yet.

"data": {
  "id": "ckx…",
  "email": "dana@example.com",
  "name": "Dana Reyes",
  "tags": ["workshops"],
  "source": "form",
  "subscribedAt": "2026-11-02T14:06:00.000Z"
}

source says where they came from: signup, form, booking, order, import or added.

booking.created

A booking, a request waiting for you, or a spot on a waitlist, for an appointment, a visit, an event, a table or a stay.

"data": {
  "id": "ckx…",
  "status": "confirmed",
  "kind": "event",
  "title": "Pottery class",
  "date": "2026-11-05",
  "startsAt": "2026-11-05T23:00:00.000Z",
  "endsAt": "2026-11-06T00:30:00.000Z",
  "people": 2,
  "name": "Dana Reyes",
  "email": "dana@example.com",
  "phone": "",
  "paidCents": 4500,
  "source": "site"
}

status is confirmed, requested (waiting for you to confirm) or waitlisted. kind is appointment, visit, event, reservation or stay. date is the day in your business's time zone. For a stay it is the check-in date, and endDate is the check-out date (the last day, for a room charged by the day); people is the guests, and startsAt and endsAt are the check-in and check-out moments. source is site for a customer's booking or owner for one you added.

order.created

Someone paid for an order in your online store.

"data": {
  "id": "ckx…",
  "number": 1001,
  "status": "new",
  "name": "Dana Reyes",
  "email": "dana@example.com",
  "phone": "",
  "delivery": "pickup",
  "items": [{ "name": "Mug", "quantity": 2, "unitCents": 1800 }],
  "subtotalCents": 3600,
  "shippingCents": 0,
  "taxCents": 0,
  "discountCents": 0,
  "totalCents": 3600,
  "createdAt": "2026-11-02T15:00:00.000Z"
}

delivery is pickup, shipping or none.

webhook.test

Sent only when you press Send a test. It has the same envelope and "data": { "message": "…" }. You can't subscribe to it, and a failed test isn't retried or counted against the address.