Internal Budgeting Intelligence Tool
A budgeting and cashflow intelligence app that imports bank exports, cleans messy transaction data, uses pandas and LLM-assisted matching, and tracks categories, sources, recurring patterns, and internal transfers.
Budgeting was harder than it needed to be because the normal categorisation tools, matching rules, and bank descriptions were never quite good enough. The goal was to build an internal finance tool that understands messy real-world transactions, groups the things that belong together, and keeps internal transfers from polluting the actual spending picture.
Overview
This is an internal budgeting intelligence app. It imports bank exports, cleans them into a usable transaction stream, groups messy descriptions into real sources, tracks categories, finds recurring payments, and separates internal transfers from actual spending.
The core problem is that bank data looks simple until you try to budget from it.
The same merchant can show up under slightly different names. Card transactions include location fragments, terminal IDs, dates, references, and random-looking suffixes. Bank transfers can look like income or spending even when money just moved between owned accounts. Normal category rules are often too brittle, so you end up fixing the same kind of mistake again and again.
This tool exists to solve that problem properly.
How It Works
The app has a backend API, an analysis layer, notebooks for validation, and a Next.js dashboard for browsing the results.
The import pipeline turns raw bank exports into clean transactions. From there, the system builds a more useful model:
- accounts explain where a transaction came from
- transactions keep the raw money movement
- sources turn messy bank descriptions into real merchants, people, employers, landlords, or transfer counterparties
- categories explain what kind of spending it was
- analytics look for transfers, recurring bills, cashflow trends, spend spikes, and savings movement
The dashboard is not just rendering a CSV. It is showing a cleaned-up financial model that has enough structure to answer better questions.
Why Categorisation Needed A Better System
The thing that made this worth building was how bad normal categorisation can feel.
Simple keyword rules work until the bank changes the wording. Exact matches work until the same shop appears with a suburb, card suffix, payment terminal, or reference code. Fully automatic systems can be impressive, but they can also make confident mistakes that are annoying to unwind.
This app takes a more practical path. It uses pandas for analysis and validation, matching logic for repeatable patterns, and LLM-assisted tokenisation and categorisation where messy descriptions need a more human read. The goal is not to hide every decision. The goal is to group transactions that are obviously the same thing, flag the uncertain cases, and make the review loop faster.
That means multiple slightly different transactions can land under the same source or category without needing a perfect exact match.
Internal Transfer Tracking
Internal transfers are one of the easiest ways to ruin a budgeting view.
Move money from one bank account to another and a raw export may make it look like spending from one side and income on the other. If the system does not understand that relationship, cashflow gets noisy fast.
This tool treats internal transfers as their own thing. It can identify transfer-like movements between owned accounts, keep them visible for audit, and exclude them from spending views where they do not belong.
That is what makes the reports feel more honest. Rent, groceries, subscriptions, wages, savings, and transfers stop competing in the same bucket.
The Matching Problem
Source matching is the most important part of the workflow.
The app normalises noisy transaction descriptions, strips out low-value tokens, clusters similar rows, compares those clusters against known sources, and decides whether something is confident enough to apply or should go into review.
The review loop matters. A good internal tool should do the obvious work automatically and bring the uncertain work to a human. Once a source or category is approved, reusable rules can carry that decision forward.
Design Decisions
Keep Categories Explainable
Categories are not treated as magic labels. A transaction can be categorised through a source default, a reusable rule, or a direct transaction override.
That makes it much easier to understand why a transaction landed somewhere and fix it when needed.
Use Analysis Before Trusting The Dashboard
The app uses notebooks and pandas as a validation layer. Before trusting recurring patterns, category coverage, transfer matching, or high-spend days, the data can be inspected and tuned.
That is the difference between a pretty chart and a financial tool you can actually trust.
Let Automation Help Without Taking Over
The point is not to make budgeting fully automatic. It is to reduce the boring repeated cleanup that makes budgeting annoying.
The system can suggest, group, categorise, and remember. The final model still stays understandable and fixable.
What Makes It Cool
The cool part is that it turns ugly banking exports into a living model of money movement.
You can start with messy CSV files and end up with recurring subscriptions, source identities, category breakdowns, unmatched review queues, transaction detail pages, transfer-aware cashflow, and cleaner spending views.
It is not just “how much did I spend?” It is “what is this money pattern, why did the system group it this way, and what changed over time?”
That is where the app becomes more than a budget tracker. It becomes a small internal finance intelligence layer.
Current Shape
The system supports imports, account mapping, source review, categories, recurring detection, internal transfer matching, spending views, cashflow views, transaction overrides, and a dashboard.
The next direction is better category intelligence, better explanations for why something matched, and more review workflows that make budgeting feel less like data entry.