Skip to content

SurgePay

Building and shipping multi-currency fintech on mobile.

Role
Frontend Engineer
Context
SurgePay, product team
Timeline
May 2025 to present
Platforms
iOS, Android
Status
Live
Primary metric
$1M+transaction volume in the first six months
SurgePay home screen: naira wallet with the balance hidden, fund, send, request and swap actions, and XLM, Base and SOL token wallets.

Overview

SurgePay is a mobile money app for people who hold and move more than one currency. Users keep naira and US dollar wallets, open virtual USD cards and US virtual accounts, send money to banks or by QR code, swap between currencies, save, and buy fractional US stocks.

It also holds stablecoins. Users receive and send USDC and other tokens across networks including Stellar, Solana and Base, and move between stablecoins and fiat inside the same send flow.

Every account is verified through identity checks that differ by country, and the app ships to the App Store and Google Play. Within six months of launch the mobile flows had moved over $1M in transaction volume, and SurgePay secured six-figure backing from the Stellar Community Fund (SCF).

My role

I am the frontend engineer on the mobile app and web app. I implemented the React Native application end to end: wallets, cards, send and swap flows, KYC, savings, investing, notifications and authentication. I integrate the backend APIs the team builds, and I manage builds, over-the-air updates and store releases.

The challenge

In a payments app the interface is the last line of trust. Identity checks, card issuing, blockchain networks and bank transfers each come from a different provider, and every one of them has to look like one calm, correct product on a phone.

  • Real money: every payment state on screen has to match the ledger.
  • Identity checks differ by country and run through a native SDK.
  • Staging and production builds must never be confused.
  • Two stores, two review processes, one codebase.

Architecture

  1. React Native app

    Expo, TypeScript

    Built by me

  2. Server-state layer

    TanStack Query, Zustand

    Built by me

  3. SurgePay APIs

    Wallets, cards, transfers

    Built by the team

  4. Providers

    KYC, card issuing, chains, banks

    Third party

Screens never talk to the network directly. Every balance and transaction goes through the server-state layer, so one cache decides what is fresh, what is stale and what needs refetching after a payment.

Engineering challenges

Two native SDKs, one manifest

problem
Adding the Smile ID SDK for face verification broke the Android build.
constraint
expo-camera (used for QR scanning) and the Smile ID SDK both declare which ML Kit models the app needs, with different values, and Android’s manifest merger refuses to pick one.
approach
I wrote an Expo config plugin that declares both models, barcode and face, in the app’s own manifest and tells the merger to use that value, so the fix is reapplied on every prebuild instead of living in a hand-edited native folder.
result
QR scanning and face verification ship together in one build, reproducibly.

Staging and production side by side

problem
Testers need staging builds while customers run production, from the same codebase.
constraint
A build that points at the wrong environment in a money app is not a cosmetic bug.
approach
Separate EAS build profiles for development, preview, internal TestFlight and production, each with its own API environment and update channel, so the environment is decided at build time and production builds auto-increment their version.
result
Staging and production are distinct artefacts, and a store build cannot point at staging.

Moving push notifications onto Firebase

problem
Push notifications ran through Expo’s push relay, and the backend needed to send through Firebase directly.
constraint
Tokens refresh, users log out or get suspended, and a notification tapped while the app is closed still has to land on the right screen.
approach
The app now registers raw Firebase Cloud Messaging tokens after sign-in, handles token refresh and foreground messages, deletes the token on logout or suspension, and routes notification taps through deep links. expo-notifications stays only for permissions and the Android channel.
result
Notifications arrive through Firebase in both environments and open the screen they are about.

Cutting cold-start time

problem
The app took about 4.2 seconds to become usable from a cold start.
constraint
A payments app has to restore a secure session before it can show a balance, so some launch work cannot simply be skipped.
approach
I measured what ran before the first usable screen and moved everything that did not have to block it until after the first render.
result
Cold start dropped to about 2.9 seconds.

Outcome

  • $1M+

    transaction volume in six months

  • 4.2s → 2.9s

    cold start, approximately

  • iOS + Android

    production deployment

In fintech the work that users never see, such as environment separation, release channels, monitoring and end-to-end tests, is what lets the visible work be trusted.

Technologies

  • React Native
  • Expo
  • TypeScript
  • TanStack Query
  • Zustand
  • Smile ID
  • Firebase Cloud Messaging
  • Sentry
  • Maestro
  • EAS Build and Update