Nearly every Kenyan business that sells online reaches the same fork. You can wire M-Pesa into your site yourself through Safaricom's Daraja API, or you can hand the job to a payment company and pay them a slice of every sale. Both work. They cost very different amounts, and the gap gets wider the more you sell.
Most of what is written about this explains the steps. We have written that too, and it is linked below. This post is about the part that decides which route you should be on in the first place: the money, and the one approval step that delays most launches.
The Three Routes
There are only three, whatever the marketing says.
Direct through Daraja
Your own Paybill or Till. Your server talks to Safaricom's API. You pay the Safaricom merchant tariff and nothing else per transaction.
Through an aggregator
Pesapal, IntaSend, Flutterwave and others. They hold the relationship with Safaricom, add card payments, and take a percentage on top.
A plugin on top of either
A WooCommerce or Shopify plugin is not a third route. It is a front end for one of the two above, and the fees underneath are unchanged.
That last point catches people out. Installing an M-Pesa plugin does not give you an M-Pesa account. It still needs either your own Daraja credentials or an aggregator account behind it.
What Safaricom Charges You Now
If you collect through your own Buy Goods till, the business pays the tariff and the customer pays nothing. From 7 August 2026 the bands are reported as follows.
| Collection | Before 7 Aug 2026 | From 7 Aug 2026 |
|---|---|---|
| KES 1 to 200 | Free | Free |
| KES 201 to 500 | 0.55% | Free |
| KES 501 to 36,363 | 0.55% | 0.55% |
| Above KES 36,363 | Capped at KES 200 | Capped at KES 200 |
Two things are worth being precise about, because they are easy to mix up.
The first is that this is the Buy Goods tariff, which the merchant pays. Paybill works differently: the customer can be charged, and the collection arrangement is set per business, so your Paybill tariff is a question for your Safaricom account manager rather than for a blog.
The second is that a separate reduction announced at the same time, for Pochi la Biashara, was described as promotional and running from 1 August to 31 October 2026. Pochi is a different product, the customer pays it, and it is not what a website checkout uses. No end date was stated for the Buy Goods change.
The Maths on a Real Basket
Percentages are abstract until you put a basket against them. Here is what the Safaricom merchant tariff takes from four typical Kenyan baskets, with nothing else layered on top.
| Sale | Safaricom takes | You keep |
|---|---|---|
| KES 450 | Nothing | KES 450 |
| KES 2,000 | KES 11 | KES 1,989 |
| KES 15,000 | KES 82.50 | KES 14,917.50 |
| KES 80,000 | KES 200 | KES 79,800 |
The shape of that table is the whole argument. At 0.55 per cent with a hard cap, the Safaricom tariff is one of the cheapest ways to take money anywhere. Every percentage point an intermediary adds is measured against a baseline of roughly half a per cent, not against card rates.
Run it the other way to see the scale. On a shop turning over KES 500,000 a month in M-Pesa sales, the direct tariff costs roughly KES 2,750. A 3 per cent aggregator rate on the same turnover costs KES 15,000. That difference is a salary.
What the Aggregators Charge
This is where we are going to be less definite than you might want, deliberately.
IntaSend publishes its rates openly. Its pricing page shows 3 per cent on local M-Pesa collections, 3.5 per cent on local cards and 4.5 per cent on international cards, with payouts at a flat KES 100. It also lets you start collecting through its own shortcode, so you can be live without your own Paybill at all.
For Pesapal and Flutterwave, we could not retrieve a current published rate card from the companies themselves, and the third-party figures circulating for both disagree with each other by more than double. We are not going to print a number we cannot stand behind, so the useful advice is this: ask for a written fee schedule before you sign, and make sure it states the M-Pesa collection rate, the card rate, the settlement period, and whether there is a monthly or setup fee. Any provider worth using will send that on request.
Two questions matter as much as the percentage:
- Who holds the money, and for how long. Direct, settlement lands in your own M-Pesa account. Through an aggregator, your money sits with them until settlement, which may be same day or may be up to three working days. For a business buying stock weekly, that gap is a real cost.
- What happens on a dispute or a reversal. Ask before you need the answer.
The Approval Step That Delays Launches
Going direct has one genuine friction point, and it is not the code.
To move a Daraja app from sandbox to production, Safaricom needs a live Paybill or Till in the business name, a working sandbox integration, and a Business Administrator or Business Manager on the M-Pesa Org Portal. That last requirement is the one that catches teams out, because the Org Portal is separate from the Daraja developer portal, the role is set up through Safaricom rather than self-service, and the one-time password that completes go-live is sent to that person's line.
If nobody in the business has that role yet, the clock starts when you begin arranging it, not when your code is ready.
Have these ready before you apply
- A live Paybill or Till number in the registered business name.
- A named Business Administrator or Business Manager on the M-Pesa Org Portal, with access to that phone line on the day.
- Your business registration documents, complete and matching the account name.
- A callback URL that is already live, public, and on HTTPS. Not a localhost tunnel, not a staging address you plan to change.
- A sandbox integration that actually completes a payment end to end.
On timing, developers report anything from one to three working days up to a fortnight in busy periods. Safaricom does not publish a committed turnaround, so plan as though it will take a week you do not control, and never give a client a launch date that depends on it.
Five Ways This Breaks in Production
Everything below is the same whichever route you pick, and every one of them shows up as the same symptom: a customer who paid and an order that says unpaid.
| The mistake | What to do instead |
|---|---|
| Marking the order paid when the API accepts the STK Push request. | That response only means Safaricom accepted the request. Mark the order paid from the callback, and from nothing else. |
| Marking the order paid when the customer returns to the site. | They might close the browser, lose signal or pay on a different phone. The callback is the only thing that knows. |
| Assuming the callback arrives once. | Make it idempotent. Store the M-Pesa receipt number, and ignore a second callback carrying one you already have. |
| A slow or unreachable callback endpoint. | It must be public HTTPS and answer quickly. If your handler does heavy work, acknowledge first and process after. |
| Nobody reconciles. | Run a daily check of M-Pesa statement against orders. The gaps are where your money is. |
If you are on a Till rather than a Paybill, note that the shortcode you go live with and the number the payment is addressed to are not always the same field in the request. Get that wrong and every payment fails with an unhelpful error. Our step by step guide to adding M-Pesa to a website covers the request fields, and the WooCommerce guide covers the plugin route in detail.
Which Route for Which Business
| If this is you | Route | Why |
|---|---|---|
| Kenyan customers, M-Pesa only, steady volume | Direct Daraja | You pay roughly half a per cent and keep the rest. Nothing beats it on cost. |
| You need cards as well, local or international | Aggregator, or both | Daraja does M-Pesa only. Many shops run M-Pesa direct and an aggregator alongside for cards. |
| You have no Paybill or Till yet and want to sell this week | Aggregator | Some let you collect through their shortcode immediately. You can move to direct later. |
| Low volume, few orders a month | Aggregator | A percentage on a handful of sales costs less than the time to build and maintain your own. |
| You need payouts to customers or suppliers | Depends | Daraja B2C handles it, but has its own approval. Compare against the aggregator's payout fee. |
Switching later is normal and not expensive if the checkout was built properly. Start where you can start, and move when the percentage starts to hurt.
What the Build Costs
Separate from the per transaction fees, there is the one-off cost of wiring it up.
We charge KES 5,000 as a one-time, all-inclusive fee for a full M-Pesa integration. That is a flat fee rather than a cut of your sales, and it covers STK Push, Paybill and Till, C2B and B2C payouts, live testing, and the callback wiring that marks an order paid automatically. It works on websites, applications and back-office systems. Everything that fee includes is listed on our page for M-Pesa integration for your website.
If you are building the shop itself at the same time, an e-commerce site with M-Pesa runs KES 50,000 to 200,000 depending on product count, inventory rules and how much is automated, and e-commerce maintenance is KES 10,000 a month. Full detail is on the e-commerce page, and our guide to what an online shop costs in Kenya breaks the ranges down.
- Work out which route actually suits your volume before anything is built.
- Set up Daraja, including the sandbox integration and the go-live application.
- Wire the callback so orders mark themselves paid, with duplicates handled and receipts stored.
- Test with real money on a live till before you announce it.
- Hand over the reconciliation routine, so somebody is checking.
Frequently Asked Questions
What does it cost a business to accept M-Pesa on a website?
If you collect through your own Buy Goods till using the Daraja API, the merchant pays the Lipa na M-Pesa tariff. As reported from Safaricom's August 2026 notice, collections up to KES 500 are free, collections from KES 501 to 36,363 are charged 0.55 per cent, and anything above that is capped at KES 200. If you collect through an aggregator instead, you pay that company's percentage on top of their own arrangement with Safaricom. Confirm your own tariff with Safaricom, because Paybill pricing in particular is arranged per business.
Is it cheaper to integrate Daraja directly or use a payment gateway?
Direct is cheaper per transaction for M-Pesa collections in Kenyan shillings, because you pay only the Safaricom merchant tariff. An aggregator adds its own percentage, and published aggregator rates for M-Pesa generally sit in the low single digits. The aggregator buys you card payments, a faster start and less to maintain. The honest rule is that direct wins on volume, aggregators win on speed and on cards.
What do you need before Safaricom will approve M-Pesa go-live?
A live Paybill or Till in the business name, a Daraja developer account with a working sandbox integration, and a Business Administrator or Business Manager on the M-Pesa Org Portal. That last one is separate from Daraja and is where most launches stall, because it is set up through Safaricom rather than in the developer portal and the go-live one-time password goes to that person's line. Your callback URL must also be a public HTTPS address that Safaricom can reach.
How long does M-Pesa go-live approval take in Kenya?
Reports from developers range from one to three working days up to two weeks in busy periods. Safaricom does not publish a committed turnaround, so treat it as a week you cannot control and do not promise a client a launch date that depends on it. The delays that are inside your control are the ones worth removing: complete business documents and a callback URL that is already live on HTTPS.
Did M-Pesa charges for businesses change in 2026?
Yes. From 7 August 2026 the free band for Buy Goods merchant collections moved from KES 200 to KES 500, with 0.55 per cent from KES 501 to 36,363 and a KES 200 cap above that, as reported from Safaricom's notice. No end date was stated for that change. A separate reduction announced at the same time for Pochi la Biashara was described as promotional from 1 August to 31 October 2026, but Pochi is a different product and is not what a website checkout uses.
Why does an M-Pesa order show as unpaid when the customer was charged?
Because the site marked the order from the wrong signal. The response to an STK Push request only means Safaricom accepted the request. Payment is confirmed later, by a callback to your server. If the site marks an order paid when the customer returns to the page, or gives up when the browser closes, you get paid customers with unpaid orders. Mark orders paid from the callback only, store the M-Pesa receipt number, and handle the same callback arriving twice.
Where the figures come from
The 7 August 2026 Buy Goods bands are read from Safaricom's notice as reported by Tech-ish, The Kenya Times, Khusoko and People Daily. IntaSend's rates are from its own pricing page, read on 24 October 2026. Daraja go-live requirements are from Safaricom's developer documentation and from published production checklists. Deliberately not printed here: a Pesapal or Flutterwave percentage, because their own current rate cards could not be retrieved and the third-party figures conflict; an STK Push transaction limit or API rate limit, because no official Safaricom figure was found for either.
Tell us your monthly volume and we will tell you the route
It is a five minute conversation and it usually saves more than the integration costs. If you want it built, M-Pesa integration is KES 5,000 one time, all inclusive. Talk to us on WhatsApp at +254 722 334 188, email hello@wpfoss.ke, or call +254 709 384 200.
See M-Pesa IntegrationRelated: Step by Step Guide · WooCommerce and M-Pesa · Pesapal and Cards · E-commerce Sites