To categorize a bank CSV without the cloud, download the file from your online banking, open it with software that runs on your own computer, and match each transaction's description against your own list of phrases mapped to categories. Nothing is uploaded, no bank login is shared, and you can see why each row got its category. Below is that process worked through on five real-format rows from an ANZ (New Zealand) export and a 64-phrase seed list across 14 categories.
What "without cloud" actually rules out
Most tools that auto-categorize transactions do it on someone else's server. Bank-linked apps pull your transactions through an aggregator. Upload-based tools ask for the file. Pasting a CSV into a chat assistant sends it to that provider. Even a Google Sheet lives on Google's servers.
Categorizing without the cloud means three things stay on your machine:
- The CSV file you downloaded from your bank.
- The category list you match against.
- The result, in a local file or database you back up yourself.
That leaves you three practical options: a desktop spreadsheet saved to a local folder, a small script, or a local app. All three work the same way underneath: a description goes in, the closest known phrase wins, and its category comes out.
The input: five rows from an ANZ export
This is the layout of an ANZ everyday account export, with placeholder names:
Type,Details,Particulars,Code,Reference,Amount,Date,ForeignCurrencyAmount,ConversionCharge
Payment,Test Person A,Dinner,,,68.50,15/09/2026,,
Direct Credit,Example Employer Ltd,Salary,,,2000.00,16/09/2026,,
Visa Purchase,COUNTDOWN ALBANY,,,,-35.20,17/09/2026,,
Automatic Payment,Example Power Co,Power,,,-120.00,18/09/2026,,
Direct Debit,Example Insurance,Premium,,,-45.00,19/09/2026,,
The text worth categorizing is split across two columns. Details is who the money went to or came from; Particulars is what it was for. Joined and lowercased, the five descriptions become:
test person a dinner
example employer ltd salary
countdown albany
example power co power
example insurance premium
For a full walkthrough of the columns, dates and sign conventions in this file, see Bank CSV expense tracker: 2 bank export layouts compared.
The category list: 14 categories, 64 seed phrases
A categorizer is only as good as the list it matches against. The one used here is the cold-start seed list from Expense Sorted Local: 64 short phrases, each mapped to one of 14 categories.
| Category | Seed phrases | Example phrases |
|---|
| Groceries | 6 | countdown supermarket groceries; pak n save supermarket groceries |
| Shopping | 6 | amazon retail shopping store; the warehouse shopping store |
| DinnerBars | 6 | mcdonalds restaurant dinner food; starbucks coffee restaurant food |
| Medical | 5 | pharmacy chemist medical prescription; gp medical centre visit clinic |
| Transport | 6 | bp petrol fuel transport fill; z energy petrol fuel transport |
| Utility | 5 | genesis energy electricity utility bill; mercury power electricity utility bill |
| Travel | 5 | air new zealand flight travel airline; booking hotel stay travel lodging |
| Kids | 4 | daycare childcare kids fees school; school stationery kids fees |
| Business | 4 | office supplies business software tools; linkedin premium business subscription |
| Living | 5 | netflix streaming living subscription; spotify music living subscription |
| Tax | 3 | ird income tax payment tax office; tax agent accounting fee tax office |
| Transfer | 2 | bank transfer own account transfer; internal account transfer between accounts |
| Income | 3 | salary payroll credit income wages; employer wage deposit income salary |
| Debt Repayment | 4 | mortgage home loan debt repayment; credit card debt repayment payment |
Two things to notice. The phrases are generic merchant and activity words, not anyone's real transactions, so the list contains no personal data. And each phrase carries extra context words ("supermarket", "utility bill", "income"), which gives a meaning-based matcher more to work with than a bare merchant name.
If you are building your own expense categories list, this is a reasonable starting shape: one category per real spending decision, plus Transfer and Income so that money moving in is never counted as spending.
Worked example: matching the five rows
Here is each description next to the closest seed phrase by wording, and what should happen to it.
| # | Description | Amount | Closest seed phrase | Category it points to | Right answer |
|---|
| 1 | test person a dinner | +68.50 | local pub dinner drinks restaurant | DinnerBars | Not spending. Money in from a person: a repayment, so Transfer or Income |
| 2 | example employer ltd salary | +2,000.00 | employer wage deposit income salary | Income | Income |
| 3 | countdown albany | -35.20 | countdown supermarket groceries | Groceries | Groceries |
| 4 | example power co power | -120.00 | mercury power electricity utility bill | Utility | Utility |
| 5 | example insurance premium | -45.00 | none close | (unclear) | Needs a human. No seed phrase mentions insurance |
Three of the five are easy. "Countdown" is a supermarket name in the seed list. "Employer" and "salary" both appear in an Income phrase. "Power" appears in a Utility phrase.
The other two are the rows that break categorizers, cloud or not.
Row 1: the word says dinner, the amount says money in
The description contains "dinner", so a matcher that reads only text will suggest DinnerBars. But the amount is +68.50: someone paid you back. Filing it as restaurant spending would add 68.50 to your eating-out total for a meal you have already paid for once. The fix is a rule that runs before matching: positive amounts on an account file are never spending categories. They go to Income, Transfer, or a review queue.
Row 5: nothing in the list resembles it
None of the 64 phrases mentions insurance, and none of the 14 categories is an obvious home for it. A matcher will still find a "closest" phrase, because there is always a closest phrase, but its similarity will be weak. A good categorizer flags a weak match for review instead of guessing. You then decide once: add an Insurance category, or file premiums under Living or Utility, and label this row. From then on, every row from Example Insurance has a match.
What the totals look like
Using the right answers above, the five rows come out as:
| Category | Total |
|---|
| Income | 2,000.00 |
| Transfer (repaid dinner) | 68.50 |
| Utility | 120.00 |
| Insurance (after your decision) | 45.00 |
| Groceries | 35.20 |
Spending is 35.20 + 120.00 + 45.00 = 200.20. Had row 1 been accepted as DinnerBars, the eating-out line would show 68.50 that you never spent this month.
Doing it offline in a desktop spreadsheet
You do not need an app to try this. In Excel or LibreOffice Calc, saved to a local folder:
- Import the CSV and add a column that joins Details and Particulars:
=LOWER(B2&" "&C2).
- On a second sheet, make a two-column table: a keyword in column A (
countdown, salary, power, insurance) and its category in column B. Name the ranges Keywords and Categories.
- Next to each transaction, use a lookup that finds the first keyword contained in the description, and falls back to "Review" when none is found:
=IF(F2>0, "Income/Transfer", IFERROR(LOOKUP(2^15, SEARCH(Keywords, J2), Categories), "Review"))
Here F2 is the Amount and J2 the joined description. The IF(F2>0, ...) part handles the row 1 problem before any keyword can match. Every "Review" row is a keyword missing from your table; add it once and the next month's file categorizes itself.
This is keyword matching, not meaning matching. "Mercury" will not match "power" unless you add it. For more formula patterns, see Auto categorize bank transactions in Excel: 6 methods.
Keyword rules vs meaning-based matching
| Keyword rules (spreadsheet) | Meaning-based matching (on-device model) |
|---|
| Where it runs | Your spreadsheet app | Your computer |
| Matches | Exact words you listed | Similar descriptions, even with different words |
| Setup | You write every keyword | Starts from a seed list, learns from your labels |
| Fails on | New merchants, spelling variants | Rows nothing in the list resembles (row 5) |
| Explains itself | Yes: the keyword that matched | Yes, if it shows the nearest phrase |
Both work without the cloud. Rules are fully transparent but need constant upkeep. Meaning-based matching covers spelling variants and new merchants better, but still needs a review step for rows like the insurance premium. For a longer comparison, see AI transaction categorization: AI vs formulas vs manual.
Where Expense Sorted Local fits
If you would rather not maintain a keyword table by hand, Expense Sorted makes Local, an app for this bank CSV workflow. The Local page lists its features and the pricing page lists plans. To try it, download Local.
If privacy is the reason you are avoiding the cloud, Private expense tracker: 5 tests for who sees your data and Offline expense tracker: what works without internet cover the rest of the checklist.
Limits
- A seed list is a starting point. 64 phrases cannot cover every merchant. Expect a review queue for the first few imports.
- Positive amounts need a rule. Repayments, refunds and transfers look like income to a text matcher.
- Merchant names vary by country. The seed phrases lean toward New Zealand merchants (Countdown, Pak n Save, Z Energy). Add your own local names.
- Local means you own the backups. Nothing is lost to a breach elsewhere, and nothing is recovered for you either.
FAQ
Can I categorize a bank CSV without uploading it anywhere?
Yes. Download the CSV from your online banking and categorize it with software that runs on your own computer: a desktop spreadsheet such as Excel or LibreOffice, a local script, or a local app. The file never has to leave your machine.
What categories should I use for bank transactions?
Start with a short fixed list. The seed list in this example uses 14: Groceries, Shopping, DinnerBars, Medical, Transport, Utility, Travel, Kids, Business, Living, Tax, Transfer, Income and Debt Repayment. Add a category only when a real transaction has nowhere sensible to go.
Why do some transactions get the wrong category?
Usually because the description says one thing and the amount says another. A friend repaying you for dinner contains the word dinner but is money coming in, not restaurant spending. Others fail because no phrase in your list resembles them, like an insurance premium when no category covers insurance.
Is Google Sheets a cloud tool?
Yes. Google Sheets stores your file on Google's servers. If the goal is to keep transactions off the cloud, use a desktop spreadsheet saved to a local folder, or a local app.
Related Articles