Routing Engine service for mobile money payments across multiple aggregators in West Africa.
# payment-routing-engine
Score-based payment routing across multiple mobile money aggregators — West Africa.
Clone, plug in your aggregator adapters under `src/providers/`, and deploy.
---
Integrating mobile money payments in your app (GSMA, 2026) often means picking one aggregator and integrating it. That works until it doesn't:
- some aggregators don't support all the operators your users are on
- when a corridor degrades or an aggregator has issues, you have no routing alternative on your side
- with multiple aggregators integrated, there's no standard way to decide which one to use at a given time
This service adds a routing layer on top of your aggregators: it scores them per operator corridor using a weighted scoring model, routes to the best available option, and falls back automatically on retryable failure — circuit breaker built in.
---
Scores derive from a 24h sliding window, cached 5 min in Redis, invalidated on each webhook. Cold start defaults to `0.5` across all components.
## Provider integration model
Payment aggregators in West Africa differ in how they expose payment collection to merchants.
### DIRECT providers — server-initiated collection
These aggregators expose a server-to-server REST API. The backend sends a collection request with the customer's phone number and amount; the aggregator forwards it to the operator, which delivers a confirmation prompt to the customer (USSD push for MTN MoMo/Moov/Orange Money, in-app notification for Wave and similar app-based wallets). The result comes back via webhook.
| Provider | Countries |
|-----------|-----------------------------|
| FedaPay | BJ |
| CinetPay | CI, SN, TG, BF, CM |
| FeexPay | BJ, CI, TG, SN |
| PayDunya | SN, CI, BF, ML, NE |
### REDIRECT providers — hosted checkout
Some aggregators do not publish a server-side collection API. KKiaPay is an example: there is no endpoint to initiate a payment pr …