Mobile App Development for Personal Finance
Personal finance applications combine several technically non-trivial tasks: banking integration with non-standard APIs, working with multiple currencies and conversion, proper transaction categorization, all with strict data security requirements. Add iCloud/Google Drive sync — and you have a project that's far from "simple".
Banking Integration
The most complex and heterogeneous part. Three main approaches:
Open Banking / PSD2 (Europe). Standardized APIs: Nordigen (now GoCardless), Salt Edge, TrueLayer. Authorization through OAuth2 with redirect back to app via Deep Link (ASWebAuthenticationSession on iOS, Custom Tabs on Android). Transactions come in JSON with fields like creditorName, transactionAmount, bookingDate. Sounds simple — but each bank interprets the standard differently: some return amounts as strings, others as numbers; some duplicate pending transactions after confirmation.
Statement Import (CSV/OFX/MT940). Fallback for banks without APIs. MT940 parsing is a separate pain: the format is half-standardized, half-customized by each bank. For OFX we use ready-made libraries, for CSV — we write a configurable parser with column mapping.
Manual Entry. Always needed as a foundation. Quick entry with lock screen widget (iOS 16+ WidgetKit with intent), or shortcut in Dynamic Island.
Transaction Categorization
Proper auto-categorization through ML isn't just "wire up ChatGPT". What works well is on-device model: a trained classifier by creditorName and transactionAmount. On iOS — CoreML with custom model trained on labeled transactions. On Android — TensorFlow Lite. Key — fallback through rules-engine: if ML gives low confidence (< 0.7), we ask user to select category and update local classification history.
Multi-Currency
Store amounts in minor units (whole numbers), not float. 10.99 USD = 1099 cents. Otherwise you lose cents accumulating transactions due to float precision. Exchange rates are cached, updated via ExchangeRates API or Fixer.io. Conversion for reports — always by rate on transaction date, not current.
Security
Transaction data is encrypted in the database through SQLCipher (React Native / Flutter) or NSFileProtection.completeUnlessOpen (iOS). Biometric lock through LocalAuthentication / BiometricPrompt is mandatory. Banking API tokens stored in Keychain (iOS) / Android Keystore, never in UserDefaults or SharedPreferences.
Work Process
We start with audit: which banks to integrate, target countries (determines Open Banking provider), whether multi-currency is needed, monetization model. We design data schema, especially accounting model: double-entry or simplified. We develop, test on real bank accounts in sandbox mode, then on production with real transactions.
Timeline Guidelines
Manual accounting with categories, budgets and basic analytics — 5–8 weeks. Full product with Open Banking integration, ML categorization, multi-currency, widgets and export — 16–24 weeks. Pricing is calculated individually after requirements analysis.
| Scenario | Approximate Timeline |
|---|---|
| Manual accounting, single currency, basic reports | 5–8 weeks |
| + CSV/OFX import | +2–3 weeks |
| + Open Banking integration (1–2 banks) | +4–6 weeks |
| + ML categorization on-device | +2–4 weeks |
| + Widgets, shortcuts, sync | +3–5 weeks |







