API & integratie
Meerdere systemen, één betrouwbare synchronisatie
Webhooks, imports en API-events uit onder meer booking- en ticketsystemen teruggebracht tot één controleerbare verwerkingsstroom.
De situatie
Leads en conversies komen niet alleen uit een eigen formulier. Ze arriveren ook via HubSpot Meetings, Calendly, MICE, Weeztix en rechtstreekse tracking-API’s. Iedere bron levert andere identifiers, veldnamen en momenten waarop data compleet is.
Waar het vastliep
Een webhook kan twee keer komen, een order kan eerder binnenkomen dan de bijbehorende bezoeker en een externe API kan tijdens de verrijking een time-out geven. Losse handlers maakten het moeilijk om te zien of een event nieuw, bijgewerkt of al verwerkt was.
De technische vraag
De verwerking moest herhaalbaar zijn zonder dubbele leads of conversies. Externe identifiers zoals event-id, form-guid en invitee-URI moesten per bron correct worden gebruikt, terwijl ontbrekende data later nog aangevuld kon worden.
Mijn aanpak
Ik bracht de bronnen terug tot één intern eventmodel en legde per adapter vast hoe identificatie en veldmapping werken. Upserts en idempotency keys beschermen tegen dubbel werk. Tijdelijke fouten gaan terug naar de queue met oplopende wachttijd; permanente fouten krijgen een duidelijke eindstatus en context in de logging.
Wat het opleverde
Vertraagde of opnieuw verstuurde events zijn nu voorspelbaar af te handelen. Een beheerder kan per stap terugvinden welke brondata is ontvangen, aan welk record die is gekoppeld en waarom een externe synchronisatie eventueel wacht of faalt.
Onder de motorkap
Keuzes die het verschil maakten
Bron-eigen identifiers
Niet vertrouwen op e-mail alleen; per integratie wordt de stabielste externe sleutel gebruikt voor matching en deduplicatie.
Normaliseren aan de rand
Adapters vertalen bronvelden naar één intern formaat voordat bedrijfslogica of attributie start.
Retry met onderscheid
Rate limits en time-outs worden opnieuw geprobeerd; ongeldige configuratie of data niet eindeloos.
Traceerbare statussen
Ontvangen, gekoppeld, verwerkt en definitief mislukt zijn afzonderlijke toestanden met bruikbare foutcontext.