Custom CMS Webhooks
Last updated: November 3, 2026
Keep your website or CMS in sync with your Sequel events automatically. Every time you create, update or delete an event in Sequel, Sequel sends the event details to an endpoint you control, so your site can create, update or remove the matching page.
Available on: Business, Enterprise, OEM and Elevate plans. If you're on another plan, contact Support to upgrade.
Is this the right option for you?
Custom CMS Webhooks are for teams with a developer who can build and host a small endpoint (a URL that receives the webhook and writes to your CMS). They work with any CMS or website, because you control what happens when an event arrives.
If your site runs on a CMS that Sequel connects to directly, start with the 1-click integration instead. It needs no code:
Common uses
Automatically create an event page on your website when a new event is created in Sequel.
Keep titles, dates, descriptions and banners on your site up to date as you edit events.
Remove or unpublish event pages when events are deleted.
Send extra values your CMS needs (such as a publication status or audience tags) using custom fields.
Before you begin
Make sure you have:
A publicly reachable HTTPS endpoint for each action you want to receive (create, update, delete). These can be the same URL or different ones.
A developer who can write the code that turns the webhook into a CMS entry.
Your Sequel API Client Secret (under Integrations → Sequel API) if you want to verify that requests really come from Sequel. We strongly recommend this.
A test event you can create, edit and delete safely while you build.
How it works
Action in Sequel | Webhook sent (eventType) | Sent to |
|---|---|---|
Event created (including clones) |
| Create URL |
Event updated (any save) |
| Update URL |
Event deleted |
| Delete URL |
Webhooks apply to every event in your workspace. You set one URL per action. There's no per-event setup.
Every create and update sends the full event, not just the fields that changed.
If your organization has sub-workspaces that share integrations, their events trigger the webhooks too. If you use a sub-workspace as a sandbox, use a separate endpoint or filter by
companyIdso test events don't reach your live site.
Step 1: Build your endpoint
Your endpoint needs to:
Accept an HTTP POST with a JSON body.
Verify the signature (see Verifying requests below).
Return a 2xx status quickly. Sequel ignores the response body.
Create, update or delete the matching CMS entry, using
eventIdas the unique key.
A complete example is included in Example endpoint (Node.js) below.
Step 2: Add your URLs in Sequel
Go to Marketplace → Custom → Custom CMS webhooks.
Under Webhook Setup, enter your endpoints:
Create URL: where Sequel sends new events
Update URL: where Sequel sends event changes
Delete URL: where Sequel sends deletions
Click out of each field to save it. There's no Save button. You'll see a "Webhook created successfully" confirmation.
You don't have to fill in all three. Any action without a URL isn't sent. For example, leave the Delete URL empty if you'd rather remove pages from your site by hand.
To stop webhooks: clear the URL fields. Clicking Revoke authorization on its own does not stop them.
Step 3: Test it end to end
Create a test event in Sequel. Your endpoint should receive
virtual-stage-created, and a new entry should appear in your CMS.Change the event's title or time and save. Your endpoint should receive
virtual-stage-updated, and the CMS entry should update rather than duplicate.If you use custom fields, set their values on the event (see below), save, and confirm they arrive under
cmsCustomFields.Delete the event. Your endpoint should receive
virtual-stage-deleted, and the entry should be removed or unpublished.
Tip: Sequel doesn't show a delivery log in the admin, so log every incoming request (headers and body) on your side while you build. It makes problems much easier to diagnose.
Custom fields (optional)
Custom fields let you send extra CMS-specific values with each event, such as a publication status, content category or audience tags. You define the fields once, then set values per event.
Create a custom field
On the Custom CMS page, go to Custom Fields → Add field.
Fill in:
Field name: the label your team sees in Sequel (for example "Publication Status").
Payload key: the key that appears in the webhook. Use lowercase letters, numbers and underscores only (for example
publication_status). Match it to the field name your developer expects.Field type: Single select, Multi-select or Boolean.
Options: one per line. Not used for Boolean fields.
Click Save field.
Set values on an event
Open the event and go to Details → CMS settings. Choose a value for each field and save the event. The values are sent under cmsCustomFields on the next create or update.
Field type | How it arrives in the payload |
|---|---|
Single select | A string, e.g. |
Multi-select | An array, e.g. |
Boolean |
|
Fields with no value are left out of the payload, and cmsCustomFields is omitted entirely if no field has a value. Make sure your endpoint handles missing keys.
CMS event type
Each event also has a CMS event type (0 or 1), set in the same CMS settings panel and sent as cmsEventType. It can't be changed after the event is created, so set it correctly when you create the event.
Mapping Sequel data to your CMS
A typical mapping looks like this. Adjust it to your CMS's content model.
Sequel field | Typical CMS field | Notes |
|---|---|---|
| Unique ID / external ID | Store it on the entry. Use it to find the entry on update and delete. It's also the ID used in your Sequel embed code. |
| Title | |
| Body / rich text | Arrives as raw HTML. Sanitize before rendering. |
| Start / end date | Always UTC. Convert using |
| Timezone | IANA format, e.g. |
| Featured image | Download and store it if your CMS needs its own copy. |
| Speakers | Email addresses |
| Your custom fields | Keys match the payload keys you set up. |
Tip: Store eventId on the CMS entry and use it to render the Sequel embed on the page. That way the page and the event stay linked even if the title changes.
Request reference
Method: POST
Header | Value |
|---|---|
|
|
|
|
| Unix time in seconds |
|
|
Create / update payload
{
"eventType": "virtual-stage-created",
"webHookInvocationId": "3f6c1a2e-8b1d-4c5e-9a7f-2d4b6e8c0a1b",
"correlationId": "…",
"timestamp": "2026-09-30T15:04:05.000Z",
"details": {
"companyId": "abc123",
"companyName": "Acme Corp",
"eventId": "def456",
"eventName": "Q4 Product Launch",
"description": "<p>Join us for…</p>",
"timezone": "America/New_York",
"startDate": "2026-10-15T17:00:00.000Z",
"endDate": "2026-10-15T18:00:00.000Z",
"bannerUrl": "https://…/banner.png",
"hosts": ["host@acme.com"],
"presenters": ["speaker@acme.com"],
"externalCMSItemId": "",
"cmsEventType": "0",
"cmsCustomFields": {
"publication_status": "Draft",
"audience": ["Educator", "Student"],
"featured": true
}
}
}Updates use the same payload with "eventType": "virtual-stage-updated".
Field | Notes |
|---|---|
| Which action triggered the webhook |
| Unique ID for this delivery. Useful for logging and when contacting Support. |
| When the webhook was sent (ISO-8601, UTC) |
| The workspace the event belongs to. Useful if sub-workspaces share your endpoint. |
| The Sequel event ID. Use it as your unique key. |
| Rich text sent as raw HTML |
| ISO-8601, always in UTC |
| The event's display timezone (IANA format) |
| Arrays of email addresses |
| The CMS item ID linked to this event, if one exists. Otherwise an empty string. |
| The 0 or 1 set in the event's CMS settings (sent as a string) |
| Only included if at least one custom field has a value |
Delete payload
{
"eventType": "virtual-stage-deleted",
"webHookInvocationId": "…",
"correlationId": "…",
"timestamp": "2026-09-30T15:04:05.000Z",
"details": {
"companyId": "abc123",
"eventId": "def456",
"csmExternalId": "def456"
}
}Find the CMS entry to remove by eventId. The delete payload doesn't include the event's other details, so look them up from your own records if you need them.
Verifying requests
Verifying the signature confirms the request came from Sequel and wasn't changed in transit. Sequel signs each request with your Sequel API Client Secret, found under Integrations → Sequel API. Keep the secret on your server only.
Read the
x-sequel-timestampheader and the raw request body exactly as received. Don't parse and re-serialize the JSON first, because that changes the bytes and the signature won't match.Compute
HMAC-SHA256(secret, timestamp + "." + rawBody)and hex-encode it.Compare
sha256=<your result>with thex-sequel-signatureheader using a constant-time comparison.Optionally, reject requests whose timestamp is more than a few minutes old to protect against replayed requests.
If your workspace has no Sequel API credentials, requests are sent without signature headers.
If you rotate your API Client Secret, update it on your endpoint at the same time. Otherwise every webhook will fail verification.
Best practices
Respond with a 2xx quickly. Any 2xx counts as success. Do slow work (image processing, publishing) after you've responded.
Failed deliveries are not retried. If your endpoint is down or returns an error, that delivery is lost. Because every save sends the full event, the next successful update fixes the entry. To force a resend, re-save the event in Sequel.
Make your handler idempotent. An update is sent on every save, even if nothing relevant to your CMS changed. Upsert by
eventIdinstead of assuming each call is a real change.Handle updates for events you haven't seen yet. Create the entry if an update arrives before (or instead of) the create.
Sanitize the description HTML before rendering it on your site.
Keep test and live separate. If you test in a sub-workspace, filter by
companyIdor use a separate endpoint so test events don't publish to your live site.Series and summit events: deleting a parent event may not send deletes for its child sessions. Clean those up separately if needed.
Troubleshooting
Symptom | What to check |
|---|---|
Nothing arrives | Is a URL saved for that action (did you see the confirmation)? Is the endpoint publicly reachable over HTTPS, and not blocked by a firewall or login? |
Signature doesn't match | Are you hashing the raw body, not re-serialized JSON? Are you using |
Duplicate CMS entries | Your handler is creating on every call. Upsert by |
Times are off by a few hours |
|
Custom fields missing | Were values set on the event under Details → CMS settings, and was the event saved afterwards? Keys are left out when no value is set. |
A change didn't reach the CMS | The delivery may have failed and isn't retried. Re-save the event in Sequel to send it again. |
Test events showing on your live site | Sub-workspaces that share integrations also trigger webhooks. Filter by |
Webhooks stopped working | Check your endpoint logs, then contact Sequel Support with the event ID and approximate time. We can check delivery on our side. |
FAQ
Can I send webhooks for only some events?
No. Webhooks fire for every event in the workspace. Filter on your side, for example using a custom field such as publish_to_site (Boolean).
Can I see a log of deliveries?
Not in the admin yet. Log requests on your endpoint, and contact Support if you need us to check a specific delivery.
Does editing an event send a webhook even if nothing changed?
Yes. Every save sends an update with the full event.
Can I use the same URL for create, update and delete?
Yes. Use eventType in the payload to tell them apart.