← Work

A payments business doing manual reconciliation across three markets

ReactSupabasePostgreSQLCloudflarePawaPayMTN MoMoAirtel MoneySlack

The Problem

A payments business operating across three African markets — South Africa, Zimbabwe, and Zambia — ran reconciliation manually. Eleven people matched payment records by hand every day: comparing what the payment processor reported against what the bank received, across multiple currencies, multiple providers, and multiple markets.

The process worked, but barely. It was slow. Errors were hard to catch. Audits were painful. And the business was growing, which meant the problem was getting worse.

What Was Built

Gainly built a custom reconciliation platform from the ground up. The platform pulls live transaction data from payment providers — including PawaPay (mobile money across Malawi, Zambia, and Zimbabwe), MTN Mobile Money, and Airtel Money — and matches it automatically against the expected records.

The matching logic handles the complexity that made manual reconciliation difficult: currency conversion, timing differences between when a payment is initiated and when it settles, provider-specific data formats, and edge cases that don't fit standard patterns.

The platform is built on React (the interface the team uses to view and manage reconciliation) and Supabase (the database layer that stores all transaction records, match results, and audit history). Slack notifications surface exceptions that need human review. Everything else reconciles without intervention.

The Outcome

The eleven-person reconciliation team now does other work. The process that took a full business day runs in real time. Every matched and unmatched record has a full audit trail. The business can grow without adding headcount to keep up with transaction volume.

Running a manual process that should be automated?

Describe it →