All projects

Live · 2024–2026

EasyBud

Wallets, balances, transactions, and ledger-backed payment workflows for a fintech product, plus travel-booking integrations.

Backend engineer

  • NestJS
  • Laravel
  • PostgreSQL
  • Redis
  • RabbitMQ

Problem

Financial operations needed strong consistency, an auditable ledger, and reliable integrations with Nigerian payment and travel providers — without blocking the API on every hop.

What I built

  • Designed wallet, balance, and ledger models in NestJS/TypeScript with PostgreSQL and MySQL.
  • Moved payment side effects onto RabbitMQ and Redis so request paths stayed responsive.
  • Integrated PalmPay, Providus, Interswitch, and Wakanow behind explicit service boundaries.
  • Held high unit and integration coverage on critical payment and ledger paths.

Architecture

flowchart LR
  api[NestJS and Laravel APIs] --> ledger[Ledger and wallets]
  api --> queue[RabbitMQ]
  queue --> workers[Payment workers]
  workers --> providers[PalmPay Providus Interswitch]
  api --> cache[Redis]
  ledger --> db[PostgreSQL MySQL]

Outcomes

  • Ledger-backed workflows with auditability for wallets and transactions.
  • Async payment operations that stayed reliable under load.
  • About 15–25% faster key transaction endpoints via query optimization, caching, and jobs.

Context

EasyBud is a fintech product. From August 2024 to January 2026 I designed and operated the transaction infrastructure: wallets, balances, ledgers, and the APIs that sit in front of them.

Money paths do not get to be “eventually consistent enough.” The ledger is the product. Everything else — a payment provider, a travel booking, a cache — has to leave an auditable trail back to that ledger.

Ledger first

I modeled wallets, balances, and transactions as ledger-backed workflows in NestJS and TypeScript, with Laravel in the mix where the existing stack already lived. PostgreSQL and MySQL held the system of record. Redis and RabbitMQ took work that did not belong on the request thread.

The rule was simple: a client request should record intent and return; provider chatter and retries happen in workers. That is how you keep an API responsive without losing the transaction.

Integrations

PalmPay, Providus, Interswitch, and Wakanow sat behind explicit adapters. Payment and travel-booking workflows could fail independently without the ledger inventing a new source of truth for each vendor.

Performance and review

Query optimization, caching, and asynchronous jobs improved key transaction endpoints by about 15–25%. I treated that as an outcome of clearer data access, not a rewrite.

Critical payment and ledger paths kept high unit and integration coverage. Code review on those paths was about correctness and security first — a missed unique constraint is more expensive than a missing index.