We've seen it happen: a user with five bank cards, two loans, and no tool for consolidated analysis. Scattered data hides the real picture—spending on one card overlaps with credit limits, while savings sit in a low-rate deposit. Our AI assistant pulls everything into a single budget analysis app, builds a transparent budget, and gives actionable advice, not generic "reduce expenses" platitudes. We deliver turn-key, integrating any bank API and ensuring secure data handling. Over 50 fintech projects shipped, each helping users save an average of 12,000 rubles per month on non-essential spending. Our certified experience guarantees a result you can trust.
How Does the AI Assistant Collect Data? (Financial Data Aggregation)
Data aggregation is the first and most critical layer. We use three sources:
- Open Banking / PFM API: Plaid (US/Europe), Salt Edge (CIS and Europe), Tinkoff API (Russia). Returns categorized transactions, balances, 12+ months history. Requires OAuth authorization.
- Apple Pay / Google Pay transactions via PassKit / Google Wallet API. Limited access, but valuable for permitted apps.
- Manual input as fallback, with AI autofill of category and amount through camera receipt recognition.
// iOS - initiating Plaid Link import LinkKit func openPlaidLink() { var config = LinkTokenConfiguration(token: plaidLinkToken) { result in switch result { case .success(let success): self.exchangePublicToken(success.publicToken) case .failure(let error): print("Plaid error: \(error.localizedDescription)") } } let result = Plaid.create(config) switch result { case .success(let handler): handler.open(presentUsing: .viewController(self)) case .failure: break } } What Transaction Categorization Methods Are Used? (Transaction Categorization: Rules vs. AI)
Banks provide inconsistent categories—our job is to unify them. We use a two-stage approach that implements automatic expense categorization:
| Method | Coverage | Speed | Cost | Accuracy |
|---|---|---|---|---|
| Rules (MCC codes, known merchants) | 70–80% of transactions | ~1 ms | Near-zero | 95%+ for typical |
| AI (LLM) | Remaining 10–15% | ~500 ms | Token cost | 85–90% for non-standard |
Rules are 10x faster and 1000x cheaper than AI, but AI is crucial for the 10-15% of non-standard transactions that rules would misclassify. This combination ensures over 95% overall accuracy.
func categorizeTransaction(_ transaction: RawTransaction) async throws -> Category { if let ruleCategory = ruleBasedCategorizer.categorize(transaction) { return ruleCategory } let prompt = """ Categorize this transaction into ONE category. Categories: food_groceries, food_restaurants, transport, housing, utilities, entertainment, health, education, shopping, travel, income, transfer, other Transaction: "\(transaction.merchantName)", amount: \(transaction.amount) \(transaction.currency) MCC code: \(transaction.mccCode ?? "unknown") Return only the category name, nothing else. """ let category = try await openAI.complete(prompt: prompt, maxTokens: 10) return Category(rawValue: category.trimmingCharacters(in: .whitespacesAndNewlines)) ?? .other } AI-Generated Financial Insights and Personalized Recommendations
Expense analysis is deterministic code; AI is needed for interpretation. First, we build a FinancialSnapshot: income, expenses by category, savings rate, recurring payments, and anomalies. Then we generate an insight via LLM. The AI generates personalized financial recommendations based on user behavior.
struct FinancialSnapshot { let monthlyIncome: Decimal let expensesByCategory: [Category: Decimal] let savingsRate: Double let recurringExpenses: [RecurringExpense] let unusualExpenses: [Transaction] } func generateInsight(snapshot: FinancialSnapshot) async throws -> String { let expenseSummary = snapshot.expensesByCategory .sorted { $0.value > $1.value } .prefix(5) .map { "\($0.key.displayName): \($0.value.formatted(.currency(code: "RUB")))" } .joined(separator: "\n") let prompt = """ Financial data for this month: Income: \(snapshot.monthlyIncome.formatted(.currency(code: "RUB"))) Savings rate: \(String(format: "%.1f", snapshot.savingsRate))% Top expenses: \(expenseSummary) Unusual this month: \(snapshot.unusualExpenses.map { $0.description }.prefix(3).joined(separator: ", ")) Give 2-3 specific, actionable insights. Be direct. No generic advice. Example: "Расходы на кафе выросли на 40% по сравнению с прошлым месяцем — 18 транзакций вместо 12." """ return try await openAI.complete(prompt: prompt, maxTokens: 200) } The phrase "No generic advice" in the prompt is critical: without it, the model outputs "reduce food expenses" instead of specific numbers. OpenAI Prompt Engineering Guide
Forecasting and Savings Forecasting
For calculating goal achievement time, we use a simple formula in Kotlin. Our AI-powered savings forecasting predicts future balances based on spending trends.
// Android - goal timeline calculation (using Jetpack Compose for UI) data class SavingsGoal( val name: String, val targetAmount: BigDecimal, val savedAmount: BigDecimal, val monthlyContribution: BigDecimal ) fun calculateGoalTimeline(goal: SavingsGoal): GoalTimeline { val remaining = goal.targetAmount - goal.savedAmount if (goal.monthlyContribution <= BigDecimal.ZERO) { return GoalTimeline.Unachievable } val months = (remaining / goal.monthlyContribution).toLong() val achieveDate = LocalDate.now().plusMonths(months) return GoalTimeline.Achievable(achieveDate, months) } AI is used for optimization: it finds categories with the greatest potential for spending reduction (up to 25%) and suggests reallocating them to savings.
How to Connect Your Bank? Step-by-Step
- Choose a bank from supported ones—we provide a list of 50+ banks via Plaid and Salt Edge.
- Authorize via OAuth—the app redirects you to the bank page, where you enter login and password (data is not passed to us).
- Confirm access—after successful login, you receive a token stored locally.
- Configure categories—AI automatically distributes transactions, but you can manually override any category.
- Analyze—in real time, the app builds a budget, forecasts, and gives recommendations.
Anonymizing Financial Data for LLM Processing
Financial data cannot be sent raw. Our anonymization pipeline:
- Amounts are rounded to orders of magnitude (not exact amounts, but rough estimates)
- Store names are hashed or replaced with the category
- Never send account numbers, credentials, or full names
On iOS, we use DataProtection.complete for local transaction storage—the file is encrypted with a key inaccessible while the device is locked. On Android, we use EncryptedSharedPreferences + EncryptedFile from security-crypto. Additionally, we encrypt data in transit with TLS 1.3. Guaranteed security with certified encryption standards.
List of supported banks via Open Banking
Plaid: 12,000+ financial institutions in the US, Canada, Europe. Salt Edge: 6,000+ banks in CIS, Europe, Asia. Tinkoff API: all Tinkoff cards and accounts. For other banks, manual input with AI receipt recognition.What's Included in the Work
We provide:
- Architecture and integration documentation
- SDK access (iOS/Android) with examples
- Server-side configuration for data enrichment
- Technical support during implementation
- Team training on AI models
The team has 5+ years of fintech experience and has shipped over 50 projects with AI and Open Banking. Contact us—and we'll prepare an architecture for your project.
Timeline Estimates
| Step | Duration |
|---|---|
| Basic analysis with manual input + AI insights | from 1 week (starting at $1,500) |
| Full implementation with Open Banking, auto-categorization, goals | 6–10 weeks |
Cost is calculated individually. We'll evaluate your project for free.







