Webivio can send webinar events to any URL (JSON) - Make, Zapier, Pabbly, n8n, or your own system.
This is the outbound direction (Webivio -> your endpoint). The reverse direction (your system registers a participant in Webivio) is described in Registration API.
Mailing and CRM in the webinar creator are a separate path - account webhooks do not replace them.
How to set it up
- Settings menu -> Integrations.
- Webhooks tab.
- Add a destination URL and select events.
- Optionally scope the endpoint to one webinar (or leave "all webinars on the account").
- Save the HMAC secret - shown on create; you can rotate it later in the panel.
- Test with webhook.site or a Zapier Catch Hook.
Live URL, secret, and delivery logs: /auth/settings/integrations (Webhooks tab).
Request format (envelope)
Every POST body is JSON:
{
"id": "event-uuid",
"type": "webinar.registration.created",
"created_at": "2026-07-24T12:00:00.000Z",
"user_id": "account-owner-uuid",
"webinar_id": "webinar-uuid",
"data": {}
}
| Field | Description |
|---|---|
id | Event id (delivery deduplication) |
type | Event type (see table below) |
created_at | Event time (ISO UTC) |
user_id | Webivio account owner id |
webinar_id | Webinar id |
data | Type-specific fields |
HTTP headers and HMAC signature
| Header | Value |
|---|---|
Content-Type | application/json |
User-Agent | Webivio-Webhooks/1.0 |
X-Webivio-Event | Same string as body type |
X-Webivio-Timestamp | Unix time (seconds) as string |
X-Webivio-Signature | v1= + HMAC-SHA256 hex |
Signature: HMAC-SHA256 with the endpoint secret over:
{timestamp}.{rawBody}
where rawBody is the exact JSON body bytes sent.
Response timeout: 8 seconds. Success: HTTP 2xx.
Retries
On network errors or non-2xx responses, Webivio queues the delivery and retries (max 8 attempts). Backoff in minutes: 1 -> 5 -> 15 -> 60 -> 360. Status and history: in the panel for that endpoint.
Event list
type | When | In UI (selectable) |
|---|---|---|
webinar.registration.created | New registration (form, widget, registration API, series) | Yes |
webinar.attendance.joined | Participant joined the room | Yes |
webinar.attendance.left | Participant left the room | Emitted; may be missing from the UI select |
webinar.attendance.not_attended | Marked as not attended | Yes |
webinar.offer.clicked | Offer click in the room | Yes |
webinar.watch.milestone_25 / _50 / _75 / _100 | Watch % threshold | Yes |
webinar.watch.custom_minute | Watch minute reached (when subscribed) | Yes |
webinar.replay.watched | First replay open | Yes |
webinar.purchase.completed | Purchase recorded (pixel / post-sale webhook) | Yes |
data fields - registration
{
"participant_id": "…",
"email": "jane@example.com",
"name": "Jane",
"surname": "Doe",
"phone": "+48123456789",
"access_code": "a1b2c3d4",
"registered_at": "2026-07-24T12:00:00.000Z",
"registered_at_local_time": "…",
"registration_time_zone": "Europe/Warsaw",
"utm_source": "…",
"utm_medium": "…",
"utm_campaign": "…",
"utm_term": null,
"utm_content": null,
"referrer": null,
"assigned_variant": "A"
}
For series registrations, fields such as series_id and series_registration_id may be included.
data fields - attendance and offer
- joined:
participant_id,email,name,surname,access_code,joined_at,variant - left:
participant_id,email,access_code,left_at,variant - not_attended:
participant_id,email,access_code,detected_at,variant - offer.clicked:
participant_id,email,access_code,offer_id,offer_url,clicked_at,variant
data fields - watch / replay / purchase
- milestone_*:
participant_id,email,access_code,milestone_percent,previous_percent,current_percent,current_minute,duration_minutes,occurred_at,variant - custom_minute:
participant_id,email,access_code,minute,current_percent,duration_minutes,occurred_at,variant - replay.watched:
participant_id,email,access_code,watched_at - purchase.completed:
participant_id,email,access_code,order_id,amount,currency,buyer_email,source,attribution,raw_payload
Zapier (Webivio -> Zapier)
- In Zapier create a Zap -> trigger Webhooks by Zapier -> Catch Hook.
- Copy the Catch Hook URL.
- In Webivio: Settings -> Integrations -> Webhooks -> add that URL and select events (e.g.
webinar.registration.created). - Trigger a test (register a test participant) or wait for a real event.
- In later Zap steps map
data.email,data.name,type,webinar_id.
HMAC verification in Zapier: optional Code step computing HMAC-SHA256 over X-Webivio-Timestamp + raw body vs X-Webivio-Signature.
Make / n8n
- Make: Custom webhook module -> paste URL into Webivio -> map
data.*. - n8n: Webhook node (POST) -> use
body.data.emailetc. in the workflow.
Example flow
Typical funnel: registration in Webivio -> outbound webinar.registration.created -> Zapier adds a contact to MailerLite / ActiveCampaign / Google Sheets.
Or: offer click -> webinar.offer.clicked -> CRM tag "clicked offer".
Related: post-sale webhook (inbound)
To report a purchase from an external checkout into Webivio, use the inbound post-sale URL (separate token in the creator Finish / sales tracking step) - POST /api/public/post-sale-webhook?webinarId=&token=. On success Webivio may emit outbound webinar.purchase.completed. See Pixels and scripts and the creator instructions.
See also
- Participant registration API
- Panel:
/auth/settings/integrations
Future ideas (non-production)
The following is not available in the product - only directions we are considering:
- HMAC verification snippets in docs
attendance.leftalways visible in the event UI- OpenAPI / Postman collection
More ideas (account API key, GET participants): internal product roadmap.