Built to order

Offline Expense Tracker with Bank SMS Auto-Parsing (Android)

This project builds a native Android expense tracker that reads bank transaction SMS with permission and auto-logs each alert as an expense. A rule-based parser extracts the amount, merchant and date from the bank's wording, OTP messages are detected and discarded, and everything lands in an offline Room database with category charts. The demo parser extracted all three fields correctly from 15 of 15 sample SMS formats. Ships with source, APK, report, PPT and viva Q&A. Suitable for B.E./B.Tech final-year projects in Computer Science, IT and Electronics.

Android Kotlin · Android SDKGit version controlRoom database Coroutines FlowREAD_SMS BroadcastReceiverMPAndroidChart Canvas chartsMaterial 3 componentsSoftware
Offline Expense Tracker with Bank SMS Auto-Parsing (Android) — project thumbnail preview
More project photos (2)

The problem

The Offline Expense Tracker with Bank SMS Auto-Parsing is an Android app that converts the transaction alerts already sitting in a user's SMS inbox into a complete spending record, without manual entry and without bank account access. Students make dozens of small UPI and card payments every week, and the usual advice — record every expense in an app — collapses within days because opening an app after each payment is friction nobody sustains. Money leaks through food delivery, travel and purchases that are never recorded anywhere. This app removes the friction at its source: with the user's explicit permission, it reads incoming bank SMS through Android's READ_SMS permission, and a rule-based parser extracts the amount, merchant and date from each alert's wording, filing each expense into an offline Room database under the right category. No internet, no servers, no credentials. OTP messages are detected and discarded, credits are filed as income, and cash payments use a manual-entry form.

How it works

When a bank transaction SMS arrives, Android delivers it to the app's registered broadcast receiver — but only after the user has granted READ_SMS permission on first launch, with a screen explaining exactly why it is needed. The receiver hands the raw text to the rule-based parser, which works in a fixed sequence: first it pulls the amount from an Rs/INR pattern that tolerates comma-grouped Indian formats, then it tries merchant patterns in order — "at X on", "to X on/via/done", "towards X", "UPI/name" — because different banks order the amount and merchant differently, and finally it normalizes the date. Messages containing "OTP" are dropped before any logging, and alerts containing "credited" are filed as income. The record goes into a local Room database; the repository exposes it as a reactive stream, so the dashboard's monthly totals, category donut and merchant rankings refresh on every insert — fully offline.

  1. On first launch the app shows a permission rationale screen and requests READ_SMS; if denied, the app falls back to manual entry and the SMS features stay disabled.
  2. A broadcast receiver registered for incoming SMS forwards each new message's raw text to the parser service, still entirely on-device.
  3. The parser extracts the amount first (Rs/INR pattern, comma-grouped formats), then tries merchant patterns in sequence — amount-first and merchant-first orderings are both covered — then normalizes the date.
  4. Messages with OTP keywords are discarded before logging; alerts containing "credited" are typed as income; everything else becomes a debit expense.
  5. The merchant is matched against category rules (food-delivery senders → Food, UPI names → Transfers); unmatched merchants land in Other for the user to reassign.
  6. The structured record is inserted into the Room database; the repository's Flow stream recomputes monthly totals, category aggregates and merchant rankings reactively.
  7. The SMS inbox screen displays every alert with its extracted amount, merchant, date and verdict (auto-logged, filed as income, or skipped).
  8. Cash expenses are added through the validated manual form and flow through the same repository into the same dashboard.

Tech stack:

  • Kotlin · Android SDK (minSdk 26)
  • Room database · Coroutines + Flow
  • READ_SMS · BroadcastReceiver
  • Regex SMS parser · rule-based · no ML
  • MPAndroidChart · Canvas charts
  • Material 3 components
  • Git version control
Parameter Value
App size Approximately 12–18 MB debug APK (expected)
Minimum Android 8.0 (API 26), target API 34 (design targets)
Parser sample formats 15 fictional bank SMS formats (demo suite)
Parser extraction 15 of 15 formats: amount + merchant + date correct (measured in demo build)
Parser design target ≥93% correct field extraction on covered formats (design target)
Permissions READ_SMS, RECEIVE_SMS — runtime, user-granted (design)
Categories 8 default, user-editable (design)
Offline operation Fully functional without connectivity (design)
Network calls 0 — no servers, no analytics SDK (design)
Local storage Approximately tens of KB per 1,000 transactions (expected)
Manual entry fields Amount, merchant, category, date — validated (design)

Project features

The app is built around four capabilities that remove every excuse for not tracking money. First, SMS inbox auto-import: a broadcast receiver captures transaction alerts the moment they arrive, so expenses are logged before the user even opens the app. Second, a rule-based parser that genuinely reads bank wording — it extracted amount, merchant and date correctly from 15 of 15 sample SMS formats in the demo build, tells debits from credits, and refuses OTP messages. Third, a fully offline Room database with reactive queries, so the ledger, charts and category totals update live with zero network calls. Fourth, an editable category engine: merchant rules assign Food, Travel, Shopping and more automatically, and any category can be renamed or recoloured. Around these sit a manual-entry form for cash payments, an SMS inbox screen that shows each alert with its parsed fields, and on-device charts that keep the whole picture private.

  • [SMS inbox auto-import] A broadcast receiver on Android's SMS_RECEIVED action captures transaction alerts the moment they arrive and forwards the raw text to the parser — expenses are logged before the app is even opened.
  • [Rule-based SMS parser] A fixed pattern sequence extracts the amount (Rs/INR, comma-grouped Indian formats), then the merchant ("at X on", "to X on/via/done", "towards X", "UPI/name"), then the normalized date; measured 15 of 15 sample SMS formats parsed correctly in the demo build (design target ≥93%).
  • [OTP and promo filtering] Messages containing OTP keywords are dropped before any logging; promotional and balance-only messages never create ledger entries.
  • [Offline Room database] Transactions and categories live in a local Room database with entities, DAOs and reactive Flow queries; the app makes zero network calls.
  • [Editable category engine] Merchant rules map senders to categories (food delivery → Food, UPI names → Transfers); any category can be renamed, recoloured and reassigned by the user.
  • [On-device dashboard] Monthly totals, a category donut, merchant rankings and recent activity rendered natively — no server, no analytics SDK.
  • [Manual entry for cash] A validated form (amount, merchant, category, date) covers cash payments that never generate SMS; manual entries carry a distinct flag.
  • [Permission-first design] The app explains the SMS permission with a dedicated rationale screen and keeps working in manual mode if the user denies it; no bank credentials are ever requested.

What is included

  • Complete Kotlin source code as an Android Studio project
  • Debug APK for direct install and live demonstration
  • 15-format sample SMS suite with the parser self-test from the demo build
  • Architecture document with permission flow, parser pattern reference and data-flow diagrams
  • Project report PDF (background, parser design, Room schema, privacy rationale, testing)
  • PPT presentation for the final review
  • Viva Q&A preparation document (SMS permissions, broadcast receivers, regex parsing, Room, MVVM)

Limitations & prerequisites

  • READ_SMS is a sensitive Android permission: store distribution is restricted by policy and the app must declare its SMS use honestly; the permission flow is designed for sideloaded demo and academic builds.
  • The parser is rule-based, not learning: each new bank wording needs a new regex rule added and tested — coverage is stated per format, never as a universal claim.
  • There is no real bank linkage: the app sees only SMS text, so transactions older than the inbox, or alerts the user deleted, never appear.
  • OTP and promotional filtering is keyword-based; unusual promo wordings can slip through or, rarely, cause a genuine alert to be skipped — the inbox screen shows every verdict so misses are visible.
  • Dual-SIM phones are treated as one inbox: alerts from both SIMs are parsed identically with no per-SIM account mapping.
  • No machine learning is used anywhere; user corrections do not automatically create new parser rules (listed as future scope).

Timeline

  • Source development and parser tuning: approximately 3–4 weeks (expected) after order confirmation.
  • Demo dataset, report, PPT and viva kit preparation: approximately 1 week (expected), in parallel with final testing.
  • Total built-to-order lead time: approximately 4–5 weeks (expected); confirmed on quotation.

Support

  • Installation and demo-run guidance over call until the APK runs on the student's device.
  • Documentation and viva queries answered for 1 year from delivery.
  • Parser-rule additions for the student's own bank formats quoted separately as customization.
  • Customization requests (budget alerts, CSV export, new categories) quoted separately.

Frequently Asked Questions

How does the app read my bank SMS?

The app requests Android's READ_SMS permission once, with a screen explaining exactly why it is needed, and a broadcast receiver then forwards each incoming message's text to the on-device parser. Nothing is uploaded anywhere: the raw SMS never leaves the phone, and all parsing happens locally. If permission is denied, the app keeps working in manual-entry mode. No bank login or account linking is ever involved.

Which bank SMS formats can the parser handle?

Any format covered by its documented rule sequence: amount-first and merchant-first wordings such as "at X on", "to X on/via/done", "towards X" and "UPI/name", with Indian amount and date styles. In the demo build the parser extracted amount, merchant and date correctly from 15 of 15 sample formats. Each rule is documented separately, so new bank wordings can be added as testable patterns — the report includes the full pattern reference.

Does it need my bank login or internet access?

No to both — and that is the core privacy argument of the project. The app reads only the SMS text Android delivers to it; it never asks for credentials, never opens a banking session, and makes zero network calls. The Room database, the parser and all charts run entirely on the device, which is why the project can honestly claim no personal financial data ever leaves the phone.

What happens to OTP and promotional messages?

They are detected by keyword matching and dropped before any database write, so a one-time password can never be misfiled as a ₹4,999 expense. The app treats OTP handling as a safety rule, not a nice-to-have, and promotional or balance-only messages are skipped the same way. The SMS inbox screen labels every message with its verdict — auto-logged, filed as income, or skipped — so the filtering is fully visible during the demo.

Can this project be customized?

Yes — the report lists realistic extensions with effort notes, and each is quoted separately rather than promised in the base build. Practical options include budget limits with threshold alerts, CSV export of the ledger, additional bank SMS formats for the parser, and new categories with their own merchant rules. An optional encrypted backup and a spending-summary widget are also feasible; anything beyond the base feature list is scoped on quotation.

Is this project suitable for a final-year project?

Yes — for Computer Science, IT and Electronics programs. It demonstrates Android runtime permissions, broadcast receivers, rule-based text parsing with regex, Room database design with reactive queries, and MVVM architecture — plus a strong, genuine privacy-by-design argument for the viva. The working parser demo — 15 formats parsed live, OTP messages refused — gives the student something concrete to demonstrate instead of slides alone.

Components & software requirements
  • Kotlin · Android SDK (minSdk 26)
  • Room database · Coroutines + Flow
  • READ_SMS · BroadcastReceiver
  • Regex SMS parser · rule-based · no ML
  • MPAndroidChart · Canvas charts
  • Material 3 components
  • Git version control
Delivery information

Built-to-order project. Delivery timeline is shared after order confirmation based on current queue.

Support terms

Complete documentation, setup guide, and viva preparation included. Support for setup and explanation provided.

Download free synopsis (PDF)

Enter your name and WhatsApp number — the synopsis PDF downloads immediately. We may send occasional project updates on WhatsApp; no spam.

Get a quotation