Skip to content

Providers

Connect a provider, decide what it carries, and see what each field does to routing.

A provider connection is your own account with a payment provider, held by Wajub and used on your behalf. Wajub does not resell anyone's rails: you sign with CinetPay or Flutterwave or MTN, you paste the credentials here, and the engine charges through them under your contract and your negotiated rates.

Everything the router knows about a connection is on its page under Orchestration, Providers. This page is what each field there does.

Connecting one

The wizard is four steps, and only the first two depend on the provider you picked.

Credentials. Every provider declares its own fields, because a CinetPay site_id has no equivalent at Stripe. The form is built from that declaration, so it asks for exactly what that provider needs and nothing else. Values are encrypted at rest and never returned to you in full afterwards.

Channels. Which of the provider's capabilities you want to route through this connection. Leave it untouched and you get everything the provider globally supports, minus the channels that need the provider to switch them on for you first.

Routing. The four numbers this page is really about: priority, weight, and your negotiated rate.

Review. Nothing is written before this step, and a connection test is available on the connection afterwards, which calls the provider with your credentials and tells you whether they work before a real payer depends on them.

What a connection is allowed to carry

Two lists narrow a connection, and both behave the same way: empty means everything, not nothing.

Channels. The router first checks the provider can technically carry the payment's channel, and then that your own channel list admits it. If you never set a list, the second check passes for every capability the provider has. Narrowing is opt-in.

Currencies. Same rule. An empty currency list accepts every currency the provider can settle.

The channel here is an exact slug, the same one the router works on: cm.mtn, sn.wave, ke.mpesa, card. There are no product-level values like mobile_money or bank_transfer anywhere in the engine, and picking a channel list is picking operator rails one by one.

Some channels need the provider's agreement first

A few capabilities require the provider to enable them on your account before they will accept a charge. Those are excluded from the default "everything the provider supports" list, so they never appear by accident. Add them explicitly once the provider has confirmed, not before.

Routing configuration

Four fields, and they do very different amounts of work.

priorityintegeroptionaldefault : 0
Orders the whole candidate list. Higher is tried first, and a lower tier is never touched until every connection above it has been tried and failed. This is the only absolute control.
weightinteger, 0 to 100optionaldefault : 100
Decides which connection goes first among candidates that tie on priority and on score, by weighted draw. The others keep their order behind the winner.
Negotiated ratepercentageoptional
What this provider charges you, percent of the amount. Feeds the least-cost boost in the routing score. Left at zero, every connection computes to a cost of zero and the boost lands on all of them at once.
Fixed feeamountoptional
The per-transaction part of the same cost, in your base currency. Both can be overridden per channel when a provider prices one rail differently.

Priority is the field to reach for when you know the answer. The other three only matter inside a tier, once priority has already grouped your connections.

A worked ordering: two connections both able to carry cm.mtn, one at priority 10 and one at 0. The first is always called first, whatever the second costs and however well it is performing. Move them both to 10 and the score starts deciding, which is when rates and live success rates begin to matter.

Enter your rates before expecting least-cost routing

The least-cost boost is worth 200 points and goes to the cheapest connection for that exact amount and channel. With no rates entered, every connection ties at zero and all of them get the boost, which is the same as none of them getting it. Filling in what each provider actually costs you is what turns that boost on.

The catalogue, and what it means to be in it

The provider list in the Dashboard shows what you can connect. Three things have to line up before a provider can carry a live payment, and a provider can appear in the catalogue while missing one.

RequirementWhere it comes from
The provider is listed and activeWajub's catalogue
The engine ships a driver for itThe payment runtime, roughly forty today
You hold credentials for itYour own contract with the provider

A provider with no driver is dropped from every candidate list before ranking, silently and by design. If you have connected something and it never appears in a routing decision, that filter is worth checking before the channel and currency ones.

Providers come in six types, and the type is what tells you the shape of the thing: aggregator, mobile_money, card, wallet, bank, crypto. An aggregator reaches many operators through one contract, which is why one aggregator connection can fill a whole column of the matrix. A direct mobile money connection reaches exactly one operator's rails.

Wajub also operates a house connection for Cameroon, covering cm.mtn and cm.orange, which is granted through an application rather than by pasting credentials. It behaves like any other connection once it is in place, priority and weight included.

How many you can connect

The ceiling is on your plan, and it is the one limit that shapes what orchestration can do for you.

PlanConnectionsRouting rules
Pay as you go2Not included
Growth6Included
ScaleUnlimitedIncluded
EnterpriseUnlimitedIncluded

Two connections is the minimum for a cascade to exist at all. On a single connection the engine still runs, still ranks, and still records a decision, but the list is one line long and a path failure ends the payment.

When a connection goes bad

Two mechanisms act on their own, on different timescales, and you do not configure either.

The health badge on the connection is a 24-hour read of your credited transactions through it, green from 95 %, amber from 80 %, red below, and grey until five payments have gone through. It is a judgement about the last day, meant for you.

The circuit breaker acts in seconds. Five path-side failures inside a minute on one channel and that route is dropped from candidate lists for five minutes, then probed once. It is scoped to your account, one channel and one provider at a time, so a connection failing on cm.mtn keeps serving cm.orange normally. Waterfall & fallback has the full behaviour.

What your integration can see

Your connections are readable from the API, and deliberately without the routing configuration.

GEThttps://api.wajub.com/providers

The response gives each connected provider its id, slug, name, logo, type, active flag, and the channels actually available through it, which is the intersection of what the provider supports and what you enabled. Priority, weight, rates and credentials are not in it, and there is no endpoint that writes any of them.

Each entry of channels is the same object GET /channels returns, so one connection with six channels carries six of them. The sample below shows one connection and one of its channels in full.

Response · one connection, one channel
{
"id": "01a048f7-451d-7245-93b7-c094e0117482",
"slug": "cinetpay",
"name": "CinetPay",
"logo": "https://assets.wajub.com/img/providers/cinetpay/icon.png",
"type": "aggregator",
"is_active": true,
"sandbox": false,
"channels": [
{
"id": "chn.4ALL37uSbXWS",
"uid": "chn.4ALL37uSbXWS",
"slug": "cm.mtn",
"name": "MTN Mobile Money CM",
"type": "mobile_money",
"countries": [
"CM"
],
"logo": "https://assets.wajub.com/img/channels/momo.svg",
"active": true,
"collect": true,
"payout": true,
"currency": "XAF"
}
]
}

Changes to a connection are pushed to your webhook endpoints, which is how a backend stays in step without polling that list.

EventWhen it fires
provider.activatedA connection became active, on creation or after being resumed
provider.deactivatedA connection was paused or disconnected
provider.channel_activatedA channel became routable through a connection
provider.channel_deactivatedA channel stopped being routable through it

Use the channel events rather than a hardcoded list if your checkout shows payment methods: they fire on the exact set the router will accept.

Asking for a provider that is not listed

Write to providers@wajub.com with the provider, the countries and the channels you need. A new provider needs a driver written and tested in the payment runtime, so it is a build rather than a configuration change, and the countries you name are what decides where it lands in the queue.

What did you think of this content?