SchedulinqDocs
Naar Schedulinq

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, zoals appointment.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. type is USER (een teamlid, met userId), API_KEY (je eigen systeem, met apiKeyId), CUSTOMER, SYSTEM (Schedulinq zelf), INTEGRATION (Teamleader) of CALENDAR_SYNC (een gekoppelde agenda);
  • alleen bij appointment.rescheduled: previous, met de start, end en userIds van vóór de wijziging;
  • bij colleague.activated: de invitationId van 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 gebeurtGebeurtenissen
Dashboard: een afspraak makenappointment.created
Dashboard: een afspraak bewerkenappointment.rescheduled als het begin, het einde of de teamleden wijzigen, anders appointment.updated
Dashboard: slepen in de agendaappointment.rescheduled
Dashboard: afrondenappointment.completed
Dashboard: annulerenappointment.cancelled
Dashboard: Verzettenappointment.cancelled en invitation.created
Dashboard: een afspraak archiverenappointment.deleted
Dashboard: een vergaderlink instellen, wijzigen of wissenappointment.updated
Dashboard: een uitnodiging verstureninvitation.created
Dashboard: een uitnodiging intrekkeninvitation.cancelled
Dashboard: een uitnodiging archivereninvitation.deleted
Dashboard: een klant verwijderenappointment.cancelled per toekomstige afspraak, invitation.cancelled per openstaande uitnodiging
Dashboard: twee klanten samenvoegenappointment.updated per verplaatste afspraak
Dashboard: een factuur versturenappointment.completed per afspraak die erdoor wordt afgerond
API: een uitnodiging verstureninvitation.created
Klant: boeken op de boekingspaginaappointment.created
Klant: een uitnodiging boekeninvitation.booked en appointment.created per afspraak
Klant: annuleren via de eigen linkappointment.cancelled
Klant: verzetten via de eigen linkappointment.rescheduled op de nieuwe afspraak
De volgende uitnodiging van een abonnementinvitation.created
De vervaldatum van een uitnodiging verstrijktinvitation.expired
Een annulering schuift de latere bezoeken van een boeking naar vorenappointment.rescheduled per bezoek, changedBy SYSTEM
Dashboard: meerdere afspraken boekenappointment.created per afspraak
Teamleaderappointment.created; appointment.rescheduled als de tijd of de teamleden veranderen, anders appointment.updated; appointment.cancelled
Gekoppelde agenda: de vergaderlink wordt gemaakt of verwijderdappointment.updated
Gekoppelde agenda: de afspraak is verplaatstappointment.rescheduled
Gekoppelde agenda: een van meerdere teamleden is verwijderdappointment.rescheduled
Gekoppelde agenda: het laatste teamlid is verwijderd, of de afspraak is gewistappointment.cancelled
Iemand accepteert een uitnodiging voor het teamcolleague.activated
De agenda van een teamlid wordt gekoppeld of raakt kwijtcolleague.calendar_connected of colleague.calendar_disconnected
Laatst bijgewerkt op 2 oktober 2026