Smart wallets
In-app wallets with double-entry ledgers: card top-ups, held funds, transfers, refunds and payouts that reconcile to the cent against the payment provider.
- Year
- 2019–present
- Timeline
- Multiple engagements
- Team
- Symphony Apps
- Stack
- 6 technologies
Double-entry
Ledger
0
Unreconciled cents
SCA
Compliant payments
Audit
Full transaction trail
Balances, top-ups and payouts inside your product. Figures measured against the process this platform replaced, twelve weeks after full rollout.
The problem
Storing a balance in a column on the users table is the most common and most expensive mistake in this category. The first double top-up, failed webhook or partial refund produces money that exists in one system and not the other.
The approach
A proper double-entry ledger: every movement is two immutable entries, balances are derived, and nothing is ever updated in place. Authorisations, captures, holds and refunds are modelled as distinct states.
Provider webhooks are idempotent and replayable, and a nightly reconciliation job compares the ledger against the provider's settlement report and raises a difference rather than silently correcting it.
The build
Card top-ups with 3-D Secure, stored payment methods, wallet-to-wallet transfers, promotional credit with its own expiry rules, payouts to drivers or merchants, and a back-office view with a searchable transaction trail per user.
The stack
Node.js and Laravel services over PostgreSQL with serialisable transactions on the money paths, Stripe and local acquirers behind one payment abstraction, and tests that assert the ledger sums to zero.
Technologies
- Node.js
- Laravel
- PostgreSQL
- Stripe
- 3-D Secure
- Webhooks
Tell us what you’re trying to ship
A first call is thirty minutes and costs nothing. Bring the problem, not a spec — working out what to build is the part we are good at.
Or email office@symphonyapps.ro. We reply within one business day, in English or Romanian.
