Avayo Developers Webhooks API v2

Webhooks

Laat ons je systeem waarschuwen zodra er een bestelling betaald is, in plaats van dat jij steeds komt vragen of er iets nieuws is.

Instellen

In je backoffice, onder Instellingen > Webhooks. Je geeft een adres op waar wij naartoe mogen sturen, en krijgt een geheim terug dat je nodig hebt om te controleren dat een bericht echt van ons komt.

Eisen aan het adres

Het moet met https:// beginnen en van buitenaf bereikbaar zijn. Adressen binnen een privénetwerk, op localhost of met inloggegevens erin worden geweigerd.

Met de knop Test stuur je meteen een proefbericht, zodat je kunt controleren of je ontvanger werkt zonder op een echte bestelling te wachten. Dat bericht heeft "test": true, zodat je het niet per ongeluk als omzet boekt.

Het bericht

POST jouw adres
Headers
Content-Type: application/json
X-Avayo-Event: order.paid
X-Avayo-Timestamp: 1789012345
X-Avayo-Signature: sha256=<hmac>
Body
{
  "event": "order.paid",
  "occurred_at": "2026-09-09T10:22:31+02:00",
  "data": {
    "order_id": 1234567, "order_number": 20260041,
    "order_date": "2026-09-09", "visit_date": "2026-10-05",
    "event_id": 123, "event_name": "Zomerfeest 2026",
    "source": "ticketshop", "payment_method": "10", "locale": "nl",
    "currency": "EUR", "amounts_in": "euro",
    "total": 42.50, "handling_cost": 1.50, "tickets": 3,
    "utm": { "source": "facebook", "campaign": "zomer" }
  }
}

Geen persoonsgegevens

Er staan geen namen, e-mailadressen of adressen in. Een bericht gaat naar jouw server en soms daarachter naar een andere partij, en wat daar terechtkomt ligt buiten ons zicht. Aantallen, bedragen en herkomst zijn genoeg om een dashboard te voeden.

De handtekening controleren

Reken dezelfde HMAC uit over het tijdstip en de onbewerkte body, met jouw geheim, en vergelijk die met de header:

Ruby
expected = OpenSSL::HMAC.hexdigest("SHA256", secret, "#{timestamp}.#{raw_body}")
Rack::Utils.secure_compare("sha256=#{expected}", signature_header)

Het tijdstip zit in de handtekening zodat een onderschept bericht niet later opnieuw kan worden afgespeeld. Weiger berichten waarvan het tijdstip meer dan een paar minuten afwijkt.

Als het misgaat

Antwoord Elke statuscode van 200 tot 299 telt als geslaagd. Antwoord snel; na tien seconden breken we af.
Opnieuw proberen Vijf pogingen, met oplopende wachttijd: 1 minuut, 5, 25 en ruim 2 uur.
Vanzelf uit Na 20 mislukte pogingen op rij zetten we de webhook uit. In het overzicht zie je de laatste fout, en je kunt hem daar weer aanzetten zodra je ontvanger het weer doet.
Doorsturen We volgen geen redirects. Geef meteen het juiste adres op.

Krijg je een bericht twee keer? Dat kan bij een onderbroken verbinding. Gebruik order_id om dubbele verwerking te voorkomen.