Event Types
The complete catalog of webhook events you can subscribe to, grouped by resource, which ones actually fire, and example payloads.
These are every event key defined in the platform's event catalog and selectable when creating a webhook. Every delivery uses the standard payload envelope; the per-event fields below appear inside data.object.
Not every event listed here is actually dispatched yet. Events marked Reserved are defined and selectable in the webhook-creation checkboxes, but no code path triggers them today — subscribing won't error, you'll simply never receive a delivery for them. Only Live events are guaranteed to fire.
Forms
| Event | Status | Fired when |
|---|---|---|
form.submission.created | Live | A form is successfully submitted. |
form.submission.status_changed | Reserved | Would fire when a submission's status changes (e.g. marked spam or archived) — no such status-change flow dispatches it today. |
{
"id": "evt_e798e4f1-6712-4f38-a15d-8be167cdfa77",
"event": "form.submission.created",
"created": "2026-06-06T12:00:00.000Z",
"apiVersion": "2026-05-01",
"workspaceId": "ws_abc123",
"siteId": "site_xyz456",
"data": {
"object": {
"id": "sub_9f2",
"formId": "form_77",
"workspaceId": "ws_abc123",
"siteId": "site_xyz456",
"pageId": "page_5",
"data": {
"full_name": "Jane Doe",
"email": "[email protected]",
"message": "Hello!"
},
"status": "NEW",
"ipAddress": "203.0.113.10",
"userAgent": "Mozilla/5.0...",
"referrer": "https://google.com",
"submittedAt": "2026-06-06T12:00:00.000Z"
}
}
}Sites
| Event | Status | Fired when |
|---|---|---|
site.created | Live | A new site is created. |
site.updated | Live | Site configuration changes. |
site.deleted | Live | A site is deleted. |
site.published | Reserved | Would fire when a page on the site is published — the real publish flow doesn't dispatch it today. |
{
"id": "evt_d6a8a4f1-8172-4d38-b15d-9be267cdfa11",
"event": "site.updated",
"created": "2026-06-06T12:00:00.000Z",
"apiVersion": "2026-05-01",
"workspaceId": "ws_abc123",
"siteId": "site_xyz456",
"data": {
"object": {
"id": "site_xyz456",
"name": "Acme Marketing",
"slug": "acme-marketing",
"workspaceId": "ws_abc123",
"subdomain": "acme",
"customDomain": "www.acme.com",
"domainStatus": "active",
"createdAt": "2026-06-06T10:00:00.000Z",
"updatedAt": "2026-06-06T12:00:00.000Z"
}
}
}This is a representative subset — the real site.created/site.updated payload carries many more fields (domains, theme, SEO settings, AI profile, and more). site.deleted uses a much smaller shape instead: just id, name, and workspaceId.
Blog
| Event | Status | Fired when |
|---|---|---|
blog.post.created | Live | A blog post draft is created. |
blog.post.updated | Live | A post is modified. |
blog.post.published | Live | A post is published. |
blog.post.deleted | Live | A post is deleted. |
{
"id": "evt_c498e4f1-9872-4f38-a15d-0be167cdfa88",
"event": "blog.post.published",
"created": "2026-06-06T12:00:00.000Z",
"apiVersion": "2026-05-01",
"workspaceId": "ws_abc123",
"siteId": "site_xyz456",
"data": {
"object": {
"postId": "post_789",
"siteId": "site_xyz456",
"title": "Welcome to the New Era",
"slug": "welcome-to-the-new-era",
"publishedAt": "2026-06-06T12:00:00.000Z"
}
}
}Field-naming inconsistency: blog.post.published keys the post as postId, while blog.post.created, blog.post.updated, and blog.post.deleted all key it as id instead. Handle both if you're consuming all four events.
CMS Collections
| Event | Status | Fired when |
|---|---|---|
collection.item.created | Live | A collection item is created. |
collection.item.updated | Live | A collection item is updated. |
collection.item.deleted | Live | A collection item is deleted. |
{
"id": "evt_b398e4f1-1272-4f38-a15d-1be167cdfa99",
"event": "collection.item.created",
"created": "2026-06-06T12:00:00.000Z",
"apiVersion": "2026-05-01",
"workspaceId": "ws_abc123",
"siteId": "site_xyz456",
"data": {
"object": {
"id": "item_foo",
"collectionId": "col_bar",
"siteId": "site_xyz456",
"data": {
"name": "Jane Doe",
"role": "Software Engineer"
},
"collectionName": "Team Members",
"collectionSlug": "team-members",
"createdAt": "2026-06-06T12:00:00.000Z",
"updatedAt": "2026-06-06T12:00:00.000Z"
}
}
}collection.item.deleted omits data, createdAt, and updatedAt — it only carries id, collectionId, siteId, collectionName, and collectionSlug.
Domains
The webhook-creation checklist groups these under Domains.
| Event | Status | Fired when |
|---|---|---|
domain.verified | Reserved | Would fire when a custom domain passes DNS verification — not dispatched by any code path today. |
domain.failed | Reserved | Would fire when a custom domain fails verification — likewise not dispatched today. |
No example payload — since neither event is ever dispatched, there's no real payload shape to show. Subscribing to either is a no-op today.
Billing
| Event | Status | Fired when |
|---|---|---|
subscription.updated | Reserved | Would fire when a workspace subscription changes plan or limits — not dispatched today. |
subscription.cancelled | Reserved | Would fire when a subscription is cancelled — not dispatched today. |
Both billing events are Reserved — neither is dispatched by any code path today. If you need to track subscription state externally, poll GET /workspaces/:workspaceId instead. See Subscription Management for the lifecycle these would have reflected.
Members
The webhook-creation checklist groups these under Members.
| Event | Status | Fired when |
|---|---|---|
member.invited | Reserved | Would fire when a new workspace member is invited — not dispatched today. |
member.joined | Reserved | Would fire when a pending member accepts their invitation — not dispatched today. |
No example payload — since neither event is ever dispatched, there's no real payload shape to show. Subscribing to either is a no-op today.
Related
- Webhooks — Set up endpoints, verify signatures, and handle retries.
- API Reference — Create and manage webhook subscriptions via REST.
- API Overview — Base URL, formats, errors, and rate limits.
