Webhooks
Webhooks sturen een HTTP POST naar jouw server zodra er iets met een e-mail gebeurt: bezorging, bounce, open of klik. Zo hoef je niet te pollen en reageer je direct op events.
Webhook aanmaken
Ga naar Dashboard → Webhooks en klik op Webhook toevoegen. Je kiest welke events je wilt ontvangen en krijgt direct een signatuurgeheim terug.
Je kunt ook via de API een webhook aanmaken:
https://api.wesender.nl/webhooks | Veld | Type | Vereist | Beschrijving |
|---|---|---|---|
| url | string | Ja | HTTPS-eindpunt dat de POST-verzoeken ontvangt. |
| events | string[] | Ja | Lijst van te ontvangen event-types. Zie hieronder. |
Event types
| Event | Wanneer |
|---|---|
| email.delivered | De ontvangende mailserver heeft de e-mail geaccepteerd. |
| email.bounced | Bezorging definitief mislukt (hard bounce) of tijdelijk mislukt (soft bounce). Bij een hard bounce wordt het adres automatisch gesupprimeerd. |
| email.opened | Ontvanger heeft de e-mail geopend (vereist open-tracking pixel). |
| email.clicked | Ontvanger heeft op een gevolgde link geklikt. De aangeklikte URL staat in data.click_url. |
| email.failed | Tijdelijke bezorgfout — de e-mail kon niet worden afgeleverd maar is niet definitief gebounced. |
Payload voorbeelden
email.delivered
{
"type": "email.delivered",
"created_at": "2026-06-13T09:19:31Z",
"data": {
"id": "av276ywjkg15k2ku9j1xgrqe",
"from": "noreply@joudomein.nl",
"to": ["klant@voorbeeld.nl"],
"subject": "Je bestelling is verzonden",
"tags": { "flow": "checkout" }
}
} email.bounced
Het veld bounce_type is hard (permanent, adres automatisch gesupprimeerd) of soft (tijdelijk).
{
"type": "email.bounced",
"created_at": "2026-06-13T09:21:07Z",
"data": {
"id": "av276ywjkg15k2ku9j1xgrqe",
"from": "noreply@joudomein.nl",
"to": ["ongeldig@voorbeeld.nl"],
"subject": "Je bestelling is verzonden",
"bounce_type": "hard",
"bounce_message": "550 5.1.1 The email account does not exist"
}
} email.opened
{
"type": "email.opened",
"created_at": "2026-06-13T09:25:44Z",
"data": {
"id": "av276ywjkg15k2ku9j1xgrqe",
"from": "noreply@joudomein.nl",
"to": ["klant@voorbeeld.nl"],
"subject": "Je bestelling is verzonden"
}
} email.clicked
{
"type": "email.clicked",
"created_at": "2026-06-13T09:26:01Z",
"data": {
"id": "av276ywjkg15k2ku9j1xgrqe",
"from": "noreply@joudomein.nl",
"to": ["klant@voorbeeld.nl"],
"subject": "Je bestelling is verzonden",
"click_url": "https://joudomein.nl/bestellingen/12345"
}
} email.failed
{
"type": "email.failed",
"created_at": "2026-06-13T09:20:15Z",
"data": {
"id": "av276ywjkg15k2ku9j1xgrqe",
"from": "noreply@joudomein.nl",
"to": ["klant@voorbeeld.nl"],
"subject": "Je bestelling is verzonden"
}
} Handtekeningverificatie
Elk webhook-verzoek bevat de header Wesender-Signature met het formaat t=TIMESTAMP,v1=HEX. De handtekening is een HMAC-SHA256 van TIMESTAMP.BODY, ondertekend met jouw webhook-geheim. Controleer dit altijd om nep-verzoeken te voorkomen.
Compleet handler voorbeeld
Herlevering en fouttolerantie
- Je endpoint moet binnen 10 seconden antwoorden met HTTP 2xx.
- Bij een timeout of non-2xx proberen wij het tot 3 keer opnieuw (direct, na 1 s, na 5 s).
- Na 3 pogingen wordt het event gedropt.
- Verwerk events asynchroon: antwoord snel en verwerk daarna op de achtergrond.
- Maak je handler idempotent — bij herlevering kan hetzelfde event meerdere keren binnenkomen.
Toekomstige events
Het webhooksysteem is ontworpen om eenvoudig uitgebreid te worden. Nieuwe events (zoals domeinverificatie of suppression-events) worden automatisch beschikbaar in het dashboard zodra ze actief zijn.