RetailPOS.AI
How-to

M-Pesa merchant setup for POS in Kenya (Daraja API, Lipa Na M-Pesa, STK Push)

Last reviewed 2026-05-27 · by the RetailPOS team

M-Pesa is the world's most successful mobile-money rail — over 50+ million active Kenyan users, processing trillions of KES annually, with 95%+ digital retail share in many segments. For a Kenyan retailer, M-Pesa is not a tender option — it's the default tender. Customers expect to pay via M-Pesa; cashiers expect to default to M-Pesa; the POS workflow assumes M-Pesa unless explicitly overridden. Card and cash are the exceptions, not the rule.

This guide walks through the practical setup: understanding M-Pesa architecture (Lipa Na M-Pesa Till Number vs Paybill, STK Push, C2B, B2C), opening a merchant account via Safaricom, integrating M-Pesa as POS tender via the Daraja API, fee structures, settlement timing, reconciliation, and the secondary mobile-money providers (Airtel Money, Equitel) for non-Safaricom-network customers.

M-Pesa architecture in 60 seconds

M-Pesa is built and operated by Safaricom (with M-Pesa Holdings in Kenya). Architecture relevant to merchant retail:

  • Lipa Na M-Pesa Till Number — a 5-7 digit till number assigned to your merchant account. Customer enters the till number + amount in their M-Pesa app or via USSD (*334#); payment settles to your linked till account.
  • Paybill — alternative merchant account type with a 6-digit paybill number + per-customer account reference. Used for utility-style billing (rent, school fees, subscription); customer enters paybill + their reference + amount.
  • STK Push (SIM Toolkit Push) — API-initiated payment flow. Merchant's POS triggers a payment prompt to the customer's phone; customer enters M-Pesa PIN on the prompt; payment settles. The cashier-friendly flow because the merchant initiates rather than waiting for the customer to type the till number.
  • C2B (Customer to Business) — the customer-initiated flow; customer dials the till number themselves. Reconciliation matches inbound payments to open sales by reference.
  • B2C (Business to Customer) — outbound flow for refunds + supplier payments + payroll.
  • Daraja API — Safaricom's developer API providing programmatic access to all the above flows. Modern POS systems integrate via Daraja.

For a Kenyan POS, the standard setup: Lipa Na M-Pesa Till Number for the merchant account + Daraja API integration to trigger STK Push from the till. Customers without app access can fallback to manual C2B (typing the till number) or scanning the till's dynamic QR.

Opening a Lipa Na M-Pesa Till Number

Lipa Na M-Pesa merchant account registration via Safaricom:

  • Visit any Safaricom shop (or apply via the M-Pesa Business portal at m-pesaforbusiness.co.ke)
  • Submit application: business name + KRA PIN + business registration documents + linked bank account (in business name) + owner ID copies
  • Safaricom assigns a Till Number — typically 5-7 digits
  • Provisioning typically 3-10 working days
  • Initial setup includes the M-Pesa till device (small Bluetooth-enabled receipt printer / display device) for receiving payment notifications

For POS integration, you also need Daraja API credentials:

  • Register on Safaricom Developer portal (developer.safaricom.co.ke)
  • Create an app linked to your Lipa Na M-Pesa Till Number
  • Generate Consumer Key + Consumer Secret + Passkey for the production environment
  • Configure into the POS during onboarding

M-Pesa fee schedule (verify current rates): merchant fees apply per transaction with tiered pricing based on transaction size; consumer-side fees vary based on whether the customer is on Safaricom or other networks. Subscription-style monthly fee minimal or nil.

The POS checkout flow — STK Push

With M-Pesa configured as POS tender on RetailPOS:

  • Cashier rings the sale; the till defaults to M-Pesa tender
  • POS triggers STK Push via Daraja API — Safaricom sends payment-prompt to the customer's phone with the till's amount + reference
  • Customer's phone displays the M-Pesa STK Push prompt; customer enters their M-Pesa PIN
  • Payment posts to your till account; webhook confirms to the POS in 3-15 seconds
  • Receipt prints (with KRA eTIMS CUIN + QR for VAT-applicable sales)

Total elapsed time from M-Pesa-tender tap to printed receipt: typically 5-20 seconds (gated mostly by customer PIN entry speed). Comparable to card-tap; faster than waiting for the customer to manually type the till number.

If STK Push fails (customer's phone offline, M-Pesa PIN entry timeout, insufficient balance), the POS shows the failure within the checkout flow; cashier offers alternative tender (different STK Push attempt, manual C2B fallback, card, cash).

Static QR + manual C2B fallback

For customers whose phones don't support STK Push (older phones, network issues) or who prefer to initiate the payment themselves:

  • Display a static QR with the till number on the customer-facing display
  • Customer opens M-Pesa app → Scan → enters amount → confirms
  • Or customer dials *334# → Buy goods → enters till number + amount + PIN
  • Payment settles to your till account; webhook confirms; receipt prints

The POS' manual-C2B reconciliation matches the inbound payment to the open sale by reference. RetailPOS supports both flows (STK Push as primary, manual C2B as fallback); cashier UX is consistent.

Airtel Money + Equitel secondary integration

For customers on Airtel Kenya or Equity Bank Equitel networks, secondary mobile-money providers handle payment:

  • Airtel Money — separate merchant relationship with Airtel; per-transaction fee structure varies; lower customer base than M-Pesa but meaningful in some regions
  • Equitel — Equity Bank's mobile-money service; integrated with Equity Bank account; useful for Equity Bank customer base

RetailPOS supports both as alternative tenders alongside M-Pesa. For most retailers, M-Pesa volume far exceeds the secondary providers; the secondary tenders matter for the customer-convenience use case (not refusing customers on those networks).

Settlement timing + reconciliation

M-Pesa till settlements typically:

  • T+1 standard — payments to your till today settle to your linked bank account next business day
  • T+0 / instant — available at higher merchant tiers or via Pochi La Biashara (an enhanced M-Pesa-merchant product)
  • Settlement amount — gross transaction net of M-Pesa merchant fees + applicable KRA VAT on the fees

Reconciliation:

  • Safaricom sends daily settlement report (via M-Pesa portal + SMS + email)
  • RetailPOS' reporting tools export the same period's M-Pesa tenders as CSV
  • Matching the two sources confirms every customer payment landed in your bank account net of fees
  • Mismatches (rare; provider-side reversal or retry-duplicate) surface in the manager dashboard for review

Month-end close: M-Pesa settlements appear in your bank statement as net deposits; M-Pesa portal supplies the gross- fee breakdown for accounting. Three-way match (POS sales register, M-Pesa portal, bank statement) is the standard control.

Refunds + dispute handling

M-Pesa refunds via B2C flow:

  • Cashier rings the refund in the POS; selects M-Pesa as the original tender
  • POS triggers B2C transaction via Daraja API to the original customer's phone number
  • Customer receives the refund in their M-Pesa wallet (or notification of refund being processed)
  • Settlement processes from your till; reconciliation tracks the refund in the daily report

Disputes are handled via Safaricom's merchant-dispute channel; maintain the per-transaction audit trail (eTIMS CUIN + RetailPOS receipt + M-Pesa transaction reference) for defensibility.

Integration with KRA eTIMS

For VAT-registered retailers, M-Pesa sales flow through eTIMS on the same path as cash or card sales — the tender type doesn't change eTIMS requirements. The CUIN + QR apply equally; the customer receives the CUIN-numbered receipt regardless of payment method.

RetailPOS' eTIMS connector handles all tender types uniformly; the integration is invisible to the cashier and to the customer (beyond the CUIN on the printed receipt).

Frequently asked

How long does Lipa Na M-Pesa merchant account approval take?
Typically 3-10 working days for the till number; additional 1-3 days for Daraja API credential provisioning. The till device (M-Pesa Bluetooth printer) ships with the account.
Does the POS need extra hardware for M-Pesa?
STK Push requires no additional hardware — the customer's phone is the input device. The standard M-Pesa Bluetooth till-device (provided by Safaricom on account opening) is useful for audio confirmation but not required if the POS handles confirmation natively. Static QR display on customer-facing iPad is sufficient.
When do M-Pesa payments settle to my bank?
T+1 next business day for standard tier; T+0 same-day available at higher merchant tiers or via Pochi La Biashara enhanced product. Net of M-Pesa merchant fees + KRA VAT on fees.
What happens if STK Push fails mid-checkout?
POS shows failure within 3-15 seconds; cashier offers retry, manual C2B fallback (customer types the till number), or alternative tender (card, cash). Sale never marked paid without confirmation.
Do I need separate Airtel Money + Equitel setups?
Optional — many retailers operate M-Pesa-only given 95%+ market share. For customer convenience (not refusing Airtel + Equitel customers), the secondary integrations are useful but not essential. RetailPOS supports both as alternative tenders.
How do M-Pesa refunds work?
RetailPOS' refund flow triggers B2C via Daraja API to the original customer's phone number. Customer receives refund in M-Pesa wallet; reconciliation tracks in daily report. Disputes via Safaricom merchant-dispute channel with audit trail support.
Want the product side? See the retail pack →

Open your shop in 30 seconds.

No card. Free until your first 100 sales. Bring your own Stripe; keep your hardware.