Privacy
Should you give an expense app access to your bank SMS?
Every expense tracker eventually asks the same question, and it always sounds reasonable: let us read your messages, and we’ll log your spending for you.
It is a genuinely good deal on the face of it. Manual entry is the reason most people abandon expense tracking in week three. Automation fixes that. The question is what you are handing over to get it — and the honest answer is: considerably more than transaction alerts.
What the permission actually grants
Here is the part that gets glossed over. On Android, READ_SMS and RECEIVE_SMS have no concept of a sender filter. There is no “only messages from HDFCBK” scope for an app to request. The permission is your inbox, entire:
- One-time passcodes for your bank, email, and everything else that texts you a code
- Medical appointment reminders and test results
- Delivery addresses and OTPs for every parcel
- Personal messages from people who assumed they were writing to you alone
When an app tells you it only reads bank messages, it is describing its own code, not a boundary the operating system is enforcing. That distinction matters more than it sounds. A self-imposed filter is a promise: it can be well implemented, poorly implemented, or quietly changed in an update you auto-installed. From the outside, all three look identical.
This is not a hypothetical concern, and Google agrees — which is why SMS and call-log access are now restricted permissions. An app has to declare the use, justify it against a short list of approved cases, and pass a review to ship it. Most expense trackers do not qualify, which is precisely why so many of them have quietly moved to notification access instead.
The OTP problem specifically
Of everything in your inbox, one-time passcodes deserve their own paragraph.
The entire security model of “we’ll text you a code” assumes the code stays on your device and in front of your eyes. An app with SMS read access sits inside that assumption. It sees the codes as they arrive — for your bank, your email, your investment account, anything.
A legitimate app is not going to do anything with them. But you are no longer relying on the OS to protect you; you are relying on the app’s integrity, its security practices, and every dependency it ships. For a free app whose business model you have not examined, that is a lot of trust in exchange for not typing in a coffee.
The four ways to automate, ranked
Automation is not one thing, and the options differ enormously in what they cost you.
| Method | What it can see | What it costs you |
|---|---|---|
| Statement import | Only the file you chose to hand over | Nothing. No permission at all |
| Transaction notifications | Notifications from apps you allowlist | Notification access — broad, but narrower than the inbox |
| SMS capture | Your entire inbox, filtered only by the app’s own code | The OTP problem, plus everything personal in there |
| Bank sync / account aggregation | Your full transaction history, continuously | Your data lives on their servers, permanently |
Statement import is the underrated one. You download a PDF, Excel or CSV statement from your bank — a thing you can already do, in about a minute — and hand that one file to the app. It contains exactly the transactions you meant to share and nothing else. A well-built importer parses it on your phone, categorises the rows, flags duplicates against what you already have, and lets you review everything before a single row is saved. Months of history arrive in one step, and you granted nothing.
The catch is that it is a deliberate action once a month rather than something that happens while you sleep. For a lot of people that is a fair price, and for some it is the whole objection.
Notification capture is the middle ground, and it is where much of the industry has landed. It reads the payment notifications your bank and UPI apps already post to your notification shade, rather than reaching into your inbox. Narrower — but not narrow. Notification access is still a powerful permission covering everything that notifies you, so grant it on purpose, to an app you have reason to trust, and check what else you have already granted it to.
Bank sync is a different conversation entirely: not a permission on your phone but a standing copy of your financial history on someone’s server. It is the most convenient option by a distance, and the one with the largest permanent footprint. If you genuinely will not track manually, it is the right choice — just make it knowingly.
Five questions to ask before you tap Allow
- Does it work without the permission? If the app is unusable until you grant SMS access, that tells you what it is actually for. A tracker should be fully functional with manual entry and import.
- Where does the parsing happen? On-device parsing means messages stay on your phone. If message text is uploaded “for better categorisation”, your inbox is now in a database you do not control, subject to a retention policy you did not read.
- Is it opt-in, or was it asked for during onboarding? An app that requests sensitive permissions during setup — before you have seen any value — is optimising for grant rate, not for your benefit. The right moment to ask is when you reach into the feature that needs it.
- What does the privacy policy say, specifically? Not the marketing page. Look for a named list of what is read, whether it is transmitted, and how long it is kept. Vagueness here is itself an answer.
- What is the business model? A free app with no ads, no subscription, and deep permission requests is being paid somehow. If you cannot identify how, assume the answer involves data.
What we do, briefly
Klera works fully offline and every feature runs with the network off, which you can verify yourself with the airplane-mode test. Our position on the SMS trade-off, and how our capture options are scoped, is set out in the offline vs cloud post — it has not changed.
The more useful thing to say here is the general one: statement import is the option almost nobody talks about, it asks for no permissions at all, and for most people it covers most of the gap. Klera imports PDF, Excel and CSV statements, parses them entirely on your phone, auto-categorises the rows, catches duplicates and lets you undo an entire import if it comes out wrong. If you have been putting off tracking because you did not want to hand over your inbox, start there.
The short version
Nobody should feel paranoid for hesitating over this. The permission is broad, the filtering is voluntary, and the thing being protected — your inbox, including every code that guards your other accounts — is worth more than the convenience.
If an app is well built, opt-in, on-device, and honest about what it reads, SMS capture is a defensible choice, and plenty of people make it knowingly. But it should be a choice you make at the end of a decision, not one you tap through during setup. And it is worth knowing that the boring alternative — a statement file, once a month — costs you almost nothing and asks for nothing at all.
Klera is a free, offline personal finance app for Android. Have a look, or read the privacy policy, which lists every network call the app makes and what each one sends.
Frequently asked questions
Is it safe to give an expense tracker SMS permission?
It depends entirely on the app, and you mostly cannot verify it. The permission itself is unavoidably broad — Android grants access to the whole inbox, not just bank alerts — so safety comes down to whether the app filters to known senders, parses on your device rather than uploading, and is honest about both. A well-built tracker with an on-device allowlist is a reasonable risk. A tracker that uploads message text is not, whatever the marketing says.
Can an app read only my bank messages?
Not at the operating-system level. Android's READ_SMS and RECEIVE_SMS permissions have no sender-based scoping, so any app with them can read everything in your inbox. When an app says it only reads bank messages, it is describing its own code — a self-imposed rule it could change in an update. That is meaningfully different from a limit the OS enforces.
Why does Google restrict SMS permissions?
Because the abuse was widespread. SMS access exposes one-time passcodes, which makes it a direct route to account takeover, and inboxes are rich in personal data that was being harvested for lending and scoring. Google now classifies SMS and call-log access as restricted permissions: an app has to justify the use against a short list of approved cases and pass review, and most expense trackers do not qualify.
How can I track expenses automatically without SMS access?
Import a bank statement. Downloading a PDF, Excel or CSV statement and importing it brings in months of transactions at once, with no permission at all — a good app parses it on your phone, categorises the rows and flags duplicates before saving. Transaction-notification capture is the other option: it reads payment notifications rather than your inbox, which is a narrower surface, though still one you should turn on deliberately.
How do I check what an app I already installed can read?
On Android, open Settings → Apps → the app → Permissions. Anything listed under Allowed is live right now. Revoke SMS if you are not actively relying on it — most trackers keep working without it. Also check Settings → Apps → Special app access → Notification access, which is granted separately and is easy to forget you approved.