Payments and fintech
In every other kind of software a bug is an inconvenience. Here it is either somebody's money or a regulator's letter.
The non-negotiable is a real ledger. Storing balances as a number you increment is how money disappears: two concurrent updates, a retried request, a partial failure between two systems, and now the total does not match the transactions and nobody can say when it stopped. Double-entry with immutable entries means the balance is derived rather than stored, every movement has a counterpart, and reconciliation is arithmetic rather than investigation. It is more work up front and it is the only version that survives an audit.
Payment integration is mostly about the unhappy paths. A network timeout does not tell you whether the charge happened, so every request needs an idempotency key and every response needs to be reconciled against the provider rather than assumed. Webhooks arrive out of order, arrive twice, or arrive before the request that caused them has finished committing. Treating those as exceptional produces a system that is subtly wrong under load; treating them as normal produces one that is boring, which is what you want here.
The regulatory shape of the work depends entirely on jurisdiction and on whether money ever rests in an account you control. Handing off to a licensed provider and never touching funds keeps you outside most licensing regimes; holding balances, even briefly, usually does not. That is a question to answer with a lawyer in your market before the architecture is drawn, because it determines the architecture rather than following it — and it is not a question a development studio should be answering for you.
How we work
- A double-entry ledger with immutable entries. Balances are derived, never incremented in place.
- Idempotency keys everywhere, and every payment reconciled against the provider rather than assumed from a response.
- Webhooks are treated as unordered and repeatable, because under load they are both.
What this includes
Pick what you need and send it over.
Questions
- Do we need a licence?
- That depends on your market and on whether funds ever sit in an account you control, and it is a question for a lawyer in that jurisdiction rather than for us. What we can do is build so that the answer stays "no" for as long as possible — funds moving directly between the customer and a licensed provider, with your system holding records rather than money.