Retour aux projets
Fintech

Mobile Money App Turnaround

A struggling mobile money product I was brought in to rescue: I revamped the React Native app and migrated its backend off MongoDB onto PostgreSQL, fixing critical money-handling bugs along the way.

React native NestJS PostgreSQL
Mobile Money App Turnaround

Overview

A mobile money product that I was brought in, as a freelance senior developer, to rescue. It looked finished but was not fit for production: a confusing app that showed fake data to real users, and a backend that stored money in a database with no transactional guarantees. I audited it, then rebuilt the mobile app and re-platformed the backend into something that could actually be trusted with people's money.

The starting point

I began with a full technical and UX audit. The problems ran across the whole stack.

On the app:

  • A broken login that let users register, then locked them out by rejecting the very password they had just chosen.
  • Fake data shown as real: the home screen displayed hardcoded transactions (foreign marketplaces, other countries) to every user, inside a financial app.
  • Dead-end flows: send, deposit and withdraw each spun an infinite loader with no error, no timeout and no retry.
  • No design system: three UI libraries mixed together, no visual identity, poor Android rendering, and no main navigation.

On the backend:

  • A fintech backend running on MongoDB, with no transactional atomicity for money operations, which is exactly what a payments system cannot afford.
  • Balance desynchronization: account balances drifted out of sync across different flows.
  • Money misattributed: in the transfer module, an operation was recorded against the sender instead of the receiver, referencing the wrong account.
  • In-memory filtering and missing query-level counts, plus almost no automated tests.

What I did

Mobile app

  • A real design system and identity: one coherent component system replaced the three mismatched libraries, with a proper typography scale, consistent theming and correct Android rendering.
  • Fixed the core: removed the login trap, replaced hardcoded fake data with real API-backed content, and turned dead-end loaders into flows with proper loading, empty, error and retry states.
  • Coherent navigation: a real tab-based structure instead of routing everything through the home screen.
  • Built the missing journeys: the reseller experience (agent cash-out, commissions and earnings, an activity dashboard) and the merchant QR payment screens did not exist. I designed, built and wired them.

Backend re-platforming

  • Migrated the backend from MongoDB to PostgreSQL. I wrote the migration plan, bootstrapped a Drizzle ORM data-access layer (schema, migrations, dependency injection), and moved the domain services and HTTP layer from Mongoose to typed Drizzle repositories.
  • Restored correctness: real transactional atomicity for money operations, query-level filtering and counts instead of in-memory work, and synchronized balances across every flow.
  • Fixed the money bugs: corrected the transfer attribution and account-reference bugs, and reworked the fixed fee-tier logic.
  • Made it testable and deployable: added a unit and integration test suite running against a real PostgreSQL database (86% line coverage) and rewired CI to run in parallel against real PostgreSQL, with migrations applied automatically on deploy.

Result

The product went from not fit for production to something trustworthy end to end: a coherent, professional mobile app with reliable flows and honest data, on top of a relational backend with real transactional guarantees, consistent balances and a genuine test suite.

Tech

  • Mobile: React Native + Expo, React 19, TypeScript, Redux Toolkit, Axios service layer with token refresh, secure device storage, biometric and PIN auth, Sentry, Fastlane and EAS for CI/CD, Jest
  • Backend: NestJS + TypeScript, migrated from MongoDB / Mongoose to PostgreSQL + Drizzle ORM, integration tests on real PostgreSQL, CI on GitHub Actions

My role

I was brought in as a freelance senior developer to rescue this product, and I worked across the stack from my own audit. On the app, I owned the full mobile revamp: the design system, the fixes to the broken flows, and the new reseller and merchant journeys. On the backend, I led the migration off MongoDB onto PostgreSQL and refactored the critical money modules, fixing the atomicity, balance and transfer-attribution bugs and adding the test suite and CI. The original backend was built by another team; I re-platformed and hardened the parts that handle money.