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)

virtual-stage-created

Create URL

Event updated (any save)

virtual-stage-updated

Update URL

Event deleted

virtual-stage-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 companyId so test events don't reach your live site.

Step 1: Build your endpoint

Your endpoint needs to:

  1. Accept an HTTP POST with a JSON body.

  2. Verify the signature (see Verifying requests below).

  3. Return a 2xx status quickly. Sequel ignores the response body.

  4. Create, update or delete the matching CMS entry, using eventId as the unique key.

A complete example is included in Example endpoint (Node.js) below.

Step 2: Add your URLs in Sequel

  1. Go to Marketplace → Custom → Custom CMS webhooks.

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

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

  1. Create a test event in Sequel. Your endpoint should receive virtual-stage-created, and a new entry should appear in your CMS.

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

  3. If you use custom fields, set their values on the event (see below), save, and confirm they arrive under cmsCustomFields.

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

  1. On the Custom CMS page, go to Custom Fields → Add field.

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

  3. 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. "Draft"

Multi-select

An array, e.g. ["Educator", "Student"]

Boolean

true or false

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

eventId

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.

eventName

Title

description

Body / rich text

Arrives as raw HTML. Sanitize before rendering.

startDate, endDate

Start / end date

Always UTC. Convert using timezone for display.

timezone

Timezone

IANA format, e.g. America/New_York

bannerUrl

Featured image

Download and store it if your CMS needs its own copy.

presenters

Speakers

Email addresses

cmsCustomFields.*

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

content-type

application/json

user-agent

introvoke-web-hook

x-sequel-timestamp

Unix time in seconds

x-sequel-signature

sha256=<hex HMAC-SHA256> (see Verifying requests)

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

eventType

Which action triggered the webhook

webHookInvocationId

Unique ID for this delivery. Useful for logging and when contacting Support.

timestamp

When the webhook was sent (ISO-8601, UTC)

companyId / companyName

The workspace the event belongs to. Useful if sub-workspaces share your endpoint.

eventId

The Sequel event ID. Use it as your unique key.

description

Rich text sent as raw HTML

startDate / endDate

ISO-8601, always in UTC

timezone

The event's display timezone (IANA format)

hosts / presenters

Arrays of email addresses

externalCMSItemId

The CMS item ID linked to this event, if one exists. Otherwise an empty string.

cmsEventType

The 0 or 1 set in the event's CMS settings (sent as a string)

cmsCustomFields

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.

  1. Read the x-sequel-timestamp header 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.

  2. Compute HMAC-SHA256(secret, timestamp + "." + rawBody) and hex-encode it.

  3. Compare sha256=<your result> with the x-sequel-signature header using a constant-time comparison.

  4. 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 eventId instead 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 companyId or 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 timestamp + "." + body? Are you using the current API Client Secret?

Duplicate CMS entries

Your handler is creating on every call. Upsert by eventId instead.

Times are off by a few hours

startDate and endDate are UTC. Convert using timezone before displaying.

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

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.