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.







