Case study · Fintech · 2024
$274,965 in four weeks.
Zero downtime.
I led the frontend of the web app that opened GTCO's public offer to people who don't bank with GTBank. This is how I built it, and the morning it nearly went wrong.
- Role
- Lead Frontend Engineer
- Team
- 2 engineers · I led the frontend
- Timeline
- Built Apr – Jul 2024 · live 15 Jul – 12 Aug 2024
- Stack
- React, Vite, TypeScript, Tailwind, Zod, Web Crypto API, Squad
- Currency
- US dollars at ₦1,345 to $1 (₦369,827,782)
At a glance
Built · the subscribe-and-pay web app for investors outside GTBank, in a team of two.
But · on launch morning, it was still connected to the wrong payment account.
In the end · caught before anyone paid. $274,965 in four weeks, with zero downtime.
A door for everyone.
In July 2024, GTCO opened a public offer with several ways to subscribe. HabariPay, its fintech arm, was asked to add one built for reach: a web app that made it easy for people who don't bank with GTBank to subscribe and pay from their phone.
Leadership chose me to lead the frontend.note 1
The whole country was watching.
Ordinary people were trusting this app with their money. If it went down, or took someone's money and failed to record it, it would be on social media within minutes, with GTCO's name on it.
And traffic wouldn't be steady. It would surge without warning, and hardest as the deadline came close.
Five days to a working journey.
I started on 23 April. Five days later, the whole journey was clickable: choose how to invest, add your details, review, pay, and see confirmation.note 2
The next eleven weeks went into what makes people trust a payment page: validation, clear errors, security, and the details that only show up on real phones. Four decisions mattered most.
Encrypt in the browser, from week two.
Investors' personal details were encrypted on their own device before they were sent, and anything saved between steps was encrypted too. Security was part of the build from the second week.note 3
Keep everything that might change out of the code.
Offer price, minimum units, open and close dates, documents and the payment key all lived in configuration. On a live national launch, changing the price or a date meant editing a setting.note 4
Make every build version itself.
A small script bumped the version before every build, so after any fix, investors loaded the new code instead of a stale copy.
Use my own library in production.
The checkout ran on squad-pay-react, the open-source library I wrote to make Squad payments simple to add to any React app.note 5
The wrong keys, caught in time.
On launch morning, we realised the app was still connected to the wrong Squad account: a live one, but not the account meant to receive the offer's money. If we'd missed it, real investors' payments would have landed there.
We'd agreed to always make the first real payment ourselves, and that's how we caught it. I switched it to the production account and checked the flow again before investors arrived.note 6
Launch day is part of the product.
It held, and it paid.
- in retail subscriptions
- $274,965
- minutes of downtime or failed checkouts
- Zero
- subscription forms started
- 44k+
- page views in four weeks
- 211K
Every subscription also earned HabariPay a payment fee. In 2025 I was promoted to a more senior grade in recognition of this work.note 7
What I took with me.
Launch day is part of the product. That's what this project taught me. Configuration, release checks and a real first payment deserve the same planning as any feature, not a scramble on the morning.
I've built that way since. At ama, I set up the team's first end-to-end testing framework, wired into our pull requests, and made the app reload itself when a release leaves someone on outdated code, the same problem my version script solved here.note 8
Back to the top ↑Also in this series
ama · AI · 2025 – nowEvery search set up by hand. Now, in the app.Read the case study →Let's talk
Launching something people will trust with their money?
Send me a note. I reply within two working days.
Prefer your own inbox? Email me directly