Last checked
Send the provider code in the mobile_money object of a Paystack charge: mtn (Ghana, Côte d'Ivoire), atl (Ghana, Kenya), vod (Ghana), mpesa (Kenya), orange and wave (Côte d'Ivoire). Mobile money is only for businesses in Ghana, Kenya and Côte d'Ivoire. Checked on 3 November 2026.
Imagine your checkout shows a phone field and a network dropdown. Somebody in Kisumu picks M-Pesa, somebody in Kumasi picks MTN. Behind the dropdown, your server sends one short string, and Paystack rejects the charge if the string is wrong for the country.
Paystack documents the codes in its payment channels page. The feature "is only available to businesses in Ghana, Kenya, and Côte d'Ivoire" (Paystack payment channels docs, checked on 3 November 2026). Here is the table, with the country as Paystack lists it.
| Network | Code | Country |
|---|---|---|
| MTN | mtn | Ghana and Côte d'Ivoire |
| ATMoney and Airtel Money | atl | Ghana and Kenya |
| Telecel | vod | Ghana |
| M-PESA | mpesa | Kenya |
| Orange | orange | Côte d'Ivoire |
| Wave | wave | Côte d'Ivoire |
Sources: Paystack payment channels docs, checked on 3 November 2026.
To practise these calls against a sandbox, take the Payment Integration for Developers course.
Two details trip people. The same code mtn means a different network and country depending on the business you are charging from. And atl covers Airtel Money in Kenya and Ghana under one code.
This sits inside a bigger picture of which rails work where. The African payment rails matrix has the wider table, and how to check a payment API against your own country explains how to confirm a country yourself.
You send a POST to https://api.paystack.co/charge with your secret key as a Bearer token. The body holds amount, email, currency and a mobile_money object with phone and provider (Paystack payment channels docs, checked on 3 November 2026).
POST https://api.paystack.co/charge
{
"amount": 1000,
"email": "customer@example.com",
"currency": "GHS",
"mobile_money": { "phone": "0551234987", "provider": "mtn" }
}
The docs example above uses GHS and an MTN number (Paystack payment channels docs, checked on 3 November 2026). For Kenya you change the currency to KES and the provider to mpesa. Paystack's currency table lists KES as available in Kenya (Paystack API reference, checked on 3 November 2026).
Phone format matters for M-Pesa. The docs recommend adding the country code for STK push, so 0722000000 becomes +254722000000 (Paystack payment channels docs, checked on 3 November 2026). The Ghana example in the same page uses the local form, 0551234987.
A good request returns data.status of pay_offline and a display text, "Please complete authorization process on your mobile phone". Show that text and wait (Paystack payment channels docs, checked on 3 November 2026).
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
Think of the customer at a matatu stage with a phone in one hand. The prompt arrives on that phone, not on your page. Paystack says the customer has 180 seconds to finish or the transaction fails, and you need a webhook URL to receive the final status (Paystack payment channels docs, checked on 3 November 2026).
charge.success webhook and mark the order paid only then.data.message (Paystack payment channels docs, checked on 3 November 2026).Webhook delivery also differs by environment. In live mode events go out every 3 minutes for the first 4 tries, then hourly for 72 hours. In test mode they go out hourly for 10 hours (Paystack webhooks docs, checked on 3 November 2026). Verify the x-paystack-signature header before you trust an event.
Kenya has more than one way to pay with M-Pesa, and Paystack mirrors them.
mpesa): the customer gets a prompt and enters their PIN (Paystack payment channels docs, checked on 3 November 2026).mpesa_offline, currency KES): the response gives an account_number, which is the Paybill, and an account_reference that identifies the transaction. Paystack warns that "wrong amounts will lead to transaction failure", so a new charge is needed to change the amount (Paystack payment channels docs, checked on 3 November 2026).mptill): set account to the other business's Till number. That business's phone receives the authorisation prompt (Paystack payment channels docs, checked on 3 November 2026).Offline suits a customer who reads a paybill off a screen at a pharmacy counter. STK push suits the customer already on your site. Till covers payments to another business's Till number.
If you collect from Kenyan banks too, Pesalink is a separate channel: available to registered Kenyan businesses, enabled by contacting Paystack support, with an account valid for 25 minutes (Paystack payment channels docs, checked on 3 November 2026).
Paystack publishes mobile money test numbers: an MTN number 055 123 498 7 with no PIN or OTP, an M-Pesa Kenya number +254 710 000 000 with no PIN or OTP, and an Orange Côte d'Ivoire number that needs OTP 1234 (Paystack test payments, checked on 3 November 2026). The page does not list a separate Telecel or Wave test number.
Test mode proves your code path: request, pay_offline, webhook, order update. It cannot prove a real phone will get a real prompt. Do one small live payment before you tell a client it works.
For the build skills, the Payment Integration for Developers course covers charge requests, callbacks and reconciliation. To see where each rail's sandbox stops matching production, read sandbox to production across African payment rails. Existing guides: accepting mobile money through Paystack and mobile money charge stuck at pending. If you want it built for you, see payments integration at Mctaba Labs.
STK push, C2B, B2C, callbacks and reconciliation, built in a live four-week course with code review.
See the payments course