S

Selected work · 2023 – 2024

Espay

Type

VTU platform

Duration

6 months

Year

2023 – 2024

Role

Frontend Developer

Outcome

Failure and recovery states designed as first-class interface, not afterthoughts

Tools

  • AngularJS

A VTU platform for buying mobile data and airtime at a discount. Three surfaces built in AngularJS: the landing page, a user dashboard for transactions and wallet balance, and an admin dashboard behind it. Payments mean the failure states matter as much as the happy path.

Espay is a VTU platform: mobile data and airtime bought at a discount, which in Nigeria is a genuinely high-frequency transaction rather than an occasional one.

Three surfaces in AngularJS, the landing page, a user dashboard for transactions and wallet balance, and an admin dashboard behind it. On a product where money moves in small amounts many times a day, the interesting work is not the purchase flow but everything around it: what the interface says when a payment half-succeeds, and how someone gets their money back.

Inside Espay

Espay dashboard with wallet balance, purchase cards and transaction history

A product people open several times a week

Espay sells mobile data and airtime at a discount, which in Nigeria is a high-frequency purchase rather than an occasional one. That frequency shapes the whole screen: wallet balance in the header, the two things anyone came for as cards with the real price on them, and the referral bonus beside them. Recent Transactions sits underneath even when empty, because on a product where money moves in small amounts many times a day, the transaction list is the trust surface. Hiding it until it has rows would remove the reassurance exactly when a new user needs it most.

Espay airtime purchase flow with network selection and amount

Removing the ways this can go wrong

Network as four logos rather than a dropdown, a number, an amount, and an optional schedule. Tabs split airtime from data. Continue stays disabled until the form is valid, which on a payments product is the cheapest possible safety feature: the failed transaction you prevent is the refund nobody has to process and the support conversation nobody has to have. On a VTU platform the failure states are the product, and most of the work went into the paths where money has already left the wallet.

Espay account settings showing tier limits and notification preferences

Limits and exits, stated rather than buried

Account tier with its daily transaction cap and maximum wallet balance written out, not left in the terms. Notification preferences are per event, including when a flagged transaction is resolved, which turns the failure path into something a user can opt into being told about. Deactivation and deletion sit on this page instead of behind a support request. On anything holding a balance, how easily somebody can leave is part of whether they trust you enough to stay.

← All work