All projects

Case study · Fintech

Sika — money that moves the way you live

A fintech app for Ghana: a wallet you fund from mobile money, transfers to any network, and payments for electricity, water and airtime. Underneath it is a double-entry ledger, the same principle an accountant uses, so every cedi can be traced and every balance checked.

Role
Product design & development
Status
Beta testing
Platform
Web app, installable on phones (PWA)
Stack
Next.js · Express · PostgreSQL
Sika's home page with the headline “Money that moves the way you live” and a phone showing a wallet balance

In Ghana, most everyday payments already run on mobile money, but they're split across networks and apps. Sending to someone on a different network, paying the ECG or water bill and topping up airtime can each mean a different menu, a different fee and a different receipt.

I wanted one place to do all of it, built so that the money side is trustworthy: balances that can't drift, payments that can't be applied twice, and a full trail behind every transaction.

Wallet

Fund it from MTN MoMo, Telecel Cash or AT Money, link accounts and request money.

Send money

Transfers to people on any network, with saved recipients and a voice-assisted send option.

Bills & airtime

ECG electricity, Ghana Water and airtime top-ups from the same balance.

Notifications

SMS receipts sent through an outbox, so a failed message is retried rather than lost.

Sika is a monorepo with a Next.js and Tailwind front end, an Express API and a PostgreSQL database. Payments come in through Paystack and SMS goes out through Arkesel.

  • Double-entry ledger in the database. Every transaction is a journal entry with at least two postings that sum to zero; the database rejects any entry that doesn't balance.
  • Amounts in pesewas, never decimals. Money is stored as whole numbers, so totals never pick up rounding errors.
  • Append-only history. Postings are never edited or deleted. A mistake is corrected with a reversing entry, just as in a set of books.
  • Safe to retry. Each payment carries an idempotency key, so if Paystack sends the same confirmation twice, the wallet is credited once.
  • Built-in reconciliation. A check compares every cached balance with its postings and lists any account that disagrees. Mismatched or suspicious deposits go to a suspense account for review.

Building Sika showed me how directly accounting carries over into software. Debits, credits, reversing entries and reconciliation aren't just exam topics; they're the rules that keep a payments system honest. Writing them into the database itself means no part of the app can break them by accident.

Next: learning from beta testers and widening early access.

Next case study

St. Peter’s Mission Schools

Read it