CSV import is the unglamorous workhorse of expense tracking. When a bank connection breaks, when you’re backfilling six months of history, or when you simply don’t want to hand over your banking credentials to an aggregator, a CSV file is how transactions get from your bank into your tracker. Done right, it takes ten minutes. Done carelessly, it produces duplicates, sign-flipped amounts, and reports you can’t trust.
This guide walks through the whole pipeline: exporting from your bank, mapping columns to what your tracker expects, cleaning the common problems, and verifying the import so your reports stay accurate.
Step 1: Export the CSV From Your Bank
Log in to your bank or card issuer’s website (the export option is often missing from mobile apps), open the account’s transaction history, and look for Download, Export, or a small file icon near the transaction list. Choose:
- Format: CSV (sometimes labeled “Excel/CSV” or “Comma delimited”). Avoid PDF and QIF unless your tracker specifically asks for them; OFX/QFX is fine if your tracker supports it, and often imports more cleanly than CSV.
- Date range: Pick precise dates rather than “last 90 days,” and write down the range you exported. Non-overlapping ranges are your first line of defense against duplicates. For example, export March 1–31 today, and next month export April 1–30 — never “last 60 days” twice.
Download one file per account. Mixing accounts in one file is a common source of miscategorized transfers.
Step 2: Understand What Your Tracker Expects
Every tracker wants roughly the same fields, but banks name and arrange columns differently. Before importing, open the CSV in a spreadsheet and identify which column maps to which field. This mapping table covers the patterns you’ll see most often:
| Tracker field | Common bank column names | Gotchas to check |
|---|---|---|
| Date | Date, Posted Date, Transaction Date | Use posted date consistently; watch MM/DD/YYYY vs DD/MM/YYYY vs YYYY-MM-DD |
| Payee / Description | Description, Merchant, Details, Memo | Often stuffed with card numbers and city codes — trackers clean this to varying degrees |
| Amount | Amount, Debit/Credit (two columns), Transaction Amount | Some banks use one signed column; others split debits and credits into two unsigned columns |
| Sign convention | — | Card exports often show purchases as positive; most trackers expect spending as negative |
| Category | Category (rarely present) | Bank categories rarely match your tracker’s — usually better to let the tracker re-categorize |
| Account | Not included | You typically choose the destination account in the tracker during import |
Most modern trackers — YNAB, Monarch Money, and most spreadsheet templates — show a column-mapping screen during import where you assign each CSV column to a field. If yours doesn’t, you’ll need to rearrange the CSV to match its documented template exactly, including the header row.
Step 3: Clean the File Before Importing
Five minutes in a spreadsheet prevents most import failures. Work through this checklist:
- Delete non-data rows. Banks love to prepend account summaries, balance lines, and disclaimers above the header row. Your file should start with one header row, then data.
- Fix the amount sign. If purchases show as positive numbers, and your tracker expects negatives for outflows, flip them (multiply the column by −1) or use the tracker’s debit/credit mapping if offered.
- Normalize dates. If the dates parse as text or the format is ambiguous (03/04/2026 — March 4 or April 3?), reformat the column to an unambiguous format like YYYY-MM-DD.
- Remove pending transactions. Some exports include pending items that will re-export later with different descriptions, creating near-duplicates. Import posted transactions only.
- Strip currency symbols and thousands separators. “$1,234.56” fails to parse in many importers; it should read 1234.56.
- Save as plain CSV. If you edited in Excel, use “CSV UTF-8” when saving — not XLSX, and not Excel’s legacy CSV variant, which can mangle special characters in merchant names.
Keep the original download untouched in a folder (for example, bank-exports/2026-03-checking.csv) so you can always redo a bad import from the source.
Step 4: Import and Map
In your tracker, choose the destination account first — importing checking transactions into a credit card account is a surprisingly easy mistake and a tedious one to undo. Then upload the file, and on the mapping screen:
- Assign Date, Payee, and Amount at minimum.
- If offered a date-format picker, set it explicitly rather than trusting auto-detection.
- Preview the first 10–20 rows before confirming. Check three things: dates look like real recent dates, spending shows as outflows, and merchant names are readable.
If the preview looks wrong, cancel and fix the file — don’t import and plan to clean up afterward. Bulk-deleting a bad import is messier than it sounds, especially in trackers that auto-match transfers.
Step 5: Verify Against the Source
An import isn’t done until it’s verified. Two quick checks catch nearly everything:
- Count check: The number of imported transactions should equal the data rows in your CSV. A mismatch means the importer skipped rows (often date-parse failures) or your tracker’s duplicate detection silently dropped some.
- Balance check: Compare the account balance in your tracker against your bank’s actual balance as of the last imported date. If they differ, the discrepancy amount is your clue — search for a transaction of exactly that amount (a missed row) or half of it appearing twice (a duplicate).
Then skim for duplicates around the boundary dates of your export range, since overlap with a previous import or a prior bank-sync is where they cluster. Most trackers flag suspected duplicates during import; review that list rather than accepting it blindly, because two identical coffee purchases on the same day are legitimately common.
Make It a Repeatable Routine
The whole pipeline gets faster once it’s a habit rather than a project:
- Import on a schedule — monthly is enough for most people, weekly if you review spending actively. Same day each month, same date ranges, one file per account.
- Keep a one-line log of what you imported and through what date. A note like “Checking: through 2026-03-31” removes all guesswork next time.
- Save your column mapping. Several trackers remember mappings per account; if yours doesn’t, keep a template CSV with the correct header order and paste new data into it.
- Categorize immediately after importing, while the merchants are fresh in your memory. A hundred uncategorized transactions is a chore; twenty-five is a coffee break.
Accurate reports come from this boring consistency, not from any particular app. If you’re staring at months of unimported history right now, don’t try to perfect it all at once — export the most recent full month, run it through the steps above, verify the balance, and then work backward one month at a time.