Case study · Mobile app
Bankvole
Bankvole is a mobile banking platform available on iOS and Android, covering the surface area users expect from a consumer fintech product: account creation, balances, transfers, transaction history, and the operational tooling needed to keep it running. The work spanned mobile product UX, account flows, and the money-movement primitives that sit underneath them.
Problem
Banking products fail on two fronts: ledger integrity and onboarding friction. A consumer banking app has to honour both; every credit needs a debit, every state transition needs an audit trail, and the user-facing flow needs to stay legible while the engine underneath stays defensive. The platform also needed to be observable enough that issues surface before users hit them, not after.
Approach
The system was structured around clear boundaries between identity, ledger, and presentation. Account flows were modelled as state machines with explicit transitions so reconciliation can be reasoned about rather than reverse-engineered. Money movement was kept double-entry from day one, every transaction writes a balanced pair of postings, and balances are derived rather than mutated in place. Idempotency keys guard the API surface against retries and duplicate submissions. Observability was built in from the start: structured logs on every state change, traces across the request boundary, and alerts on the things that actually matter (failed postings, drift between source and destination balances, latency on the critical path).
Outcome
Bankvole shipped on iOS and Android as a mobile banking product built around production-adjacent fintech UX without leaning on a hosted core-banking provider for the parts that matter most. Account flows behave the way real banking flows do, including the edge cases that usually get hidden behind a happy path. The architecture leaves room to swap the underlying providers without rewriting the product surface.