← All posts

ROADMAP

The road ahead: more rails, more countries, one API.

Njia starts in Kenya, but mobile money is a continental habit. Here are the providers we’re adding next, and how we plan to let money cross borders as easily as it moves across town.

Mobile money is how much of Africa gets paid. Yet the moment a product grows past one country, its payments code splits in two: MTN MoMo in Kampala, Vodacom M-Pesa in Dar es Salaam, Orange Money in Dakar, and each one is a separate integration with its own authentication, callbacks and quirks.

Our goal is simple to state: launching in a new country should be a parameter, not a project. The same API call, the same signed webhooks, the same sandbox, whichever rail the money runs on.

A note on timing This post describes direction and order, not dates. We’ll announce each provider when it reaches the sandbox, and only call it live when it’s ready for real money.

The plan, in phases

  • NOW

    Kenya

    M-Pesa and Airtel Money are live. T-Kash is in the sandbox. Collections, subscriptions, signed webhooks, the CLI and the SDK are all available today.

  • NEXT

    Payouts

    Sending money, not just collecting it: refunds, marketplace seller payouts, salaries and disbursements, with the same idempotency and webhooks as collections. Payouts are also the foundation for cross-border payments.

  • NEXT

    The rest of East Africa

    Tanzania, Uganda and Rwanda. These are the markets Kenyan businesses expand into first, and they share many of the same providers.

  • LATER

    West, Central and Southern Africa

    Ghana, Francophone West Africa, Zambia, the DRC, Ethiopia and beyond, prioritised by where our developers are building.

  • EXPLORING

    Cross-border payments

    Collect in one country, pay out in another, through one API. More on this below.

Providers on our list

These are the providers we’re looking at, by market. The order within each phase will follow demand.

MarketProvidersCurrency
KenyaM-Pesa, Airtel Money (live) · T-Kash (sandbox)KES
TanzaniaVodacom M-Pesa, Airtel Money, Mixx by YasTZS
UgandaMTN MoMo, Airtel MoneyUGX
RwandaMTN MoMo, Airtel MoneyRWF
GhanaMTN MoMo, Telecel CashGHS
Senegal, Côte d’IvoireOrange Money, Wave, MTN MoMoXOF
ZambiaMTN MoMo, Airtel MoneyZMW
DR CongoVodacom M-Pesa, Orange Money, Airtel MoneyCDF, USD
Ethiopiatelebirr, M-PesaETB

What changes in your code

As little as possible. A payment in Dar es Salaam should look like a payment in Nairobi, with the currency and phone number telling us where it’s going:

Proposed · subject to change

// Kenya, today
await njia.payments.create({
  channel: "mpesa", currency: "KES", amount: 150000, phone: "254712345678",
});

// Tanzania, same call
await njia.payments.create({
  channel: "mpesa", currency: "TZS", amount: 2500000, phone: "255712345678",
});

// Uganda, a different provider, still the same call
await njia.payments.create({
  channel: "mtn_momo", currency: "UGX", amount: 50000, phone: "256772123456",
});

The things you rely on today come with every new provider:

  • One event format. payment.succeeded and payment.failed look the same whichever provider sent them, with provider-specific detail kept in its own field.
  • Sandbox first. Each provider arrives in test mode with its own magic numbers for cancellations, timeouts and insufficient funds, before it goes live.
  • Your accounts, your money. You connect your own merchant account in each country, and funds settle to you directly.

Cross-border: the hard part, and why it matters

East African businesses trade across borders every day, yet paying a supplier in Kampala from Nairobi still tends to mean a bank wire, a remittance app, or keeping money parked in each country. Mobile money wallets on both sides are a few seconds apart. Getting money between them shouldn’t take days.

We want it to look something like this:

Proposed · subject to change

// 1. Ask what it costs: a rate locked for a short window
const quote = await njia.quotes.create({
  from: { currency: "KES", amount: 1000000 },
  to:   { currency: "UGX", channel: "mtn_momo", phone: "256772123456" },
});

// 2. Accept it before it expires
const transfer = await njia.transfers.create(
  { quote: quote.id, reference: "SUPPLIER-118" },
  { idempotencyKey: "supplier-118" }
);
// 3. transfer.succeeded arrives as a signed webhook

The API is the easy part. Doing this properly means solving problems we won’t cut corners on:

  • Licensing. Moving money across borders is regulated in every country involved. We’ll work through licensed partners in each corridor rather than around the rules.
  • Exchange rates. A quote has to be honest: a locked rate, every fee shown up front, and a clear expiry.
  • Settlement. Money must be available on the receiving side the moment a transfer is accepted, which means managing liquidity in each currency.
  • Compliance. Identity checks, limits and screening, handled so you get clear answers instead of mystery declines.

We expect to start with corridors inside the East African Community, such as Kenya to Uganda and Kenya to Tanzania, and grow from there. We’re also watching continental efforts like the Pan-African Payment and Settlement System (PAPSS), which aim to make settling between African currencies cheaper.

What won’t change

  • Every new provider and corridor lands in the sandbox first, free.
  • Flat, predictable pricing, not a percentage of your revenue.
  • One SDK, one CLI, one set of docs.
Njia means “the way”. The way across the continent should be as short as the way across the street.

Building for more than one market?

Start in the Kenyan sandbox today. New providers arrive in test mode first.

Get your free test key