Kenyan-built Cyzora Pay aims to make accepting M-Pesa a one-call job for developers
For any Kenyan website or app, accepting M-Pesa is not optional: it is how customers pay. Yet building that connection by hand can still take a development team weeks, from triggering payment prompts and handling callbacks that arrive late or not at all, to retrying failed requests and matching every payment to the right order.
Cyzora Technologies Ltd says its Cyzora Pay gateway, built in Kenya for Kenyan businesses, reduces that work to one API call and one webhook. A business sends a charge, the customer enters their M-Pesa PIN, and a signed webhook tells the business's server that the order has been paid. The same dashboard is used to send money out to staff and suppliers.
The service charges 1.5% per successful payment, with no setup or monthly fee, and offers a full test mode so developers can build and test the entire flow before any real money moves.
Five ways to get paid
Cyzora Pay gives a business one account, one dashboard and one REST API for collecting and sending money. Customers can pay in whichever way suits them:
- Phone prompt (STK push): the app calls POST /charges and an M-Pesa PIN prompt appears on the customer’s phone. One API call.
- Hosted checkout: one call returns a checkout_url that the app opens as a redirect or pop-up. One API call.
- Payment link: created in the dashboard and shared on WhatsApp, by SMS or as a QR code. No code.
- Paybill: customers pay to Paybill 4749813 using the business’s account number or short name. No code.
- WooCommerce: an official plugin for online shops, set up by pasting a secret key. No code.
Each payment lands in the business’s Cyzora balance as soon as the customer pays and is matched to its order automatically. Besides M-Pesa, the charges API also accepts Airtel Money and T-Kash.
How it compares with building on Daraja directly
Developers can integrate Safaricom’s Daraja API themselves, and for some teams that is the right choice. But everything around the raw M-Pesa calls then becomes the team’s own job. Cyzora sets out the main differences as follows:
- Paybill or till: with Daraja, a business needs its own, registered before going live; with Cyzora it gets an account number on Cyzora’s paybill from day one.
- Authentication: Daraja uses OAuth tokens that expire and must be refreshed; Cyzora uses one secret key in one header.
- Payment results: Daraja sends a callback in Safaricom’s format with no built-in retry; Cyzora sends a signed webhook with retries, in one format for every payment type.
- Payouts: Daraja needs separate B2C and B2B setups with their own credentials; Cyzora uses a single POST /payouts to a phone, till, paybill or bank account.
- Testing: Daraja’s sandbox has its own credentials and shortcodes; Cyzora uses test keys and test phone numbers that choose the outcome.
- Reconciliation: left to the developer with Daraja; with Cyzora every payment is matched to its reference and can be exported as CSV.
Built for production
The company highlights several features aimed at avoiding problems once an app is live:
- Signed webhooks: each request carries an HMAC-SHA256 signature. If a server does not reply with a 2xx status, Cyzora retries after 10 seconds, 30 seconds, 2 minutes and 10 minutes, then emails the business.
- Idempotency keys: sending the order number as an Idempotency-Key means a retried request returns the first result instead of prompting the customer twice.
- Account-number checks: paybill account numbers carry a check digit, and M-Pesa confirms them with Cyzora before money moves, so a typo cannot send a payment to someone else.
- Code samples: examples in Node.js, Python and PHP, plus a ready-made prompt for AI coding assistants such as Claude, ChatGPT, Cursor and Copilot.
Pricing
Cyzora charges 1.5% on each successful payment. Withdrawals carry a flat fee that depends on the destination, starting at KES 5, and is shown before the user confirms. Failed and cancelled payments cost nothing, and there is no setup fee, monthly fee or contract.
Who it is for
- Online shops: M-Pesa at checkout through the API or the WooCommerce plugin, which supports both classic and block checkouts.
- SaaS and mobile apps: a PIN prompt inside the product, with the order or subscription marked paid when the webhook arrives.
- Restaurants and delivery services: payments matched to orders automatically, without manual bookkeeping.
- Schools and institutions: fees collected through the paybill and credited to the right account.
- Marketplaces and gig platforms: vendors, riders and contractors paid through the payouts API, each payout with its own M-Pesa receipt.
- Agencies: several client businesses run from one login, each with its own balance, links and paybill account number.
For sellers who trade on WhatsApp and have no website, a payment link works with no code at all.
A first test payment in five minutes
- Create a free account at app.cyzora.co.ke/register.
- Create a test key under API keys in the dashboard. It starts with sk_test_.
- Send a test charge. Amounts are in cents, so KES 1,500 is 150000, and the test number 254700000001 always succeeds.
- Add a webhook URL on the Webhooks page to receive the signed result on your server.
- Verify the business with ID and business documents, then switch to the sk_live_ key.
A test charge looks like this:
curl -X POST "https://api.cyzora.co.ke/api/v1/charges" \
-H "X-API-Key: sk_test_..." \
-H "Idempotency-Key: order_1042" \
-H "Content-Type: application/json" \
-d '{"amount": 150000, "phone": "254700000001", "account_ref": "Order 1042"}'A few seconds later, the server receives:
{
"event": "charge.succeeded",
"account_ref": "Order 1042",
"amount": 150000,
"currency": "KES",
"status": "succeeded",
"mpesa_receipt": "TBR89X1024"
}Developers can also test failure cases: 254700000002 simulates a low balance, 254700000003 a cancelled payment and 254700000004 a timeout. A live demo at demo.cyzora.co.ke shows a test payment, its webhook and a payout side by side, with no sign-up.
“Payments should be the easy part”
Cyzora’s founder, Emmanuel Charles, says the gap the company is filling is not M-Pesa itself but everything around it.
“Most businesses in Kenya already get paid on M-Pesa. What they lack is the plumbing around it,” he said. “I built Cyzora so that payments become the easy part of your product, not the part that keeps you up at night. Bring your app, your store or your client’s project, and let’s get it taking payments this week.”
Getting started
- Website: cyzora.co.ke
- Documentation: cyzora.co.ke/docs
- Free account: app.cyzora.co.ke/register
- Live demo (no sign-up): demo.cyzora.co.ke
Details are drawn from Cyzora Pay’s homepage, API documentation, pricing page, Cyzora vs Daraja comparison and About page, read on 28 October 2026. Photos: Fiona Graham via Wikimedia Commons (CC BY-SA 2.0); Ivan Small via Wikimedia Commons (CC BY-SA 2.0); Cyzora logo courtesy of Cyzora. Thumbnail design: HAMASTA MEDIA.
More in Technology
See all
High Court lets Safaricom join Jamii Telecom's fight against new spectrum fees

Cassava becomes authorised reseller of Anthropic's Claude AI models across Africa

Airtel Money revenue jumps 34% to $830 million in first results since London listing

Hospitals to generate SHA claims straight from patient records under new Digital Health Agency system

Safaricom launches Family Share, letting Home Fibre customers share data or minutes with five phones on one bill







Global Community Remarks
0