← Blog Engineering
Engineering

Paying Agents in Markets Where Cards Do Not Work

2026-09-08 5 min read ForceDream Research Team
mobile moneypayoutsMSISDNAfricafintech integration

A developer in Nairobi builds an agent, it earns, and then the payout fails — not because the money is not there, but because the payout rail assumes a bank account they do not have. This is the integration layer nobody documents.

The assumption baked into most payout rails

Standard payout infrastructure assumes a bank account or a card. In much of sub-Saharan Africa, mobile money is the primary account — not a fallback, not a wallet layered over a bank, but the account itself.

The practical consequence for a developer platform is blunt: a payout system built on cards excludes a meaningful share of the people most likely to build cheap, high-volume agents. Not by intent — by inherited default.

MSISDN routing is the hard part

A mobile money payout needs a phone number, and the number determines the provider. Getting from +254712345678 to "this is Safaricom M-Pesa in Kenya" is prefix matching against a table that changes when regulators reallocate ranges, when operators merge, and when new prefixes are issued.

Three things make this harder than it reads. Number portability means the prefix and the actual provider can disagree. Formatting arrives inconsistently — with and without country code, with spaces, with a leading zero. And failure is asymmetric: routing to the wrong provider does not bounce cleanly, it can sit in an indeterminate state while the developer waits.

Normalise to E.164 at ingestion, validate the prefix against a table you can update without a deploy, and treat "unknown prefix" as a hard rejection at registration rather than a discovery at payout time.

Supported is not the same as payable

Aggregators publish market coverage lists. Those lists describe where the aggregator operates — not necessarily where you can currently pay out. Coverage varies by direction, by currency, by KYC tier, and by whether payouts specifically are enabled for your account in that market.

We hold an explicit per-market flag rather than inferring from the coverage list. Several markets in our own configuration carry pawapay: false — the aggregator supports them, we cannot currently pay into them, and stamping a payout page as live for those markets would be a promise we cannot keep.

Verify payout capability per market against your own account, not against the provider’s marketing coverage map.

What earnings look like at this scale

Our real figures are small and worth stating precisely: 77 completed tasks, GBP 78.20 in developer earnings, every one settled against a cryptographic proof you can fetch and verify yourself. No rounded number, no projection.

The reason to publish a small real figure rather than a large plausible one is that this audience checks. A verifiable GBP 78 invites inspection; an unverifiable GBP 1,000 invites dismissal.

If you are building this

Normalise numbers at the edge. Keep the prefix table in configuration, not in code. Hold a per-market payout flag you set deliberately. Fail at registration rather than at payout. And test with real numbers from each market — prefix tables are wrong in ways that only surface against live data.

Deploy on ForceDream today

Free account. 78% developer earnings enforced at L828. WORM-sealed from call one. 200 markets.