1. Create the payin
reference with your order. A 201 means the payin was started, not that the customer has paid.
network and customer.msisdn are required. The number accepts local or international format (97000000, 22997000000 or +22997000000).- Minimum Mobile Money amount: 300 (700 for NGN).
- XOF, XAF and NGN amounts must be whole numbers.
expiresInSecranges from 60 to 86400 seconds.- Check List available networks before showing networks to customers: operators are occasionally under maintenance (
network_unavailable).
2. The customer approves
What the customer does next depends on the operator. Read the create response to know which case you’re in:
The payin stays
PENDING or PROCESSING meanwhile.
Networks that need a code
Some operators — currently Orange Money Côte d’Ivoire (ORANGE_CI) and Burkina Faso (ORANGE_BF) — don’t send a prompt. Instead, the customer generates a one-time code on their phone. In that case the create response has otpRequired: true:
-
Show
otpInstructionsto the customer and ask for the code. The text is in French, written for the customer, so show it as-is. -
Send it with Confirm a payin with a code:
-
The payin moves to
PROCESSING; continue with the webhook below.
otp_failed, the code was wrong or the operator refused the payment: let the customer generate a new code and try again.
Sandbox payins complete immediately and never ask for a code.
3. Receive the webhook
When the payin settles you receivePAYIN_RECEIVED or PAYIN_FAILED:
4. Confirm before fulfilling
Before you ship goods or credit a user, confirm the status from the API:status is COMPLETED, and only once per reference — webhooks can be delivered more than once.
Statuses
Checklist
- Store the
referencewith your order before redirecting the customer. - Fulfil from the webhook or a status check, never from the redirect alone.
- Make your fulfilment idempotent per
reference. - Handle
FAILEDby letting the customer retry, possibly on another network.
