In de meeste software is een bug een incident. In fintech is een bug een verplichting die mogelijk al geld heeft gekost zonder dat iemand het gemerkt heeft.
Fintech-architectuur kent een klein aantal werkelijk niet-onderhandelbare beslissingen. Sla je die mis, dan haalt geen enkele latere engineering dat volledig in — je erft een systeem waarin geld stilletjes verkeerd kan zijn, en dat is de enige faalwijze die een financieel product niet kan opvangen.
1. Saldi worden afgeleid, nooit opgeslagen als waarheid
De veruit meest gemaakte en meest schadelijke fout is een muteerbare saldokolom die code rechtstreeks bijwerkt. Dat is handig, snel en onherstelbaar: als hij afdrijft, valt niet meer vast te stellen wat hij had moeten zijn.
Het juiste model is een append-only journaal van boekingen. Er wordt nooit iets bijgewerkt of verwijderd; correcties zijn nieuwe tegenboekingen. Het saldo is de som van de boekingen, gecachet voor performance maar altijd reconstrueerbaar uit het journaal.
| Muteerbaar saldo | Append-only grootboek |
|---|---|
| UPDATE accounts SET balance = balance - 100 | INSERT boeking (debet 100), INSERT boeking (credit 100) |
| Historie verloren bij elke schrijfactie | Volledige historie door de constructie zelf |
| Afwijking is niet te detecteren en niet te herstellen | Elke toestand op elk moment reproduceerbaar |
| Concurrency-bugs beschadigen de staat permanent | Het dubbel-boekhouden-invariant vangt fouten |
| Auditen betekent applicatielogs lezen | Auditen betekent het grootboek lezen |
2. Elk geldpad is idempotent
Netwerken herhalen. Gebruikers dubbelklikken. Betaalproviders leveren webhooks meer dan eens af — dat is gedocumenteerd gedrag, geen randgeval. Elke operatie die geld beweegt moet veilig herhaald uitgevoerd kunnen worden.
- Elke geldoperatie draagt een door de aanroeper geleverde idempotency key, uniek per logische intentie
- De sleutel wordt met een uniciteitsconstraint opgeslagen vóór de bijeffecten, niet erna
- Een herhaalde sleutel geeft het oorspronkelijke resultaat terug in plaats van het werk opnieuw te doen
- Webhook-handlers slaan de ruwe payload op met de event-id van de provider als sleutel en verwerken daarna — zo wordt een herlevering ook midden in de verwerking herkend
3. Geld zijn gehele getallen in minor units
Floating point kan decimale breuken niet exact weergeven, dus rekenen met float-geld stapelt fouten op. Sla minor units op als gehele getallen (of een decimaal type met vaste precisie) en maak de valuta expliciet bij elk bedrag — een bedrag zonder valuta is een bug die op de eerste internationale klant wacht.
4. Reconciliatie is een feature, geen bijgedachte
Ga uit van afwijking tussen je grootboek en de betaalprovider — die komt er, door timeouts, gedeeltelijke storingen en correcties aan providerzijde. De vraag is of je hem detecteert.
- Een geplande job die de interne staat vergelijkt met de settlementdata van de provider
- Alerting bij discrepantie, met een aangewezen eigenaar en een runbook
- Een gedefinieerd oplospad — tegenboekingen, nooit stille correctie
- Sweeps op vastgelopen toestanden: transacties die langer in pending staan dan zou moeten
5. Isolatie, in beide betekenissen
- Tenantisolatie — afgedwongen in de datalaag, niet door te hopen dat elke query het juiste filter bevat
- Faalisolatie — een trage provider mag de requestpool niet uitputten en ongerelateerde functionaliteit platleggen
- Omgevingsisolatie — nooit testtransacties in productiegrootboeken
6. Bouw voor de audit die je uiteindelijk krijgt
Nee. De audit levert technische bevindingen binnen de afgesproken scope. Juridische beoordeling en formele certificering vragen de daarvoor bevoegde beoordelaars.
- Een onveranderlijk audittrail van wie wat wanneer deed — inclusief interne adminacties
- Kaartgegevens die je servers nooit raken, tenzij je werkelijk PCI-compliant wilt zijn (gebruik hosted fields of een hosted page)
- Bewaartermijnen en verwijdering die op verzoek daadwerkelijk uitvoerbaar zijn
- Toegangscontrole die te reviewen is — wie geld mag verplaatsen, wie het goedkeurde
In gewone software optimaliseer je op snelheid van verandering. In fintech optimaliseer je op het vermogen om later precies te bewijzen wat er gebeurde en waarom.
De vijf vragen aan je eigen systeem
- Als deze webhook twee keer binnenkomt, verandert er dan iets de tweede keer?
- Kan ik het saldo van elke klant op elk moment in het verleden alleen uit het grootboek reconstrueren?
- Zouden wij een afwijking met de provider opmerken, of zou een klant het ons vertellen?
- Kan een vervalst verzoek het geld van een andere tenant lezen of verplaatsen?
- Als een toezichthouder vroeg wie afgelopen maart een handmatige correctie goedkeurde, konden we dat dan binnen minuten beantwoorden?
Scheid transactieacceptatie van afwikkeling
Betaalstatussen moeten late en herhaalde gebeurtenissen kunnen verklaren. Controleer financiële records en het correctieproces samen.
- Gebruik exacte decimalen of gehele ondereenheden met valutaregels.
- Koppel gebeurtenissen aan boekingen zonder herhalingen dubbel te verwerken.
- Bewaar oorspronkelijke records en traceer goedgekeurde correcties.
Veelgestelde vragen
Hebben we een dubbel-boekhoudgrootboek nodig voor een eenvoudig fintechproduct?
Als je saldi aanhoudt of geld beweegt namens gebruikers: ja. Het append-only journaal is geen boekhoudkundige formaliteit — het is wat de staat reconstrueerbaar en fouten detecteerbaar maakt. Het achteraf toevoegen nadat saldi zijn afgedreven is veel lastiger dan ermee beginnen.
Wat is het meest voorkomende ernstige gebrek in vroege fintechsystemen?
Muteerbare saldi zonder journaal, op de voet gevolgd door ontbrekende idempotentie op betaal- en webhookpaden. Beide laten geld stilletjes verkeerd worden, de faalwijze die het moeilijkst te detecteren en achteraf het moeilijkst te herstellen is.
Moeten we kaartgegevens zelf opslaan?
Vrijwel zeker niet. Gebruik hosted fields of een hosted betaalpagina van een provider zodat kaartgegevens je servers nooit bereiken. Ze zelf verwerken trekt je hele infrastructuur binnen de PCI DSS-scope, wat een forse doorlopende compliance- en auditlast betekent.
Wanneer moet een fintechstartup een architectuuraudit doen?
Vóór de eerste significante volumestijging, en vóór elke ronde waarin technische due diligence wordt verwacht. De bovenstaande structurele beslissingen zijn goedkoop vroeg te verifiëren en duur te corrigeren zodra er echt geld door het systeem is gegaan.
Hebben alle valuta twee decimalen?
Nee. Definieer precisie en afronding per valuta en handeling en controleer leveranciersvereisten. Vermijd binaire zwevendekommagetallen waar exacte decimale rekenkunde nodig is.
Wil je dit tegen jouw systeem laten toetsen?
Wij auditen fintech-architectuur precies tegen deze lijst — grootboekintegriteit, idempotentie, reconciliatie, isolatie.
Verder lezen
Technische due diligence voor investeerders: de complete gids
Technische due diligence is geen code review. Het is het antwoord op één vraag: wat kost het om deze technologie te brengen waar de investeringsthese haar nodig heeft?
Architectuuraudit: wanneer je er een nodig hebt en wat hij vindt
Een architectuuraudit is geen mening over je stack. Het is een kaart van waar het systeem breekt onder het plan dat je werkelijk hebt.