🎓 CoursesMarkets & internationalIntermediate⏱ 60 min
🇰🇪
Collecting payments in Kenya and East Africa. 7 chapters and a final quiz.
An East African payment collection project, from picking the rail to repatriating the funds. You will choose between a paybill, a till, and Pochi la Biashara based on the reconciliation key you need, wire up Daraja from the OAuth token to the merchant statement, treat a callback as a signal rather than proof, sweep the balance to the bank over PesaLink, work out the all-in cost including excise duty, and pick the central bank license that actually covers what you plan to do.
Scope a collection setup by who owns the rail and which regulator has jurisdiction, country by country
Choose between a paybill, a till, and Pochi la Biashara based on the reconciliation key you need
Wire up an M-Pesa collection on Daraja, interpret its result codes, and reconcile without relying on the callback
Sweep the merchant balance to a bank account over the rail that fits the amount and timing
Chapter 1. Choosing the rail before the provider.
An East African collection project starts with a question of ownership. Who owns the rail your customers already use varies by country: a listed company in Kenya, the central bank in Tanzania, two telecom operators in Uganda. The answer sets your cost, your time to access, and your negotiating room. Answer it before you choose a provider, never after.
Kenya
Tanzania
Uganda
Currency and authority
Kenyan shilling (KES), Central Bank of Kenya
Tanzanian shilling (TZS), Bank of Tanzania
Ugandan shilling (UGX), Bank of Uganda
Governing law
National Payment System Act, 2011 and NPS Regulations, 2014
National Payment Systems Act, 2015, Electronic Money Regulations, 2015
National Payment Systems Act, 2020 and NPS Regulations, 2021
Everyday rail
M-Pesa (Safaricom plc), about 89% of domestic mobile money
TIPS, run by the central bank, membership mandatory for providers
MTN MoMo and Airtel Money, a duopoly
Interbank instant payments
PesaLink (IPSL, 2017); a public Kenya Fast Payment System announced on October 18, 2024
TIPS (2022), with TANQR as the merchant QR standard
No mandated public retail switch
Final settlement
KEPSS, the CBK's RTGS system, live since July 29, 2005
TISS; the payee's bank credits funds within two hours (Bank of Tanzania)
UNISS (2005), 27 participants (Bank of Uganda, 2025)
Retail clearing
NACH: checks and EFT, capped at KES 1 million per check since October 2009
TACH, with net positions settled in TISS
ACH in five currencies: UGX, USD, EUR, GBP, KES
Market-specific levy
15% excise duty on the transfer fee (Finance Act, 2023)
Levy of TZS 10 to 4,000 per e-money transfer (2022 regulations)
0.5% excise duty on mobile money withdrawals (Excise Duty (Amendment) Act, 2018)
Moving funds out
No exchange controls; documentation above US$10,000
Prices and domestic payments must be in TZS (Government Notice 198 of 2025)
Liberalized capital account
Three East African markets, seen from the collecting side
46.41B
M-Pesa transactions in the fiscal year ended March 31, 2026, up 25.1%. Volume is growing faster than value
Safaricom, FY26 annual results, May 2026
572 104
active mobile money agents in Kenya, across all networks
Central Bank of Kenya, mobile payments statistics, June 2026
651M
TIPS transactions in Tanzania, worth TZS 54,950 billion, versus 453 million and TZS 29,820 billion in 2024
Bank of Tanzania, National Payment Systems Annual Report 2025
> 80
institutions connected to PesaLink: banks, SACCOs (savings and credit cooperatives), and providers
IPSL / Kenya Bankers Association, 2025–2026
🔑
Two rail models, two access strategies
When a private operator owns the rail, as in Kenya and Uganda, you negotiate your cost. Pricing, limits, and service levels come out of a commercial contract, and your supplier may also be your competitor. When the central bank runs the switch, as in Tanzania, you get your cost through a license: tariffs are regulated, and your counterparties are already members. The first model leaves margin but demands negotiation. The second squeezes margin by design.
One scoping mistake shows up in nearly every regional project. No East African license works as a passport. An e-money issuer licensed by the Central Bank of Kenya has no right to operate in Dar es Salaam or Kampala. You apply country by country, under a separate law, to a separate authority. The only shared infrastructure is two large-value rails, EAPS and REPSS. So the country remains the unit of decision.
Store amounts in local currency. KES, TZS, and UGX are the only values that hold up with a local bank or regulator. A database that keeps only the euro equivalent leaves you unable to defend any claim.
The phone number is the account identifier. The MSISDN is the customer key, the authentication channel, and the attack vector. Treating it as ordinary contact data is an architecture mistake.
Test the USSD flow. The market still runs on basic feature phones with no mobile data. A checkout tested only on smartphones is only half tested.
Don't sign a long exclusivity deal on a domestic rail. Kenya has not yet settled the choice between PesaLink and a public rail. Build an abstraction layer between “collect” and “which rail to collect on.”
🎯 Quick question
A company licensed as an e-money issuer by the Central Bank of Kenya wants to launch in Tanzania. What does it need to do?
Chapter 2. Paybill, till, Pochi: choosing the reconciliation key.
M-Pesa offers three merchant products. A paybill is a biller number paired with an account reference the customer types in. A Buy Goodstill is a checkout number with no reference. Pochi la Biashara attaches business collections to the trader's personal number and keeps those funds separate from the personal balance. Don't choose between them on convenience. Choose on the data the rail will send back to you.
Decision tree: which product to open
Question 1
Does the payment need to carry an order reference?
Yes for an invoice, school fees, an insurance premium, or an online order paid outside the session. In that case, only a paybill carries a reference. No for a physical checkout where the customer is standing in front of you: a till is enough, and the sale itself identifies the payment.
➜
Question 2
Does the customer pay during a session you control?
If yes, your system supplies the reference on the customer's behalf through an STK Push call. Nobody types the reference by hand, and the main source of exceptions goes away. If no, the customer steps through a USSD menu and copies a reference: plan for fuzzy matching from day one.
➜
Question 3
Is the collecting entity a separate legal entity?
A paybill or a till requires company paperwork and opens a separate merchant account. Pochi la Biashara is designed for sole traders: light paperwork, with business funds kept apart from the personal balance on the same number. It is not an option for a company that must produce financial statements.
➜
Decision
Lock in the product before writing any code
Switching products after go-live breaks your reconciliation history. The keys change, statements no longer tie out, and tax audits end up spanning two sets of records. The cost of switching is an accounting cost, not a technical one.
Paybill
Till (Buy Goods)
Pochi la Biashara
Available reconciliation key
Account reference, plus the M-Pesa receipt number
Receipt number, amount, timestamp, payer's MSISDN
Same as till
Point of failure
The reference is typed on a phone keypad: truncated, garbled, or replaced with a first name
Two customers pay the same amount in the same minute
The number is also used for personal transactions: the accounting boundary depends on usage
Prevention
Short reference with no look-alike characters, plus fuzzy matching as a fallback
Collect through STK Push, so your system supplies the reference
Keep this product for volumes where exceptions can be handled by hand
Full business application, the heaviest of the three
Business application
The lightest option, designed for informal trade
What each product gives you, and what breaks
⚠️
A reference typed by a human is not a technical key
Strict matching on the account reference builds a queue of unmatched payments within the first week. Design the reference for the eye and the thumb: six to eight characters, no O or 0, no I or 1, no hyphen. Add a second path based on amount, MSISDN, and a time window, with human review, because the residual exception rate never reaches zero. You can manage it, but you can't eliminate it.
The shortcode is now a tax object, and that changes the design. The Kenya Revenue Authority has tightened the link between merchant collections and e-invoicing. Starting with fiscal year 2026, reported income and expenses must be backed by an invoice issued and transmitted through eTIMS/TIMS (Kenya Revenue Authority, public notice of June 8, 2026). A mobile collection with no matching invoice becomes a tax risk. So from your very first data model, include a field that links the M-Pesa receipt number to the corresponding invoice number.
🎯 Quick question
A Kenyan e-commerce platform collects through a paybill, with an order reference typed in by the customer. 6% of payments remain unmatched. Which fix addresses the root cause?
Chapter 3. Wiring up Daraja: from OAuth token to merchant statement.
Daraja is Safaricom's developer portal, and its pattern has been stable for years. You create an app to get a key/secret pair, exchange it for a token, then call the API that fits your use case. There are two environments, sandbox and production, with separate credentials. Four APIs cover a complete collection, including the outbound leg.
API
What it does
What you get back
/oauth/v1/generate?grant_type=client_credentials
Exchanges the key and secret for a bearer token, using Basic authentication
access_token and expires_in of 3599 seconds: cache the token instead of requesting a new one on every call
/mpesa/stkpush/v1/processrequest
Pushes a PIN prompt to the payer's phone (M-Pesa Express)
CheckoutRequestID and MerchantRequestID: request IDs, not payment IDs
/mpesa/stkpushquery/v1/query
Queries the status of a request by its CheckoutRequestID
The actual result code, even when no callback ever arrived
C2B, validation and confirmation URLs
Receives payments that customers initiate themselves to a paybill or till
A flow pushed by the rail: your system is notified and initiates nothing
B2C, outbound payment
Refunds, disburses, or pays out from the merchant account to a wallet
A flow with its own permissions, an initiator ID, and an encrypted security credential
Daraja APIs to wire up in the first release
Sequence of an STK Push collection
1. TOKEN GET /oauth/v1/generate?grant_type=client_credentials
Basic base64(consumer_key:consumer_secret)
-> access_token, expires_in 3599 [CACHE IT]
2. REQUEST POST /mpesa/stkpush/v1/processrequest
BusinessShortCode paybill or till shortcode
Password base64(shortcode + passkey + timestamp)
Timestamp YYYYMMDDhhmmss
Amount INTEGER, in KES - no decimals
PartyA / PhoneNumber MSISDN 2547XXXXXXXX
AccountReference YOUR reference, not the customer's
CallBackURL https://.../mpesa/callback
-> CheckoutRequestID [PERSIST IMMEDIATELY]
3. WAIT customer enters their PIN on their phone
no guaranteed timing, no guaranteed response
4. CALLBACK POST received on CallBackURL
Body.stkCallback.ResultCode
Body.stkCallback.CallbackMetadata.Item[]
Amount, MpesaReceiptNumber, TransactionDate, PhoneNumber
5. STATUS POST /mpesa/stkpushquery/v1/query [IF NO CALLBACK]
CheckoutRequestID -> actual state
6. STATEMENT merchant account reconciliation [FINAL TRUTH]
Code
Meaning
Merchant-side handling
0
Success
The MpesaReceiptNumber is available. It becomes your reconciliation key, not the CheckoutRequestID
1
Insufficient balance
Don't retry: offer a partial amount or another payment method, or wait for funds to land in the wallet
1032
Request canceled by user
A deliberate drop-off. Count it as cart abandonment, not a technical incident
1037
Timeout, phone unreachable
A network coverage issue. A second attempt is justified, after a pause
1019
Transaction expired: the customer took too long
Resend the request instead of failing the cart. Cut the number of screens before the push
1001
Subscriber locked, try again later
A request is already in progress on that line. Block double pushes in the product
2001
Wrong PIN
Resend the request. Don't reset anything: the PIN belongs to the customer and the network
17
Internal system error
Don't infer anything about the payment. Query the status, then check the statement
STK Push result codes, and what to do with them
⚠️
Three go-live pitfalls
The amount is an integer. Fractions of a shilling don't exist in the request, and rounding in the cart creates a permanent reconciliation gap. Sandbox and production have separate credentials, including the shortcode and passkey. A cutover that copies the secrets over fails on the first live transaction. The outbound B2C flow requires an initiator ID and an encrypted security credential, different from those used for collections. An integration that didn't wire up refunds on day one isn't finished.
One last architecture point concerns the channel. USSD menus remain the foundation of the East African market because they work on basic phones with no mobile data, which is what drove rural coverage. A USSD session is short and closes without warning, so the flow must let customers pick up where they left off. Track success rates separately for the app and for USSD, or the average will hide the problem.
🎯 Quick question
Your server receives a callback with a ResultCode of 1037. Which interpretation is correct?
Chapter 4. A callback is not proof: designing reconciliation.
A callback is a signal. It can go missing, arrive twice, or show up after the customer has reloaded the page, because it travels over a network you don't control to a URL you expose publicly. There are three sources of truth, and they don't carry equal weight. The callback informs, the status query decides, and the merchant account statement is authoritative. Sound reconciliation uses all three, in that order.
State machine for an M-Pesa collection
INITIATED
The request is persisted before the call
The `CheckoutRequestID` is stored before the response even comes back. A pushed request whose ID you've lost is a payment you will never be able to attribute.
➜
PENDING
The prompt appears on the customer's handset
No timing is guaranteed. Set your own timer, shorter than the rail's, and never cancel the order on that basis alone.
➜
NOTIFIED
A callback arrives with a result code
The state is now likely, not certain. A duplicate callback on the same request doesn't create a second payment: deduplication runs on the M-Pesa receipt number.
➜
CONFIRMED
The status query returns the same result
This is the state you fulfill on. Run the query every time your timer expires, without waiting for the callback to go missing.
➜
RECONCILED
The line appears on the merchant account statement
The accounting truth. Any gap between the application state and the statement is an incident to investigate, even if the customer has been served.
Reconciliation rules for an M-Pesa collection
RECONCILIATION KEY
good MpesaReceiptNumber -> unique, holds up as evidence, on the statement
useful CheckoutRequestID -> links the request to the payment
weak AccountReference -> typed by a human on a paybill
never amount + timestamp + name -> can't tell payments apart
IDEMPOTENCY
uniqueness key = MpesaReceiptNumber
callback received twice -> a single accounting entry
request resent -> one active CheckoutRequestID per order
CASES TO HANDLE BEFORE GO-LIVE, NOT AFTER THE FIRST INCIDENT
callback never received -> status query at T+90s, then the statement
late callback -> order already fulfilled, don't charge twice
customer pays twice -> detect, then refund through B2C
payment with no order -> exception queue, never a silent reject
amount differs from amount due -> underpayment or overpayment, two separate processes
🔑
Duplicates come from the customer, not the rail
When no confirmation shows up on screen, the customer pays again. That's normal behavior on a channel where the confirmation screen depends on the network. The rail won't catch the duplicate for you, and it won't reject it: two valid payments were made. It's up to you to spot them by order and MSISDN, then refund through an outbound payment. A refund is not the mirror image of a collection. It has its own permissions, its own limits, and its own timing.
Case
Signal
Processing
Orphan payment
Funds received, no matching order
Hold the funds, send an alert, try fuzzy matching. Never reject silently: the money is already in your account
Unreadable reference
Paybill credited, reference truncated or made up
Match on MSISDN and time window, with human review
Underpayment
Amount received below amount due
Don't fulfill. Request the balance, or refund. A partial payment left pending turns into money owed to the customer
Overpayment
Amount received above amount due
Refund the difference through B2C, traceable on the statement. Keeping it as store credit requires a contractual basis
Late callback
Confirmation received after the order was canceled in the app
Check the statement before doing anything. An order that was canceled but paid calls for a refund; it isn't a rail error
Exception queue: five cases, five treatments
One last category of failure escapes technical monitoring entirely, because customers sometimes have to deposit cash before they can pay you. They go to an agent, who may be out of notes or e-float. The payment fails for reasons of place and time, not software. These failures cluster at month-end, on market days, and in rural areas in the evening. No automatic retry will fix them. If your success rates swing in cycles you can't explain, look at cash.
🎯 Quick question
Which field should you use to deduplicate an M-Pesa collection whose callback arrived twice?
Chapter 5. Moving money out of the wallet: PesaLink, KEPSS, agents.
When you collect into a wallet, your cash stays in a wallet. Moving it to a bank account is a separate operation, with its own rail, limit, and timing. Kenya offers three routes, and the amount decides. Below 1 million shillings, the interbank instant payment rail is enough; above that, settlement moves to central bank money. Cash withdrawal remains a third route, and the most expensive one.
Rail
Operator
Limits and availability
Use case
PesaLink
Integrated Payment Services Limited (IPSL), a subsidiary of the Kenya Bankers Association
From KES 10 to KES 999,999 per transfer, 24/7 (IPSL, PesaLink FAQ, accessed in 2026). Each bank also sets its own limits
Real-time gross settlement in central bank money, during system operating hours
Large amounts, final settlement, access to the regional EAPS and REPSS rails
NACH
Central Bank of Kenya, with the Kenya Bankers Association
Net settlement; capped at KES 1 million per check since October 2009; cycle cut from T+3 to T+1 in 2013
Checks and bulk electronic transfers
Cash-out at an agent
Agent networks of operators and banks
572,104 active agents in Kenya, 212.45M deposit and withdrawal transactions in June 2026 (Central Bank of Kenya, June 2026)
Cash. The customer pays a fee, and agents can run out of liquidity
Moving funds out in Kenya: three rails, three uses
PesaLink is the banks' response to M-Pesa, launched in 2017, 10 years after it. More than 80 institutions are connected, counting banks, SACCOs, and providers (IPSL/KBA, 2025–2026). Its volumes grew 78% in 2023 over 2022, according to the Kenya Bankers Association annual report. No 2025 figure could be verified, and that gap tells you something in itself: Kenya's interbank rail discloses far less than the operator it is taking on.
2017
PesaLink goes live
IPSL, a subsidiary of the Kenya Bankers Association, launches the interbank instant payment rail, the banks' response to M-Pesa 10 years after its launch.
2018
Wallet interoperability
Transfers between competing mobile networks become direct (Central Bank of Kenya, October 18, 2024). For this opening to have any effect, the CBK will then need to align on-net and off-net pricing.
October 18, 2024
The CBK announces its Fast Payment System
The central bank and the industry set up a joint working group, with the stated goal of an open, centrally switched infrastructure.
February 2026
PesaLink connects to PAPSS
African cross-border payments in local currencies open up to Kenyan interbank players. PAPSS reports 28 countries and more than 190 institutions in July 2026, without publishing any value figures.
⚠️
Kenya hasn't made its choice, and it affects you
The banks and Safaricom are pushing for PesaLink to become the national Fast Payment System. The CBK has announced plans to build its own. Both options have coexisted on paper since 2024. Any architecture you decide on today must assume that a public rail is coming, and that it will reshuffle pricing, membership obligations, and access rules. Two practical consequences follow: no long exclusivity deal on a domestic rail, and an abstraction layer in your code between the intent to pay and the rail that executes it.
For regional cross-border payments, three rails coexist and serve different needs. EAPS links the RTGS systems of Kenya, Rwanda, Tanzania, and Uganda in local currencies, from 8:30 a.m. to 4:00 p.m. EAT, Monday through Friday. REPSS, the COMESA rail live since October 2012, settles in dollars and euros, and eight countries are actually connected (Central Bank of Kenya, 2026). PAPSS pursues the same goal across the whole continent. Kenyan access to EAPS and REPSS goes through KEPSS, and therefore through your bank.
🎯 Quick question
A Kenyan company must pay KES 2.4 million to a supplier's bank account on the same day. Which rail should it use?
Chapter 6. Calculating the all-in cost, and who sets it.
Kenyan mobile money pricing is not set freely. On December 17, 2020, the CBK published its Pricing Principles, the framework for setting those prices. Safaricom's and the banks' fee schedules follow it and require the regulator's approval. So the posted price has been negotiated with the central bank. That doesn't make it predictable. It changes, and it carries levies that don't appear on the fee schedule.
Market
Direct debit
Basis
Legal basis
Kenya
15% excise duty
The fee, not the amount transferred
Finance Act, 2023, which raised the rate from 12% to 15% for transfers through mobile operators
Uganda
0.5% excise duty
The amount withdrawn from mobile money
Excise Duty (Amendment) Act, 2018. The original 1% levy on all transactions was cut to 0.5% on withdrawals only
Tanzania
Levy of TZS 10 to 4,000 per transfer
The amount transferred, by tier
National Payment Systems (Electronic Money Transaction Levy) Regulations, 2022
Kenya
Mandatory e-invoicing
Reported income and expenses
Kenya Revenue Authority, public notice of June 8, 2026. Starting with fiscal year 2026, an eTIMS/TIMS invoice is required as support
Levies to add to the fee, market by market
How to calculate the cost of collecting payments in Kenya
ALL-IN COST = collection fee
+ 15% excise duty ON THAT FEE
+ cost of sweeping funds to the bank
+ cost of the exception queue
SAMPLE STRUCTURE - excise duty only
collection fee charged to the merchant KES 100.00
15% excise duty on the fee (Finance Act 2023) KES 15.00
----------------------------------------------------------
merchant's actual cost KES 115.00
A model built on the pre-duty fee schedule is off by 15%
from the first line. The gap widens on high-frequency,
low-value flows.
WHAT THE FEE SCHEDULE DOESN'T TELL YOU
- the CONSUMER price is not the MERCHANT price
- cash withdrawals are paid by the CUSTOMER, and they weigh
on your conversion without showing up in your costs
- the exception queue is a staffing cost, not a rail cost
⚠️
Free for customers doesn't mean free for merchants
Safaricom reports 17.1 billion free “Kadogo” micro-transactions, or 58% of its activity in the fiscal year ended March 31, 2026 (Safaricom FY26, May 2026). Most of the volume no longer generates per-transaction revenue, so the network's economics are shifting onto merchant acceptance. Don't carry the generosity on display for consumers over into your cost model. These are two separate fee schedules, driven by opposite logic.
The 2020–2023 episode offers a negotiating benchmark. On March 16, 2020, the CBK waived fees between mobile wallets and bank accounts, then reinstated them on January 1, 2023, at levels well below pre-crisis pricing. The announced cuts reach 61% on bank-to-wallet transfers and 50% on collection paybills (CBK, December 6, 2022). Pre-2020 pricing is no longer a defensible benchmark.
🎯 Quick question
A Kenyan provider charges a KES 200 fee on a collection. What does the merchant actually pay, including excise duty?
Chapter 7. Central bank licenses, foreign exchange, and repatriation.
There are three ways in, and they differ in both time and cost. Signing up with a local acquiring provider as a sub-merchant gets you live in weeks, with no license in your own name. Getting your own license takes months. Holding customer funds puts you in a different legal category. The due diligence question is the same in all three cases: who has the right to hold your balance, and in what legal capacity.
Category
Application fee
License fee
Required core capital
Electronic retail payment service provider
KES 5,000
KES 100,000
KES 5,000,000
E-money issuer
KES 5,000
KES 1,000,000
KES 20,000,000
Designated payment instrument issuer
–
KES 5,000,000
KES 50,000,000
Small e-money issuer
KES 5,000
KES 100,000
KES 1,000,000
Kenya: license categories and capital, National Payment System Regulations, 2014 (Legal Notice 109), First Schedule
Customer funds go into a trust, never onto the balance sheet. Regulation 25(3) requires you to set up a trust, keep the fund balance at least equal to what is owed to customers, never transfer those funds to the operating account, and never commingle them with third-party funds.
Diversification has hard numbers. Under the Fourth Schedule, below KES 100 million, the funds are placed with one highly rated bank. Above that, each bank's share is capped at 25%, across at least two highly rated banks.
The trust's investment income doesn't go to you. Under Regulation 25(5), it must be used in line with trust law, in consultation with the central bank, or donated to a public-interest charity. A business plan built on float income therefore doesn't work in Kenya.
E-money limits are set by regulation, not by commercial terms. Regulation 43 sets KES 70,000 per transaction and KES 1,000,000 in monthly top-ups, and the central bank can approve higher limits for certain categories of issuers. The limits published by the major operators rely on that exemption.
The light-touch regime caps activity. A small e-money issuer must be a company registered in Kenya, cannot exceed KES 20,000 per transaction, and can never hold more than KES 100 million in outstanding e-money liabilities.
⚠️
In Tanzania, e-money licenses are no longer open to all
In a circular dated December 18, 2020, the Bank of Tanzania restricted new e-money licenses to licensed mobile network operators. The restriction doesn't apply to banks or to non-telecom entities that already hold a license. For a new non-bank entrant, issuing in its own name is therefore off the table. The project has to go through a partnership with an existing issuer or through a bank. A non-bank that does obtain a license must set up a trust as a separate legal entity under the Payment Systems (Electronic Money) Regulations, 2015.
Uganda structures its licenses differently. The National Payment Systems Act, 2020 gives the Bank of Uganda the power to grant, amend, and revoke them. There are three license types: payment system operator, payment service provider, and payment instrument issuer. One structural constraint comes before any setup. A provider that was not incorporated to issue e-money must create a separate legal subsidiary for that business, unless it is a financial institution or a deposit-taking microfinance institution.
Market
Regime
What this means in practice
Kenya
Exchange controls abolished in 1993, market exchange rate
Buying and selling are unrestricted up to the equivalent of US$10,000 through an authorized dealer. Above that, documentation of the transaction's purpose is required. An outbound investment by a resident above US$500,000 requires CBK approval through a facilitating bank (International Trade Administration, Kenya guide, July 5, 2024)
Tanzania
Requirement to transact in Tanzanian shillings
Government Notice 198 of 2025, in force since March 28, 2025, prohibits quoting prices, invoicing, or demanding payment in foreign currency for a domestic transaction. Existing contracts had to be amended within 12 months, meaning by March 27, 2026
Uganda
Liberalized capital account
Moving funds out depends on the bank's due diligence and on your commercial documentation, not on prior exchange control approval
Moving funds out of the country: three foreign exchange regimes not to confuse
ℹ️
Two compliance checks that set your real go-live date
Kenya is on the FATF list of jurisdictions under increased monitoring, a status confirmed in the statement of February 13, 2026. Expect tougher questions from your correspondent banks and longer account-opening times. A second compliance step also weighs on the timeline. The Data Protection Act, 2019 requires registration with the Office of the Data Protection Commissioner. The threshold is KES 5 million in annual revenue or 10 employees (Data Protection (Registration of Data Controllers and Data Processors) Regulations, 2021). Mobile collection processes MSISDNs at scale, so registration is a precondition for operating, not just a compliance box.
One rule of method remains. Kenya is the African country with the most published literature, and the most outdated figures. Registered mobile money accounts exceeded 94.2 million in June 2026, and active agents 572,000 (Central Bank of Kenya, June 2026). These numbers shift from one quarter to the next, so date every figure you reuse and name its source. In this market, three-year-old data describes a different country.
🎯 Quick question
A non-bank fintech wants to issue its own e-money in Tanzania. Which statement is correct?