Webhook-gebeurtenissen
Elke gebeurtenis, wanneer die wordt verstuurd, en van elk een voorbeeld-payload.
Dit zijn de gebeurtenissen die een endpoint kan ontvangen. Je kiest ze per endpoint onder Integraties → API → Webhooks; hoe bezorgingen, handtekeningen en nieuwe pogingen werken, staat in Webhooks. Elke voorbeeld-payload hieronder komt uit de eigen test van Schedulinq, dus hij heeft precies de vorm die je endpoint ontvangt.
De payload
Elk bericht is een envelop:
type— de gebeurtenis, zoalsappointment.created;timestamp— wanneer de wijziging gebeurde, in UTC;data— de afspraak, uitnodiging of het teamlid zoals die na de wijziging is, in dezelfde vorm als de API die uitleest (zie de referentie).
data bevat daarnaast:
metadata— je kenmerken,{}als er geen zijn;version— een getal dat per afspraak, uitnodiging of teamlid oploopt. Bewaar het hoogste dat je verwerkte, en sla een gebeurtenis met een lager getal over. Versies kunnen nummers overslaan;changedBy— wie de wijziging deed.typeisUSER(een teamlid, metuserId),API_KEY(je eigen systeem, metapiKeyId),CUSTOMER,SYSTEM(Schedulinq zelf),INTEGRATION(Teamleader) ofCALENDAR_SYNC(een gekoppelde agenda);- alleen bij
appointment.rescheduled:previous, met destart,endenuserIdsvan vóór de wijziging; - bij
colleague.activated: deinvitationIdvan de geaccepteerde uitnodiging en de kenmerken van die uitnodiging.
Een payload bevat nooit de naam, het e-mailadres of het telefoonnummer van een klant, en nooit een boekingslink.
Afspraken
appointment.created
Een afspraak is geboekt: in het dashboard (ook vanuit een planningslink), door de klant op de boekingspagina of vanuit een uitnodiging, of vanuit Teamleader of een gekoppelde agenda.
Voorbeeldbericht
{
"type": "appointment.created",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"status": "CONFIRMED",
"start": "2026-10-14T10:00:00+02:00",
"end": "2026-10-14T11:00:00+02:00",
"timeZone": "Europe/Amsterdam",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"locationMode": "AT_CUSTOMER",
"address": {
"line1": "Keizersgracht 100",
"postalCode": "1015 AA",
"city": "Amsterdam",
"country": "NL"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "API_KEY",
"apiKeyId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e0a"
}
}
}appointment.rescheduled
Het begin, het einde of de teamleden zijn gewijzigd. Een klant die de eigen afspraak
verzet, krijgt een nieuwe afspraak: deze gebeurtenis komt dan binnen op het nieuwe
id, met rescheduledFromId voor de oude en previous met de oude tijden. Voor de oude
wordt geen aparte appointment.cancelled verstuurd.
Voorbeeldbericht
{
"type": "appointment.rescheduled",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"status": "CONFIRMED",
"start": "2026-10-14T10:00:00+02:00",
"end": "2026-10-14T11:00:00+02:00",
"timeZone": "Europe/Amsterdam",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"locationMode": "AT_CUSTOMER",
"address": {
"line1": "Keizersgracht 100",
"postalCode": "1015 AA",
"city": "Amsterdam",
"country": "NL"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"rescheduledFromId": "00000000-0000-0000-0000-000000000001",
"lineageRootId": "00000000-0000-0000-0000-000000000001",
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "CUSTOMER"
},
"previous": {
"start": "2026-10-13T14:00:00+02:00",
"end": "2026-10-13T15:00:00+02:00",
"userIds": [
"3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
]
}
}
}appointment.updated
Er is iets anders aan de afspraak gewijzigd, zoals de dienst, de plek of de vergaderlink.
Voorbeeldbericht
{
"type": "appointment.updated",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"status": "CONFIRMED",
"start": "2026-10-14T10:00:00+02:00",
"end": "2026-10-14T11:00:00+02:00",
"timeZone": "Europe/Amsterdam",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"locationMode": "AT_CUSTOMER",
"address": {
"line1": "Keizersgracht 100",
"postalCode": "1015 AA",
"city": "Amsterdam",
"country": "NL"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 2,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}appointment.cancelled
Geannuleerd door de klant, een teamlid, een gekoppelde agenda of Teamleader, of omdat de
klant is verwijderd. cancelledBy zegt door wie.
Voorbeeldbericht
{
"type": "appointment.cancelled",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"status": "CANCELLED",
"cancelledAt": "2026-10-01T10:30:00+02:00",
"cancelledBy": "STAFF",
"cancellationReason": "De klant heeft telefonisch afgezegd.",
"start": "2026-10-14T10:00:00+02:00",
"end": "2026-10-14T11:00:00+02:00",
"timeZone": "Europe/Amsterdam",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"locationMode": "AT_CUSTOMER",
"address": {
"line1": "Keizersgracht 100",
"postalCode": "1015 AA",
"city": "Amsterdam",
"country": "NL"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 2,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}appointment.completed
Afgerond, ook als de factuur is verstuurd.
Voorbeeldbericht
{
"type": "appointment.completed",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"status": "COMPLETED",
"start": "2026-10-14T10:00:00+02:00",
"end": "2026-10-14T11:00:00+02:00",
"timeZone": "Europe/Amsterdam",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"locationMode": "AT_CUSTOMER",
"address": {
"line1": "Keizersgracht 100",
"postalCode": "1015 AA",
"city": "Amsterdam",
"country": "NL"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 2,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}appointment.deleted
Gearchiveerd. Uitlezen van de afspraak antwoordt vanaf dan 404.
Voorbeeldbericht
{
"type": "appointment.deleted",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09",
"status": "COMPLETED",
"start": "2026-10-14T10:00:00+02:00",
"end": "2026-10-14T11:00:00+02:00",
"timeZone": "Europe/Amsterdam",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"locationMode": "AT_CUSTOMER",
"address": {
"line1": "Keizersgracht 100",
"postalCode": "1015 AA",
"city": "Amsterdam",
"country": "NL"
},
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 2,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}Gebruikt een teamlid Verzetten, dan wordt de afspraak geannuleerd met
cancelledBy: STAFF_RESCHEDULE en volgt een invitation.created: de klant krijgt een
uitnodiging om een nieuw moment te kiezen. Boekt de klant later, dan komen
invitation.booked en appointment.created, en de nieuwe afspraak heeft
rescheduledFromId.
Er is geen appointment.no_show: niets in Schedulinq markeert een afspraak als niet
verschenen.
Uitnodigingen
invitation.created
Een uitnodiging om te boeken is verstuurd: vanuit het dashboard, via de API, na Verzetten, of door een abonnement.
Voorbeeldbericht
{
"type": "invitation.created",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"status": "PENDING",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"appointmentIds": [],
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "API_KEY",
"apiKeyId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e0a"
}
}
}invitation.booked
De klant heeft via de uitnodiging geboekt. appointmentIds noemt de afspraken, de
vroegste eerst.
Voorbeeldbericht
{
"type": "invitation.booked",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"status": "USED",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"appointmentIds": [
"3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e09"
],
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "CUSTOMER"
}
}
}invitation.expired
De uitnodiging is over haar vervaldatum heen zonder boeking.
Voorbeeldbericht
{
"type": "invitation.expired",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"status": "EXPIRED",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"appointmentIds": [],
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "SYSTEM"
}
}
}invitation.cancelled
De uitnodiging is ingetrokken in het dashboard, of de klant is verwijderd.
Voorbeeldbericht
{
"type": "invitation.cancelled",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"status": "CANCELLED",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"appointmentIds": [],
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}invitation.deleted
De uitnodiging is gearchiveerd. Uitlezen antwoordt vanaf dan 404.
Voorbeeldbericht
{
"type": "invitation.deleted",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e08",
"status": "PENDING",
"service": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e01",
"name": "Offertebezoek"
},
"colleagues": [
{
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"name": "Sanne de Vries"
}
],
"customerId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e06",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
},
"appointmentIds": [],
"createdAt": "2026-10-01T10:30:00+02:00",
"updatedAt": "2026-10-01T10:30:00+02:00",
"version": 1,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}Een openstaande uitnodiging wijzigen in het dashboard verstuurt geen gebeurtenis.
Teamleden
Deze gaan af voor elk teamlid, niet alleen voor wie je systeem uitnodigde. Voor de
anderen is metadata {}.
colleague.activated
Iemand heeft de uitnodiging geaccepteerd en is nu teamlid. invitationId en
metadata zijn die van de uitnodiging, zodat je ze kunt koppelen aan het verzoek dat
haar maakte.
Voorbeeldbericht
{
"type": "colleague.activated",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "00000000-0000-0000-0000-000000000001",
"status": "ACTIVE",
"firstName": "Piet",
"lastName": "Bakker",
"name": "Piet Bakker",
"email": "piet+ov@loodgieter-bakker.example",
"admin": false,
"schedulable": true,
"calendarConnected": false,
"customFields": {},
"createdAt": "2026-10-01T08:30:00Z",
"version": 1,
"changedBy": {
"type": "USER",
"userId": "00000000-0000-0000-0000-000000000001"
},
"invitationId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e05",
"metadata": {
"campaignId": "C-42",
"dealId": "D-123"
}
}
}colleague.calendar_connected
Het teamlid heeft nu een gekoppelde agenda waarvan Schedulinq de drukke tijden leest:
calendarConnected is true geworden.
Voorbeeldbericht
{
"type": "colleague.calendar_connected",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"status": "ACTIVE",
"firstName": "Sanne",
"lastName": "de Vries",
"name": "Sanne de Vries",
"email": "sanne@installatiebedrijf-jansen.example",
"admin": true,
"schedulable": true,
"calendarConnected": true,
"customFields": {},
"createdAt": "2026-10-01T08:30:00Z",
"version": 1,
"changedBy": {
"type": "USER",
"userId": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03"
}
}
}colleague.calendar_disconnected
Het teamlid heeft zo'n agenda niet meer. Verloor Schedulinq zelf de toegang, dan is
changedBy SYSTEM; dat wordt binnen een paar uur opgemerkt.
Voorbeeldbericht
{
"type": "colleague.calendar_disconnected",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"id": "3f0c8a52-6b1e-4d7a-9c3e-1a2b3c4d5e03",
"status": "ACTIVE",
"firstName": "Sanne",
"lastName": "de Vries",
"name": "Sanne de Vries",
"email": "sanne@installatiebedrijf-jansen.example",
"admin": true,
"schedulable": true,
"calendarConnected": false,
"customFields": {},
"createdAt": "2026-10-01T08:30:00Z",
"version": 2,
"changedBy": {
"type": "SYSTEM"
}
}
}Testbericht
ping
Wordt alleen verstuurd door Testbericht versturen op de pagina van het endpoint. Je kunt je er niet op abonneren.
Voorbeeldbericht
{
"type": "ping",
"timestamp": "2026-10-01T08:30:00Z",
"data": {
"endpointId": "00000000-0000-0000-0000-000000000001"
}
}Wie wat veroorzaakt
| Waar het gebeurt | Gebeurtenissen |
|---|---|
| Dashboard: een afspraak maken | appointment.created |
| Dashboard: een afspraak bewerken | appointment.rescheduled als het begin, het einde of de teamleden wijzigen, anders appointment.updated |
| Dashboard: slepen in de agenda | appointment.rescheduled |
| Dashboard: afronden | appointment.completed |
| Dashboard: annuleren | appointment.cancelled |
| Dashboard: Verzetten | appointment.cancelled en invitation.created |
| Dashboard: een afspraak archiveren | appointment.deleted |
| Dashboard: een vergaderlink instellen, wijzigen of wissen | appointment.updated |
| Dashboard: een uitnodiging versturen | invitation.created |
| Dashboard: een uitnodiging intrekken | invitation.cancelled |
| Dashboard: een uitnodiging archiveren | invitation.deleted |
| Dashboard: een klant verwijderen | appointment.cancelled per toekomstige afspraak, invitation.cancelled per openstaande uitnodiging |
| Dashboard: twee klanten samenvoegen | appointment.updated per verplaatste afspraak |
| Dashboard: een factuur versturen | appointment.completed per afspraak die erdoor wordt afgerond |
| API: een uitnodiging versturen | invitation.created |
| Klant: boeken op de boekingspagina | appointment.created |
| Klant: een uitnodiging boeken | invitation.booked en appointment.created per afspraak |
| Klant: annuleren via de eigen link | appointment.cancelled |
| Klant: verzetten via de eigen link | appointment.rescheduled op de nieuwe afspraak |
| De volgende uitnodiging van een abonnement | invitation.created |
| De vervaldatum van een uitnodiging verstrijkt | invitation.expired |
| Een annulering schuift de latere bezoeken van een boeking naar voren | appointment.rescheduled per bezoek, changedBy SYSTEM |
| Dashboard: meerdere afspraken boeken | appointment.created per afspraak |
| Teamleader | appointment.created; appointment.rescheduled als de tijd of de teamleden veranderen, anders appointment.updated; appointment.cancelled |
| Gekoppelde agenda: de vergaderlink wordt gemaakt of verwijderd | appointment.updated |
| Gekoppelde agenda: de afspraak is verplaatst | appointment.rescheduled |
| Gekoppelde agenda: een van meerdere teamleden is verwijderd | appointment.rescheduled |
| Gekoppelde agenda: het laatste teamlid is verwijderd, of de afspraak is gewist | appointment.cancelled |
| Iemand accepteert een uitnodiging voor het team | colleague.activated |
| De agenda van een teamlid wordt gekoppeld of raakt kwijt | colleague.calendar_connected of colleague.calendar_disconnected |