ClientUN World Food Programme
Beneficiaries180,000+
StackPython · PostgreSQL · Mobile Money APIs · REST
RoleSenior Technical Contractor

The Problem

WFP's Nigeria operation was distributing cash assistance to over 180,000 beneficiaries via mobile money platforms. The challenge: reconciling what WFP disbursed against what beneficiaries actually received — across multiple mobile network operators, with varying transaction success rates, in real time.

Discrepancies between disbursement records and mobile money confirmations were creating delays in assistance and significant manual reconciliation work. The existing process was spreadsheet-driven, error-prone, and couldn't scale to the beneficiary volumes the operation required.

The Challenge

Mobile money reconciliation sounds straightforward until you encounter the reality: each mobile network operator has its own API format, its own failure codes, its own retry logic, and its own definition of a "successful" transaction. A payment that shows as successful in WFP's system may be pending, failed, or reversed on the operator's side — and the reconciliation window can span days.

Beyond the technical complexity: the stakes were uniquely high. These were food assistance payments to vulnerable populations. A false positive — marking a failed transfer as successful — meant a beneficiary didn't receive assistance they were entitled to. The system had to be conservative, auditable, and explainable to non-technical WFP programme staff.

The Approach

We built a reconciliation engine that ingested disbursement data from WFP's system and transaction confirmation data from each mobile money operator, normalised both against a canonical schema, and produced a reconciliation report that flagged discrepancies at the transaction level with enough context for programme staff to act.

The system was designed to be operator-agnostic — new mobile money platforms could be integrated by adding an adapter, not rewriting the core logic. It ran on a configurable reconciliation schedule and maintained a full audit trail of every state change for every transaction.

Critically, we built the interface for programme staff, not engineers. The reconciliation dashboard used plain language, not transaction codes. Staff could drill down to individual beneficiaries, understand exactly what happened to their payment, and initiate retry or escalation workflows without technical support.

The Outcome

Manual reconciliation time dropped by over 80%. Discrepancy resolution — previously measured in days — moved to hours. The system processed over 2 million transaction reconciliations during the engagement period with a false positive rate below 0.1%.

WFP programme staff adopted the dashboard as their primary operational tool. The system was handed over to WFP's internal technical team with full documentation and remained in production after the engagement ended.

"The interface was built for the programme officer at 4pm on a Friday, not for the engineer who built it."
— Funso Oyebami, Lead Developer