Ga naar hoofdinhoud

Webhooks & API Integraties

Met webhooks kun je automatisch externe systemen op de hoogte brengen wanneer er iets gebeurt in je ticketing systeem (zoals een betaalde bestelling of nieuwe gebruiker).

Overzicht

Wat zijn Webhooks?

Webhooks zijn uitgaande HTTP POST requests die automatisch worden verstuurd naar een URL van jouw keuze wanneer bepaalde events plaatsvinden.

Voorbeeld flow:

1. Bezoeker koopt ticket
2. Betaling wordt voltooid
3. VoordeMensen detecteert "Order Paid" event
4. Webhook wordt verstuurd naar jouw URL
5. Jouw systeem ontvangt data en verwerkt deze

Waarom Webhooks Gebruiken?

Use cases:

  • CRM synchronisatie - Klantdata automatisch naar je CRM (Salesforce, HubSpot, etc.)
  • Marketing automation - Trigger campagnes in je marketing tool
  • Analytics - Verstuur data naar je analytics platform
  • Custom systemen - Integreer met interne systemen
  • Notificaties - Stuur berichten naar Slack, Discord, etc.
  • Accounting - Synchroniseer verkoopcijfers met je boekhoudsoftware

Webhook Types

Er zijn 2 soorten uitgaande webhooks:

1. Order Webhooks

Worden verstuurd wanneer een bestelling is betaald.

Trigger:

  • Order payment status = "paid"

Payload bevat:

  • Order gegevens (order_id, totaalbedrag, datum, etc.)
  • User gegevens (naam, email, telefoon, etc.)
  • Seats gegevens (alle tickets met event info, prijzen, kortingen)

2. User Webhooks

Worden verstuurd wanneer gebruikersgegevens wijzigen.

Triggers:

  • Nieuwe gebruiker aangemaakt
  • Gebruiker wijzigt profiel
  • Gebruiker schrijft zich uit (opt-out)

Payload bevat:

  • User gegevens (user_id, naam, email, tags, etc.)
  • User preferences (opt-in, mailinglist status)
  • Event IDs (alle events waar user tickets voor heeft)

Webhook Configureren

Stap 1: Ga naar Connections/Webhooks

Navigeer in het dashboard naar Koppelingen > Webhooks.

Stap 2: Nieuwe Webhook Toevoegen

Klik op + Nieuwe Webhook.

Stap 3: Configuratie

VeldUitleg
TypeKies: webhook
EventKies: order of user
Connector URLHet volledige HTTPS endpoint waar de webhook naartoe moet
ParametersDe JSON payload (zie Payload sectie)
HeadersCustom HTTP headers (optioneel, JSON format)

Voorbeeld configuratie:

Type: webhook
Event: order
Connector URL: https://jouwdomein.nl/api/webhooks/order
Parameters: (zie Payload Templates)
Headers: {"Authorization": "Bearer jouw_api_key"}

Payload Templates

Order Webhook Payload

Basis template:

{
"order_id": "%ORDER_ID%",
"user_id": "%USER_ID%",
"firstname": "%FIRSTNAME%",
"lastname": "%LASTNAME%",
"email": "%EMAIL%",
"phone": "%PHONE%",
"payment_status": "%PAYMENT_STATUS%",
"date": "%DATE%",
"total_price": "%TOTAL_PRICE%",
"optin": "%OPTIN%",
"mailinglist": "%MAILINGLIST%"
}

Uitgebreide template met volledige objecten:

{
"order": %ORDER%,
"user": %USER%,
"seats": %SEATS%,
"event_ids": "%EVENT_IDS%"
}

User Webhook Payload

Basis template:

{
"user_id": "%USER_ID%",
"firstname": "%FIRSTNAME%",
"preposition": "%PREPOSITION%",
"lastname": "%LASTNAME%",
"email": "%EMAIL%",
"phone": "%PHONE%",
"optin": "%OPTIN%",
"mailinglist": "%MAILINGLIST%",
"event_ids": "%EVENT_IDS%"
}

Uitgebreide template:

{
"user": %USER%,
"event_ids": "%EVENT_IDS%"
}

Placeholder Variabelen

Gebruik placeholders in je payload om automatisch data in te vullen.

Order Variabelen

PlaceholderBetekenisVoorbeeld
%ORDER_ID%Order ID1234
%TOTAL_PRICE%Totaalprijs47.50
%PAYMENT_STATUS%Betaalstatuspaid
%DATE%Besteldatum2025-12-21 14:30:00
%TICKETS_NR%Aantal tickets3
%DONATION%Donatie bedrag5.00
%DISCOUNT_PRICE%Totale korting10.00
%FEE%Transactiekosten1.50
%PLACE%Verkoopkanaalwww of pos

User Variabelen

PlaceholderBetekenisVoorbeeld
%USER_ID%User ID187
%FIRSTNAME%VoornaamJan
%PREPOSITION%Tussenvoegselvan
%LASTNAME%AchternaamDijk
%EMAIL%E-mailadresjan@example.com
%PHONE%Telefoonnummer+31612345678
%ADDRESS%AdresStraatnaam 123
%ZIP%Postcode1234AB
%CITY%StadAmsterdam
%OPTIN%Email opt-intrue of false
%MAILINGLIST%Nieuwsbrieftrue of false

Complete Objecten

Deze placeholders worden vervangen door complete JSON objecten:

PlaceholderBevatGebruik
%ORDER%Volledig order objectAlle order velden in JSON
%USER%Volledig user objectAlle user velden in JSON
%SEATS%Array van seatsAlle tickets met event info
%EVENT_IDS%Comma-separated event IDs1113,1114,1115

Voorbeeld %ORDER% output:

{
"order_id": 731,
"order_user_id": 187,
"order_tickets_nr": 2,
"order_total_price": "29.50",
"order_donation": "0.00",
"order_date": "2020-08-06 10:48:19",
"order_payment_status": "paid",
"order_payment_id": "tr_Hdasqzr9kb",
"order_place": "www"
}

Voorbeeld %SEATS% output:

[
{
"seat_id": 281210,
"seat_price": "23.50",
"seat_discount": "0.00",
"discount_name": "Standaard entreeticket",
"event_id": 1113,
"event_name": "De Notenkraker",
"event_date": "2024-06-27",
"event_time": "21:00:00",
"event_main_id": 1082
},
{
"seat_id": 281211,
"seat_price": "0.00",
"seat_discount": "23.50",
"discount_name": "Vrijkaart",
"event_id": 1113,
"event_name": "De Notenkraker",
"event_date": "2024-06-27",
"event_time": "21:00:00",
"event_main_id": 1082
}
]

Custom Headers

Je kunt custom HTTP headers toevoegen aan je webhook requests.

Gebruik:

  • Authenticatie (API keys, Bearer tokens)
  • Custom identificatie
  • Content negotiation

Format: Headers worden gedefinieerd als JSON object in het connect_headers veld.

Voorbeeld:

{
"Authorization": "Bearer sk_live_abc123xyz",
"X-Custom-Header": "mijn-waarde",
"X-Client-ID": "voordemensen_client"
}

Standaard headers: Elk webhook request bevat automatisch:

  • Content-Type: application/json
  • User-Agent: VoordeMensen/1.0 (Webhook System)

Webhook Testen

Voordat je een webhook live zet, kun je deze testen met dummy data.

Test Functie Gebruiken

  1. Ga naar je webhook configuratie
  2. Klik op Test Webhook
  3. Het systeem verstuurt een test request met voorbeelddata
  4. Check de response om te zien of het werkt

Test data bevat:

  • Order ID: 731
  • User ID: 187
  • Naam: Test VoordeMensen
  • Email: test@test.nl
  • Telefoon: `+31612345678
  • Alle placeholders worden gevuld met realistische test waarden

Response:

  • Bij succes: Je ontvangt de response van je endpoint
  • Bij fout: Error message met details (bijv. "URL ongeldig")

Webhook Security

HTTPS Verplicht

Alleen HTTPS endpoints worden ondersteund:

  • https://jouwdomein.nl/webhook
  • http://jouwdomein.nl/webhook (onveilig)

Waarom?

  • Beschermt gevoelige klantdata
  • Voorkomt man-in-the-middle attacks
  • Industry best practice

Debugging & Troubleshooting

Webhook Komt Niet Aan

Check:

  1. Is de webhook actief gezet?
  2. Is de Connector URL correct (inclusief https://)?
  3. Is je endpoint bereikbaar vanaf het internet?
  4. Check firewall settings (VoordeMensen IPs allowed?)
  5. Check SSL certificate van je endpoint (geldig?)

Test:

  • Gebruik de test functie in het dashboard
  • Check je server logs voor incoming requests
  • Gebruik tools zoals RequestBin of Webhook.site voor debugging

Payload Komt Leeg Aan

Check:

  1. Zijn placeholders correct gespeld? (hoofdlettergevoelig)
  2. Zijn haakjes correct voor objecten (%ORDER% niet "%ORDER%")
  3. Is de JSON valide? (gebruik JSON validator)

Test:

  • Gebruik test functie en check de verzonden payload
  • Log de raw body in je endpoint

Veelgestelde Vragen

Kan ik meerdere webhooks configureren?

Ja, je kunt meerdere webhooks aanmaken voor hetzelfde event type. Elk wordt apart verstuurd.

Worden webhooks gestuurd voor gratis bestellingen?

Ja, order webhooks worden verstuurd voor alle betaalde orders, inclusief €0,00 orders (vrijkaarten).

Kan ik webhooks filteren op event type?

Nee, webhooks worden verstuurd voor alle orders/users. Implementeer filtering in je endpoint op basis van de payload data.

Worden webhooks verstuurd bij refunds?

Nee, er is geen apart refund webhook. Monitor order status changes via je endpoint of gebruik de API om refund status op te halen.

Kan ik webhooks testen zonder live orders?

Ja, gebruik de test functie in het dashboard. Deze verstuurt een webhook met dummy data.

Hoe vaak worden gefaalde webhooks opnieuw geprobeerd?

Niet automatisch. Je moet handmatig opnieuw versturen via de manual trigger functie.

Kunnen webhooks naar localhost?

Nee, alleen publieke HTTPS endpoints zijn bereikbaar. Gebruik tunneling tools (ngrok, localtunnel) voor local development.

Kan ik webhooks pauzeren?

Ja, deactiveer de webhook in de configuratie. Je kunt deze later weer activeren.