Your M-Pesa and bank send you an SMS every time money moves. I read those messages on your phone so I can see your money the way you do — and so you don't have to keep track yourself. This page is exactly how that works, and how I make sure nothing leaves the phone.
Kenya runs on M-Pesa. M-Pesa runs on SMS. Every time you send money, pay a bill, buy airtime, or receive a payment — Safaricom sends you a confirmation text. The same is true for KCB, Equity, Stanbic, Co-op, NCBA, and the other banks: every transaction generates an SMS. Loan apps like Tala and Branch do too.
That SMS is the only consistent record an ordinary user can access of their own day-to-day money. Mini-statements at an ATM cost airtime. M-Pesa's USSD statement is short, expensive, and frustrating to read on a phone screen. Bank apps show the last few transactions but rarely the longer story. SMS is what we all already have.
For me to help you see your money — to spot the pattern, the unusual spend, the bill you forgot you set up two years ago — I need to read those SMS. There is no other source that covers your real activity across all the institutions you use.
I only read SMS from senders that look like financial institutions. The rest of your inbox is none of my business and I don't touch it.
Specifically:
Everything I read and everything I figure out from it stays on your phone, in an encrypted database. Not on our servers. Not on anyone else's servers. On your phone.
When an SMS arrives:
None of that goes anywhere. The on-device AI doesn't make a network call. There's no "we'll send a copy to our servers for backup" path. There's no "we'll aggregate this anonymously for research" path. The data stays where it started.
Our privacy policy goes into the cloud-side of the picture — things like the phone number you sign in with, optional emails, the chat thread when you ask me a question. Those are bounded and disclosed. The SMS data and the transactions extracted from it are not part of any cloud path. Ever.
Reading SMS is a sensitive permission and I didn't take the decision lightly. Three alternatives looked appealing on paper. Here's why each one doesn't work for the Kenyan reality:
| Alternative | The pitch | Why it fails for Nudgey in Kenya |
|---|---|---|
| Android Notification Listener API | "Read the bank notification when it pops up, not the SMS itself." | Many Kenyan banks send transaction SMS but not push notifications. Security-aware users disable notification previews for banking apps. Notification Listener also can't read history — only what arrives after the user grants permission, leaving the Onboarding Reveal experience empty. |
| Bank APIs / aggregators (Plaid-style) | "Connect your bank directly with OAuth — Plaid does this in the US." | Retail-customer banking APIs don't exist in Kenya the way they do in the EU (PSD2) or the US (Plaid/Teller/Tink). M-Pesa's consumer API is restricted to registered merchants. There is no equivalent of an aggregator that lets a consumer app see their own transactions through a sanctioned API. This is the central reason SMS is the only path. |
| Be the default SMS app | "Replace the user's messaging app and read everything through Android's default-handler privilege." | This is over-scope: a default SMS app sees ALL SMS, including personal messages I have no business reading. It also forces users to abandon their preferred messaging app — a hostile UX trade. The bank-SMS-only path through the standard SMS permission is the narrower, more privacy-preserving option. |
The SMS permission as I use it — with the institution allowlist, with the on-device processing, with the no-cross-boundary guarantee — is the least invasive route that actually works for Kenyan retail money.
"Trust us" isn't enough. The privacy posture above is not a marketing promise — it's enforced by the way the Nudgey app is built. Here's the technical evidence:
NoLocalOnlyToRemoteRepository classifies all SMS, transaction, conversation, and identity types as Local-only. Any attempt in the code to send a Local-only type to anywhere that could leave the device fails the build at compile time. Engineers can't ship a release that violates this even if they tried.anonymize() audit point guards every piece of data that does cross from the phone to our cloud (for things like the chat thread you opt into when you talk to me). It strips raw values — amounts, merchant names, dates — and replaces them with typed buckets (spentMoreOn: TRANSPORT, magnitude: SIGNIFICANT). Tests confirm no raw value can slip through.These aren't claims we make in marketing copy and don't back up. They are review-able mechanisms that anyone with security expertise (or Google's Play review team, or Kenya's Office of the Data Protection Commissioner) can verify on request.
Nudgey is owned and operated by Riverbank Solutions Ltd, a private limited company registered in Kenya since 2010 (Companies Registry no. CPR/2010/18968). Riverbank is registered with Kenya's Office of the Data Protection Commissioner as a Data Controller (Serial No. 07560), under the Kenya Data Protection Act, 2019.
Our registered office is in Hurlingham, Nairobi. We have responsibilities under Kenyan data-protection law to handle your personal data lawfully, transparently, and proportionately — and we welcome regulator scrutiny of how we do so.
If you have concerns about anything described on this page — anything that doesn't match the actual behaviour you observe, or anything that reads as inconsistent with our privacy policy — we want to hear about it before anyone else. Email privacy@thenudgey.com.