A bank CSV expense tracker builds your spending record from the CSV file your bank lets you download, instead of logging in to your bank for you. You export the file, import it, and the tracker categorizes and totals the transactions. The hard part is not the import button. Every bank writes a different file, and a good tracker has to read the columns, the date format and the sign of each amount correctly.
Below are two export layouts side by side, an ANZ (New Zealand) everyday account and a Bank of America credit card, with the problems each one causes and a checklist you can use to test any tracker.
Why use bank CSV files at all
Most "automatic" expense apps connect to your bank through an aggregator. You hand over a login or an access token, and a third party keeps pulling your transactions. A CSV workflow skips that:
- No bank credentials leave your hands. You download the file yourself from online banking.
- You decide what gets imported. One account, one month, or a whole year.
- It works with almost any bank. Nearly every bank offers a CSV export, including small banks and credit unions that aggregators do not support.
The cost is a monthly two-minute download, and a tracker that can make sense of whatever file your bank produces.
Two bank CSV layouts, side by side
These are the column layouts of an ANZ account export and a Bank of America card export, shown with sample rows (the names and reference numbers are placeholders).
| ANZ (NZ) account export | Bank of America card export |
|---|
| Columns | 9 | 4 |
| Column names | Type, Details, Particulars, Code, Reference, Amount, Date, ForeignCurrencyAmount, ConversionCharge | Posted Date, Reference Number, Payee / Description, Amount |
| Date format | dd/mm/yyyy (15/09/2026) | mm/dd/yyyy (06/15/2025) |
| Transaction type column | Yes (Payment, Direct Credit, Visa Purchase, Automatic Payment, Direct Debit) | No |
| Spending | Negative (-35.20) | Negative (-123.45) |
| Money in | Positive (2000.00 salary) | Positive, but it is a card payment (500.00) |
| Merchant text | Clean-ish (COUNTDOWN ALBANY) | Raw processor strings (AMAZON.COM*Z12AB, WHOLEFDS PRV 10123) |
Same job, two very different files. Here is what each one looks like row by row.
The ANZ account file
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,,
Three things a tracker has to get right here:
- The amount is the sixth column, the date the seventh. A tracker that assumes "date first" will fail on this file.
- The description is split. Details holds the payee, Particulars holds what it was for ("Dinner", "Power", "Premium"). Joining them gives a far better description for categorizing.
- Two columns are usually empty. ForeignCurrencyAmount and ConversionCharge only fill in for overseas purchases, so the importer must accept blanks.
The Bank of America card file
Posted Date,Reference Number,Payee / Description,Amount
06/15/2025,1234567890,AMAZON.COM*Z12AB,-123.45
06/16/2025,1234567891,UBER *TRIP HELP.UBER.COM,-24.50
06/17/2025,1234567892,WHOLEFDS PRV 10123,-87.34
06/18/2025,1234567893,ONLINE PAYMENT - THANK YOU,500.00
06/19/2025,1234567894,NETFLIX.COM,-15.99
06/20/2025,1234567895,AUTOMATIC PAYMENT - THANK YOU,250.00
This file is shorter but trickier:
- There is no type column. The only clue that a row is a card payment is the text "PAYMENT - THANK YOU".
- Merchant names are processor strings. "WHOLEFDS PRV 10123" is a grocery store with a store number attached. Rules that match exact names will miss it; matching on a stable part ("WHOLEFDS") works.
- Dates are month first. 06/15/2025 can only be June 15, but 06/05/2025 could be read either way if the tracker guesses the format.
Worked example: what goes wrong without mapping
Take both files at face value, add up every positive row as "income" and every negative row as "spending", and you get:
| ANZ file | Bank of America file |
|---|
| Positive rows | 68.50 + 2,000.00 = 2,068.50 | 500.00 + 250.00 = 750.00 |
| Negative rows | 35.20 + 120.00 + 45.00 = 200.20 | 123.45 + 24.50 + 87.34 + 15.99 = 251.28 |
| Net | +1,868.30 | +498.72 |
The ANZ numbers are right: salary and a repaid dinner came in, three bills went out. The Bank of America numbers are wrong. The 750.00 is not income. Those two rows are payments from a checking account to the card, so counting them as income overstates what you earned, and if you also import the checking account, the same money shows up a second time as an outgoing payment.
The fix is to mark card payments as transfers, which leaves the card file at 251.28 of real spending and no income. That one rule decides whether your monthly totals mean anything.
What a good bank CSV expense tracker should do
Use this as a checklist when you try any tracker, spreadsheet or app:
| Check | Why it matters | Test with |
|---|
| Column mapping | Banks put date, description and amount in different places | The ANZ file (amount in column 6) |
| Explicit date format | dd/mm vs mm/dd silently swaps days and months | Any date where both parts are 12 or under |
| Sign convention per account | Card files and account files mean different things by "positive" | The Bank of America payment rows |
| Transfer detection | Card payments are not income or spending | "PAYMENT - THANK YOU" rows |
| Duplicate detection | Overlapping exports (e.g. two downloads covering the same week) double your totals | Import the same file twice |
| Dry run | You see the parsed rows before anything is saved | A new bank's first file |
| Description joining | Details + Particulars gives better categories than either alone | The ANZ "Example Power Co / Power" row |
| Partial-match rules | Processor strings change store numbers and suffixes | "WHOLEFDS PRV 10123" |
If a tracker fails the first three, it will produce numbers that look plausible and are wrong, which is worse than no numbers.
Spreadsheet or app?
A Google Sheet can do all of this. You import the CSV, fix the date column, flip or filter the signs, remove duplicates by hand and categorize with lookup formulas. Our bank CSV import guide for Google Sheets walks through it, and the Local expense tracker vs Google Sheets template comparison covers when the spreadsheet stops being worth the effort.
The spreadsheet route is free and flexible. It also means redoing the cleanup every month, for every bank.
Where Expense Sorted Local fits
If you would rather not redo that cleanup in a spreadsheet every month, Expense Sorted makes Local, an app for this bank CSV workflow. The Local page lists its import features, and the pricing page lists plans.
For why it matters where your transaction file lives, see Private expense tracker: 5 tests for who sees your data and Offline expense tracker: what works without internet. Ready to try it? Download Local.
Limits of a CSV workflow
- It is not real-time. You see transactions after you export them, usually once a week or once a month.
- Pending transactions are missing. Most exports only include posted transactions.
- Some banks change their format. When a bank renames or reorders columns, the mapping needs updating once.
- You own the backups. A local file is private, and it is also yours to back up.
FAQ
What is a bank CSV expense tracker?
It is an expense tracker that gets your transactions from the CSV file your bank lets you download, instead of connecting to your bank account. You export the file, import it, and the tracker categorizes and reports on it. You never share a bank login.
Why do bank CSV files look so different?
Each bank chooses its own columns, date format and sign convention. An ANZ account export has 9 columns and dd/mm/yyyy dates; a Bank of America card export has 4 columns and mm/dd/yyyy dates. A tracker has to map each layout to the same date, description and amount fields.
Are credit card payments income in a CSV import?
No. On a card export, a payment to the card shows as a positive amount, but it is money moving from your bank account, not income. A tracker should treat it as a transfer, or your income and spending will both be overstated.
Can I use Google Sheets as a bank CSV expense tracker?
Yes. You can import the CSV into a sheet and categorize with formulas. You will need to fix the date format, sign convention and duplicates yourself each month, which is where a dedicated importer saves time.
Related Articles