15 dec 2024·7 min leestijd

Checklist voor idempotente betaalwebhooks voor veilige factuurupdates

Checklist voor idempotente betaalwebhooks om events te dedupliceren, retries te verwerken en facturen, abonnementen en toegangsrechten veilig bij te werken.

Checklist voor idempotente betaalwebhooks voor veilige factuurupdates

Waarom betaalwebhooks dubbele updates veroorzaken

Een betaalwebhook is een bericht dat je betaalprovider naar je backend stuurt wanneer er iets belangrijks gebeurt, bijvoorbeeld een gelukt incasso, een betaalde factuur, een abonnement dat vernieuwt of een terugbetaling. Het is in feite de provider die zegt: “Dit is wat er gebeurde. Werk je gegevens bij.”

Duplicaten ontstaan omdat webhookbezorging gericht is op betrouwbaarheid, niet op "exactly once". Als je server langzaam is, time-out, een fout terugstuurt of kort onbeschikbaar is, zal de provider meestal hetzelfde event opnieuw proberen te bezorgen. Je kunt ook twee verschillende events zien die naar dezelfde echte handeling verwijzen (bijvoorbeeld een invoice-event en een betaling-event die bij één betaling horen). Events kunnen ook uit volgorde binnenkomen, vooral bij snelle opvolgingen zoals restituties.

Als je handler niet idempotent is, kan hij hetzelfde event twee keer toepassen, wat meteen zichtbare problemen voor klanten en financiële teams oplevert:

  • Een factuur die twee keer als betaald wordt gemarkeerd, wat dubbele boekingen veroorzaakt
  • Een verlenging die twee keer wordt toegepast, waardoor toegang te ver wordt verlengd
  • Toegangsrechten die twee keer worden toegekend (extra credits, seats of functies)
  • Terugbetalingen of chargebacks die de toegang niet correct intrekken

Dit is niet alleen "best practice". Het is het verschil tussen facturatie die betrouwbaar aanvoelt en facturatie die supporttickets oplevert.

Het doel van deze checklist is eenvoudig: behandel elk binnenkomend event als “maximaal één keer toepassen.” Je slaat voor elk event een stabiele identifier op, behandelt retries veilig en werkt facturen, abonnementen en toegangsrechten gecontroleerd bij. Als je de backend bouwt in een no-code tool zoals AppMaster, gelden dezelfde regels: je hebt een helder datamodel en een reproduceerbare handlerflow die onder retries correct blijft.

Idempotentiebasisprincipes die je op webhooks kunt toepassen

Idempotentie betekent dat het meerdere keren verwerken van dezelfde input hetzelfde eindresultaat oplevert. In factureringstermen: één factuur wordt eenmaal betaald, één abonnement wordt eenmaal bijgewerkt en toegang wordt eenmaal verleend, zelfs als de webhook twee keer wordt afgeleverd.

Providers retryen wanneer je endpoint time-out, een 5xx teruggeeft of het netwerk wegvalt. Die retries herhalen hetzelfde event. Dat verschilt van een nieuw event dat een echte verandering vertegenwoordigt, zoals een terugbetaling dagen later. Nieuwe events hebben andere ID's.

Om dit werkend te maken heb je twee dingen nodig: stabiele identifiers en een klein “geheugen” van wat je al hebt gezien.

Welke ID's belangrijk zijn (en wat je moet opslaan)

De meeste betaalplatformen bevatten een event-ID die uniek is voor het webhook-event. Sommige bevatten ook een request-ID, idempotency key of een uniek betalingsobject-ID (zoals een charge of payment intent) in de payload.

Sla op wat je helpt deze vraag te beantwoorden: “Heb ik dit exacte event al toegepast?”

Een praktisch minimum:

  • Event ID (unieke sleutel)
  • Event type (handig voor debugging)
  • Ontvangen tijdstempel
  • Verwerkingsstatus (processed/failed)
  • Referentie naar de beïnvloede klant, factuur of abonnement

De belangrijkste zet is om de event ID op te slaan in een tabel met een unieke constraint. Dan kan je handler dit veilig doen: insert event ID eerst; als deze al bestaat, stop en geef 200 terug.

Hoe lang dedupe-records bewaren

Bewaar dedupe-records lang genoeg om late retries en supportonderzoeken te dekken. Een veelgebruikt venster is 30 tot 90 dagen. Als je met chargebacks, disputen of langere abonnementscycli werkt, bewaar ze langer (6 tot 12 maanden) en purgeer oude rijen zodat de tabel snel blijft.

In een gegenereerde backend zoals AppMaster map je dit eenvoudig naar een WebhookEvents-model met een uniek veld op de event ID, plus een Business Process dat vroegtijdig stopt wanneer een duplicaat wordt gedetecteerd.

Ontwerp een eenvoudig datamodel voor het dedupliceren van events

Een goede webhookhandler is grotendeels een dataprobleem. Als je elk provider-event precies één keer kunt vastleggen, wordt alles wat volgt veiliger.

Begin met één tabel die fungeert als ontvangstbewijslog. In PostgreSQL (inclusief wanneer gemodelleerd in AppMaster’s Data Designer) houd je het klein en strikt zodat duplicaten snel falen.

Het minimale dat je nodig hebt

Hier is een praktisch uitgangspunt voor een webhook_events-tabel:

  • provider (text, zoals "stripe")
  • provider_event_id (text, verplicht)
  • status (text, zoals "received", "processed", "failed")
  • processed_at (timestamp, nullable)
  • raw_payload (jsonb of text)

Voeg een unieke constraint toe op (provider, provider_event_id). Die ene regel is je belangrijkste dedupe-veiligheid.

Je wilt ook de zakelijke ID's bewaren die je gebruikt om records te vinden die je moet bijwerken. Die verschillen van de webhook event ID.

Veelvoorkomende voorbeelden zijn customer_id, invoice_id en subscription_id. Bewaar ze als text omdat providers vaak niet-numerieke ID's gebruiken.

Raw payload vs geparseerde velden

Sla de raw payload op zodat je kunt debuggen en later kunt herprocessen. Geparseerde velden maken queries en rapportage makkelijker, maar sla alleen op wat je echt gebruikt.

Een eenvoudige aanpak:

  • Sla altijd raw_payload op
  • Sla daarnaast een paar geparseerde ID's op die je vaak bevraagt (customer, invoice, subscription)
  • Sla een genormaliseerd event_type (text) op voor filtering

Als een invoice.paid event twee keer binnenkomt, blokkeert je unieke constraint de tweede insert. Je hebt nog steeds de raw payload voor audits, en de geparseerde invoice ID maakt het makkelijk om de factuur te vinden die je de eerste keer hebt bijgewerkt.

Stap voor stap: een veilige webhookhandlerflow

Een veilige handler is opzettelijk saai. Hij gedraagt zich elke keer hetzelfde, zelfs wanneer de provider hetzelfde event opnieuw stuurt of events uit volgorde bezorgt.

De 5-stappenflow die je elke keer moet volgen

  1. Verifieer de handtekening en parse de payload. Weiger requests die falen bij signature checks, een onverwacht eventtype hebben of niet geparsed kunnen worden.

  2. Schrijf het eventrecord voordat je facturatiegegevens aanraakt. Sla de provider event ID, type, aanmaaktijd en de raw payload op (of een hash). Als de event ID al bestaat, behandel het als een duplicaat en stop.

  3. Map het event naar één “eigenaar”-record. Bepaal wat je bijwerkt: factuur, abonnement of klant. Sla externe ID's op je records zodat je ze direct kunt opzoeken.

  4. Pas een veilige statuswijziging toe. Beweeg alleen de status vooruit. Maak een betaalde factuur niet ongedaan omdat later een "invoice.updated" binnenkomt. Leg vast wat je hebt toegepast (oude status, nieuwe status, tijdstempel, event ID) voor audit.

  5. Reageer snel en log de uitkomst. Geef succes terug zodra het event veilig is opgeslagen en verwerkt of genegeerd. Log of het verwerkt, gededuped of verworpen werd en waarom.

In AppMaster wordt dit meestal een databasetabel voor webhookevents plus een Business Process dat controleert “al gezien event ID?” en dan de minimale update-stappen uitvoert.

Omgaan met retries, timeouts en uit volgorde bezorging

Ontwerp je factureringsdatamodel
Modelleer WebhookEvents, invoices en entitlements in PostgreSQL met AppMaster Data Designer.
Begin met bouwen

Providers retryen webhooks als ze geen snelle succesvolle respons krijgen. Ze kunnen ook events uit volgorde sturen. Je handler moet veilig blijven als dezelfde update twee keer binnenkomt, of als een latere update eerder aankomt.

Een praktische regel: reageer snel, doe het zware werk later. Behandel de webhookrequest als een ontvangstbewijs, niet als de plek om zware logica uit te voeren. Als je third-party API's aanroept, PDF's genereert of accounts herberekent binnen de request, vergroot je timeouts en trigger je meer retries.

Uit volgorde: houd de nieuwste waarheid

Uit-van-orde levering is normaal. Voer vóór het toepassen van een wijziging twee checks uit:

  • Vergelijk tijdstempels: pas een event alleen toe als het nieuwer is dan wat je al voor dat object hebt opgeslagen (factuur, abonnement, entitlement).
  • Gebruik statusprioriteit wanneer tijdstempels dicht bij elkaar liggen of onduidelijk zijn: paid wint van open, canceled wint van active, refunded wint van paid.

Als je een factuur al als betaald hebt vastgelegd en later een "open" event binnenkomt, negeer het. Ontving je "canceled" en verschijnt later een ouder "active"-update, houd dan canceled.

Negeer vs in de wachtrij zetten

Negeer een event wanneer je kunt aantonen dat het verouderd is of al is toegepast (zelfde event ID, oudere timestamp, lagere statusprioriteit). Zet een event in de wachtrij wanneer het afhankelijk is van data die je nog niet hebt, zoals een subscription-update die arriveert vóórdat het klantrecord bestaat.

Een praktisch patroon:

  • Sla het event onmiddelijk op met een verwerkingsstatus (received, processing, done, failed)
  • Als afhankelijkheden ontbreken, markeer het als waiting en probeer het op de achtergrond opnieuw
  • Stel een retry-limiet in en waarschuw na herhaalde fouten

In AppMaster past dit goed bij een webhookevents-tabel plus een Business Process die de request snel erkent en queued events asynchroon verwerkt.

Veilig en veilig facturatie bijwerken: facturen, abonnementen en toegangsrechten

Zodra je deduplicatie hebt geregeld, is het volgende risico gesplitste factuurstatus: de factuur zegt betaald, maar het abonnement staat nog als achterstallig, of toegang is twee keer toegekend en nooit ingetrokken. Behandel elk webhookevent als een statusovergang en pas het in één atomische update toe.

Facturen: maak statuswijzigingen monotone

Facturen kunnen door statussen gaan zoals betaald, ongeldig en terugbetaald. Je kunt ook te maken krijgen met deelbetalingen. Toggle een factuur niet op basis van het laatste event dat binnenkomt. Sla de huidige status en belangrijke totalen op (amount_paid, amount_refunded) en sta alleen veilige voorwaartse overgangen toe.

Praktische regels:

  • Markeer een factuur slechts één keer als betaald, de eerste keer dat je een paid-event ziet.
  • Voor terugbetalingen verhoog amount_refunded tot maximaal het factuurtotaal; verlaag het nooit.
  • Als een factuur voided is, stop vervullingsacties maar bewaar het record voor audit.
  • Bij deelbetalingen werk je bedragen bij zonder de “volledig betaald” voordelen toe te kennen.

Abonnementen en toegangsrechten: één keer verlenen, één keer intrekken

Abonnementen omvatten verlengingen, annuleringen en respijtperiodes. Bewaar abonnementstatus en periodegrenzen (current_period_start/end), en leid daar entitlements van af. Entitlements moeten expliciete records zijn, geen enkele boolean.

Voor toegangscontrole:

  • Eén entitlement-toekenning per gebruiker per product per periode
  • Eén intrekkingsrecord wanneer toegang eindigt (annulering, terugbetaling, chargeback)
  • Een audittrail die vastlegt welk webhookevent elke wijziging veroorzaakte

Gebruik één transactie om gesplitste staten te vermijden

Voer factuur-, abonnement- en entitlementwijzigingen uit binnen één database-transactie. Lees huidige rijen, controleer of dit event al is toegepast en schrijf dan alle wijzigingen samen. Als er iets faalt, rol terug zodat je niet eindigt met “factuur betaald” maar “geen toegang”, of andersom.

In AppMaster vertaalt dit vaak naar een enkele Business Process-flow die PostgreSQL in één gecontroleerd pad bijwerkt en tegelijk een auditentry schrijft.

Beveiliging en datahygiëne voor webhookendpoints

Deploy met vertrouwen
Deploy je gegenereerde backend naar je cloud en houd webhookverwerking voorspelbaar op schaal.
Deploy nu

Webhookbeveiliging is onderdeel van correctheid. Als een aanvaller je endpoint kan bereiken, kan die proberen nep-"paid"-statussen te creëren. Zelfs met deduplicatie moet je bewijzen dat het event echt is en klantgegevens veilig houden.

Verifieer de afzender voordat je facturatie aanraakt

Valideer de handtekening op elke request. Voor Stripe betekent dat meestal het controleren van de Stripe-Signature header, gebruikmakend van de raw request body (niet een herschreven JSON) en het weigeren van events met een oude timestamp. Behandel ontbrekende headers als een harde fout.

Valideer basiszaken vroeg: juiste HTTP-methode, Content-Type en vereiste velden (event id, type en het object-id dat je gebruikt om een factuur of abonnement te vinden). Als je dit in AppMaster bouwt, bewaar het signing secret in omgevingsvariabelen of secure config, nooit in de database of clientcode.

Een snelle beveiligingschecklist:

  • Weiger requests zonder geldige handtekening en verse timestamp
  • Vereis verwachte headers en content type
  • Gebruik least-privilege database-toegang voor de webhookhandler
  • Bewaar secrets buiten je tabellen (env/config), roteer wanneer nodig
  • Geef 2xx alleen terug nadat je het event veilig hebt gepersist

Houd logs nuttig zonder geheimen te lekken

Log genoeg om retries en disputen te debuggen, maar vermijd gevoelige waarden. Sla een veilige subset van PII op: provider customer ID, interne user ID en eventueel een gemaskeerd e-mailadres (zoals a***@domain.com). Bewaar nooit volledige kaartgegevens, volledige adressen of raw autorisatieheaders.

Log wat je helpt reconstrueren wat er gebeurde:

  • Provider event id, type, aanmaaktijd
  • Verificatieresultaat (signature ok/failed) zonder de signature zelf op te slaan
  • Dedupe-beslissing (nieuw vs al verwerkt)
  • Interne record-ID's die zijn aangeraakt (invoice/subscription/entitlement)
  • Foutreden en retry-aantal (als je retries in de wachtrij zet)

Voeg basis-abusebescherming toe: rate-limit per IP en (indien mogelijk) per klant-ID, en overweeg alleen bekende provider-IP-ranges toe te staan als je setup dat ondersteunt.

Veelvoorkomende fouten die dubbele kosten of dubbele toegang veroorzaken

Bouw veiligere betaalwebhooks
Bouw een idempotente webhook-handler met een dedupe-tabel en een duidelijk verwerkingspad.
Probeer nu

De meeste factureringsbugs gaan niet over rekenen. Ze ontstaan wanneer je een webhooklevering behandelt alsof het een enkele, betrouwbare boodschap is.

Fouten die vaak dubbele updates veroorzaken:

  • Dedupen op tijdstempel of bedrag in plaats van event ID. Verschillende events kunnen hetzelfde bedrag hebben, en retries kunnen minuten later binnenkomen. Gebruik de unieke event ID van de provider.
  • Je database bijwerken vóórdat je de handtekening verifieert. Verifieer eerst, parse daarna en onderneem pas actie.
  • Elk event blindelings als bron van waarheid behandelen zonder de huidige status te controleren. Markeer een factuur niet zomaar als betaald als hij al betaald, terugbetaald of void is.
  • Meerdere entitlements maken voor dezelfde aankoop. Retries kunnen dubbele rijen maken. Geef de voorkeur aan een upsert zoals “zorg dat entitlement bestaat voor subscription_id”, en werk dan datums/limieten bij.
  • De webhook laten falen omdat een notificatieservice down is. E-mail, SMS, Slack of Telegram mogen facturatie niet blokkeren. Queue notificaties en geef nog steeds succes terug nadat de kernfacturatie veilig is opgeslagen.

Een eenvoudig voorbeeld: een verlengings-event komt twee keer binnen. De eerste levering maakt een entitlement-rij. De retry maakt een tweede rij, en je app ziet "twee actieve entitlements" en verleent extra seats of credits.

In AppMaster draait de oplossing vooral om flow: verifieer eerst, insert het eventrecord met een unieke constraint, voer facturatie-updates uit met statuschecks en zet neveneffecten (e-mails, bonnetjes) in asynchrone stappen zodat ze geen retry-storm veroorzaken.

Realistisch voorbeeld: dubbele verlenging + latere terugbetaling

Dit patroon ziet er eng uit, maar is beheersbaar als je handler veilig opnieuw kan worden uitgevoerd.

Een klant heeft een maandplan. Stripe stuurt een verlengings-event (bijv. invoice.paid). Je server ontvangt het, werkt de database bij, maar doet te lang over het terugsturen van een 200-respons (cold start, drukke database). Stripe denkt dat het is mislukt en retryt hetzelfde event.

Bij de eerste levering verleen je toegang. Bij de retry detecteer je dat het hetzelfde event is en doe je niets. Later komt een terugbetaling binnen (bijv. charge.refunded) en je intrekt toegang één keer.

Hier is een eenvoudige manier om status in je database te modelleren (tabellen die je kunt bouwen in AppMaster Data Designer):

  • webhook_events(event_id UNIQUE, type, processed_at, status)
  • invoices(invoice_id UNIQUE, subscription_id, status, paid_at, refunded_at)
  • entitlements(customer_id, product, active, valid_until, source_invoice_id)

Hoe de database eruit zou moeten zien na elk event

Na Event A (verlenging, eerste levering): webhook_events krijgt een nieuwe rij voor event_id=evt_123 met status=processed. invoices is als betaald gemarkeerd. entitlements.active=true en valid_until schuift één factureringsperiode op.

Na Event A nogmaals (verlenging, retry): insertion in webhook_events faalt (unieke event_id) of je handler ziet dat het al verwerkt is. Geen wijzigingen aan invoices of entitlements.

Na Event B (terugbetaling): een nieuwe webhook_events-rij voor event_id=evt_456. invoices.refunded_at wordt gezet en status=refunded. entitlements.active=false (of valid_until wordt op nu gezet) met gebruik van source_invoice_id om de juiste toegang één keer in te trekken.

Het belangrijke detail is timing: de dedupe-check gebeurt vóórdat enige grant of revoke-writes plaatsvinden.

Pre-launch snelchecklijst

Prototypeer Stripe-billing sneller
Koppel Stripe-betalingen en test dubbele leveringen zonder boilerplate van scratch te schrijven.
Probeer het

Voordat je live webhooks inschakelt, wil je bewijzen dat één echt event facturatiegegevens precies één keer bijwerkt, zelfs als de provider het twee keer (of tien keer) stuurt.

Gebruik deze checklist om je setup end-to-end te valideren:

  • Bevestig dat elk binnenkomend event eerst wordt opgeslagen (raw payload, event id, type, aanmaaktijd en resultaat van signature-verificatie), zelfs als latere stappen falen.
  • Controleer dat duplicaten vroegtijdig worden gedetecteerd (zelfde provider event id) en dat de handler zonder wijzigingen aan facturen, abonnementen of entitlements uitstapt.
  • Bewijs dat de zakelijke update éénmalig is: één factuurstatuswijziging, één abonnementstoestandwijziging, één entitlement-toekenning of -intrekking.
  • Zorg dat fouten worden vastgelegd met genoeg details om veilig te replayen (foutmelding, stap die faalde, retry-status).
  • Test dat je handler snel een respons retourneert: erken ontvangst zodra het opgeslagen is en vermijd traag werk in de request.

Je hebt geen grote observability-setup nodig om te beginnen, maar je hebt wel signalen nodig. Volg deze via logs of eenvoudige dashboards:

  • Een piek in dubbele leveringen (vaak normaal, maar grote stijgingen kunnen timeouts of providerproblemen signaleren)
  • Hoog foutpercentage per eventtype (bijv. invoice payment failed)
  • Groeiende backlog van events vast in retry
  • Mismatch-checks (betaalde factuur maar ontbrekend entitlement, ingetrokken abonnement maar toegang nog actief)
  • Plotselinge toename in verwerkingstijd

Als je dit in AppMaster bouwt, bewaar eventopslag in een toegewijde tabel in de Data Designer en maak “mark processed” een enkel, atomair beslispunt in je Business Process.

Volgende stappen: test, monitor en bouw het in een no-code backend

Testen is waar idempotentie zichzelf bewijst. Loop niet alleen het happy path door. Replay hetzelfde event meerdere keren, stuur events uit volgorde en forceer timeouts zodat je provider retries doet. De tweede, derde en tiende levering mogen niets veranderen.

Plan vroeg voor backfilling. Ooit wil je historische events opnieuw verwerken na een bugfix, schemawijziging of providerincident. Als je handler echt idempotent is, wordt backfilling “events door dezelfde pijplijn afspelen” zonder duplicaten te maken.

Support heeft ook een klein runbook nodig zodat problemen geen giswerk worden:

  • Vind het event ID en controleer of het als verwerkt is vastgelegd.
  • Controleer de factuur- of abonnementrecord en bevestig de verwachte status en tijdstempels.
  • Bekijk het entitlementrecord (welke toegang is verleend, wanneer en waarom).
  • Indien nodig, voer de verwerking voor dat enkele event ID opnieuw uit in een veilige reprocess-modus.
  • Als data inconsistent is, voer één correctieve actie uit en registreer die.

Als je dit zonder veel boilerplate wilt implementeren, laat AppMaster (appmaster.io) je de kern-tabellen modelleren en de webhookflow in een visueel Business Process bouwen, terwijl er nog steeds echte broncode voor de backend wordt gegenereerd.

Probeer de webhookhandler end-to-end te bouwen in een no-code gegenereerde backend en zorg dat hij veilig blijft onder retries voordat je verkeer en omzet opschaalt.

FAQ

Waarom stuurt mijn betaalprovider hetzelfde webhookbericht meer dan eens?

Duplicate webhookleveringen zijn normaal omdat providers streven naar at least once levering. Als je endpoint timeouts geeft, een 5xx terugstuurt of de verbinding even wegvalt, zal de provider hetzelfde event opnieuw sturen totdat er een succesvolle respons is ontvangen.

Wat is de beste manier om webhookevents te dedupliceren?

Gebruik de unieke event ID van de provider (de webhook-eventidentifier), niet het factuurbedrag, tijdstempel of klant-e-mail. Sla die event ID op met een unieke constraint zodat een retry direct gedetecteerd en veilig genegeerd kan worden.

Moet ik het event opslaan voordat ik facturatiegegevens bijwerk?

Voeg het event eerst in, vóórdat je facturen, abonnementen of entitlements bijwerkt. Als de insert faalt omdat de event ID al bestaat, stop dan met verwerken en geef succes terug zodat retries geen dubbele updates maken.

Hoe lang moet ik records voor webhook-dedupe bewaren?

Bewaar ze lang genoeg om vertraagde retries af te dekken en voor onderzoek. Een praktisch standaardvenster is 30–90 dagen, en langer (bijvoorbeeld 6–12 maanden) als je met disputen, chargebacks of lange abonnementscycli te maken hebt. Verwijder oudere rijen daarna om queries snel te houden.

Heb ik echt handtekeningverificatie nodig als ik al events dedupe?

Verifieer de handtekening voordat je facturatiegegevens aanraakt, en parseer daarna de vereiste velden. Als handtekeningverificatie faalt, verwerp de request en schrijf geen facturatieveranderingen, want deduplicatie beschermt niet tegen vervalste "paid"-events.

Hoe ga ik om met webhook-timeouts zonder dubbele updates te maken?

Bevestig de ontvangst snel nadat het event veilig is opgeslagen en verplaats zwaarder werk naar achtergrondverwerking. Trage handlers veroorzaken meer timeouts, wat meer retries triggert en de kans op dubbele updates vergroot als iets niet volledig idempotent is.

Wat moet ik doen als events uit volgorde binnenkomen?

Pas alleen wijzigingen toe die de status vooruitbrengen en negeer verouderde events. Gebruik event-timestamps wanneer beschikbaar en een eenvoudige statusprioriteit (bijvoorbeeld: refunded mag niet worden overschreven door paid, en canceled niet door active).

Hoe voorkom ik dat ik twee keer toegang geef als een verlengings-webhook opnieuw wordt gestuurd?

Maak niet bij elk event een nieuwe entitlementregel. Gebruik een upsert-regel zoals “zorg dat er één entitlement is per gebruiker/product/periode (of per abonnement)”, werk dan datums/limieten bij en registreer welk event ID de wijziging veroorzaakte voor auditdoeleinden.

Waarom moeten factuur- en entitlement-updates in één transactie gebeuren?

Schrijf factuur-, abonnement- en entitlementwijzigingen in één database-transactie zodat ze samen slagen of falen. Dit voorkomt gesplitste toestanden zoals “factuur betaald” maar “geen toegang verleend”, of “toegang ingetrokken” zonder bijbehorende terugbetaling.

Kan ik dit veilig implementeren in AppMaster zonder veel backend-code te schrijven?

Ja. Het is een goede fit: maak een WebhookEvents-model met een unieke event ID en bouw een Business Process dat eerst controleert “al gezien?” en vroegtijdig stopt. Modelleer invoices/subscriptions/entitlements expliciet in de Data Designer zodat retries en replays geen dubbele rijen maken.

Gemakkelijk te starten
Maak iets geweldigs

Experimenteer met AppMaster met gratis abonnement.
Als je er klaar voor bent, kun je het juiste abonnement kiezen.

Aan de slag