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.

What changed. Safaricom revised the Lipa na M-Pesa merchant tariff with effect from 7 August 2026. If you last costed this before then, your numbers are out of date, and the change is in your favour.

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.

CollectionBefore 7 Aug 2026From 7 Aug 2026
KES 1 to 200FreeFree
KES 201 to 5000.55%Free
KES 501 to 36,3630.55%0.55%
Above KES 36,363Capped at KES 200Capped 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.

Confirm your own tariff. These bands are read from Safaricom's notice as reported in the Kenyan technology and business press. Safaricom's own tariff page would not load for us when this was written. Before you build a price list around these numbers, check them against your own merchant statement or ask Safaricom directly.

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.

SaleSafaricom takesYou keep
KES 450NothingKES 450
KES 2,000KES 11KES 1,989
KES 15,000KES 82.50KES 14,917.50
KES 80,000KES 200KES 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:

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

  1. A live Paybill or Till number in the registered business name.
  2. A named Business Administrator or Business Manager on the M-Pesa Org Portal, with access to that phone line on the day.
  3. Your business registration documents, complete and matching the account name.
  4. A callback URL that is already live, public, and on HTTPS. Not a localhost tunnel, not a staging address you plan to change.
  5. 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 mistakeWhat 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 youRouteWhy
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.

What we do on an M-Pesa job
  • 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.
Need this done for you? WPfoss adds M-Pesa to your existing website for a one-time KES 5,000, all-inclusive, from Daraja setup to the live KES 1 test. See our M-Pesa integration service.

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 Integration

Related: Step by Step Guide · WooCommerce and M-Pesa · Pesapal and Cards · E-commerce Sites