Advanced4 min read

Importing Transactions from a Bank CSV

If your bank lets you export transactions as a CSV, HOB can bring them in - mapped to your own accounts and categories, checked against what you've already entered, and reviewed by you one row at a time before anything is saved.

🖐️ Manual by Design

HOB doesn't connect to your bank and pull transactions in automatically. This importer is the one shortcut it offers instead: it saves you from typing every row in by hand, but nothing is auto-categorized. You still assign (or skip) a category on every single transaction before it's saved - the same active decision-making as adding a transaction manually, just starting from a spreadsheet instead of a blank form.

Getting to the Importer

From your Transactions page, click Import CSV. You'll land on the mapping step with an upload area waiting for a file.

Step 1: Upload Your CSV

Drag a .csv file onto the upload area, or click it to browse for one. Most banks let you export a CSV of recent transactions from their own site or app - check your bank's export or statements page if you're not sure where.

If the file has no rows in it at all, you'll see an error right away and nothing else on the page will activate - double check you exported the right file.

Step 2: Confirm the Raw Data

Once a file loads, HOB shows you the first few rows exactly as read from the file, with a checkbox for "First row is a header row." It's checked by default. Leave it checked if your bank's export starts with column titles like "Date, Description, Amount" - uncheck it if the very first row is already a real transaction, so it doesn't get skipped as if it were a header.

Step 3: Map Your Columns

This is where you tell HOB what each column in your file actually means. Every bank formats its exports differently, so nothing here is guessed for you automatically.

Date column and format

Pick the column with the transaction date, then pick the matching format: MM/DD/YYYY, DD/MM/YYYY, or YYYY-MM-DD. Parsing is tolerant of both / and - as separators and doesn't require zero-padding (1/2/2026 is fine), and a two-digit year is assumed to be 20XX.

Payee / Description column

Whichever column has the merchant name or transaction description. Required.

Notes column (optional)

If your bank exports a separate memo or notes field, map it here. Leave it as "None" if there isn't one.

Amount format

Choose whichever matches your file:

  • One column (+/-): a single amount column where negative (or accounting-style parentheses, like (45.00)) means an expense and positive means income. Dollar signs, commas, and extra whitespace are all handled automatically.
  • Separate Debit / Credit columns: map a "money out" column and/or a "money in" column. If the debit column has a value on a row, that row becomes an expense; otherwise, if the credit column has a value, it becomes income. You only need to map one of the two if your file only has one.

Import into account

Choose which HOB account these transactions belong to. This also determines which existing transactions get checked for duplicates in the next steps.

Step 4: Check the Preview

Once your mapping is filled in, HOB shows exactly how the first 8 rows will come in - date, type, amount, payee, and notes, mapped and formatted the way they'll actually be imported. Nothing is saved yet at this point.

Any previewed row that can't be parsed with your current settings shows up highlighted, with the raw text that didn't parse. This is your chance to catch a wrong date format or amount column before going further - but it's only checking the first 8 rows, not your whole file (see below).

What Happens to Rows HOB Can't Parse

When you click Continue with this mapping, HOB maps every row in the file, not just the previewed ones. Any row with a date or amount it genuinely can't parse is left out of the import - but it's never left out silently.

  • If a small number of rows fail to parse, you'll see a banner listing each one - its row number, and the raw date/amount text that didn't parse - once you reach the review screen.
  • If more than 20% of the file fails to parse, HOB stops and asks you to confirm before continuing: that's usually a sign the date format or amount column is set wrong, not that a handful of rows are individually bad. You can choose to import just the rows that did parse, or cancel and fix the mapping first.

A blank payee is not treated as an error - some banks leave the description blank on certain transactions (internal transfers, for example). Only a date or amount that can't be parsed at all causes a row to be skipped.

Duplicate Detection

Before you get to review the rows, HOB checks them against transactions you've already entered in the target account, so you don't end up with the same transaction twice.

  • A match requires the exact same amount and type (income or expense).
  • The date just has to be close, not exact - you choose how close, from Same day up to ± 7 days, since a purchase date and its card-network post date often differ by a day or two.
  • Rows flagged as possible duplicates are unchecked by default, so they won't be imported unless you opt back in.
  • You can change the matching window at any time on the review screen and every row's flag updates immediately - but if you've already manually checked or unchecked a row yourself, widening or narrowing the window won't override your choice.

Step 5: Categorize and Refine Each Row

This is the heart of the importer - every row that made it through mapping shows up in an editable table. Nothing is saved until you click Import at the bottom.

Payee

Edit the payee text if you want it to read differently than however your bank formatted it. As you type, HOB suggests matching payees - both from transactions already saved in this account and from other rows in the same import batch - and picking one auto-fills that row's category if you've used that payee (with the same income/expense type) before.

Category

Assign a category from the dropdown, leave it Uncategorized, or choose + Create New Category to add one on the spot with just a name - the same shortcut available when adding a transaction manually. Group, budget group, and business assignment can be filled in later from the Categories page.

Notes

Every imported row's notes are automatically prefixed with [Imported], so it's easy to spot which transactions came from a CSV later. It's a normal editable field - delete the tag on any row you don't want it on.

Import checkbox

Uncheck any row you don't want brought in at all - duplicates you don't want to re-import, rows you want to enter differently by hand, and so on. The count at the top of the table always reflects how many rows will actually be imported.

⇄ Marking a Row as a Transfer

Your bank's CSV only ever contains one side of a transfer - the money leaving or entering this account, with no way to know it was actually a move to or from another one of your accounts. Click mark as transfer on a row to fix that: choose the other account, and HOB synthesizes the matching entry on that side automatically. The payee on both legs becomes "Transfer to/from" the account name, exactly as if you'd created the transfer manually.

You can set a category on each leg independently (they're always opposite types, since a transfer always pairs one expense with one income), and undo the transfer at any point to go back to a normal categorized row - your original payee text is restored.

⊞ Splitting a Transaction

If one imported row actually covers spending across multiple categories - a big-box store run that was half groceries, half household - click split this. Break the amount into two or more category/amount parts; date, payee, and account stay the same across every part, only category and amount vary. HOB won't let you confirm the split until every part has a category and the amounts add up to the original total.

Type-flipping (see below) is turned off for split rows, and you can undo a split at any time to go back to one row.

Reclassifying Income vs. Expense

Every row is auto-detected as income or expense from your file's own amount sign (or its debit/credit column). If that's wrong for a particular row - the classic case is a deposit that's really a reimbursement or payback, not new income - use the Income/Expense toggle on that row to flip it.

Flipping a row clears its category (since the category list depends on type) and rechecks it for duplicates under the new type. A flipped row saves as a negative amount on its new type - the same convention used everywhere else in HOB, where a negative expense reduces that category's total rather than counting as new spending.

Step 6: Importing

Once you're happy with the rows, click Import. You'll get one final confirmation naming the target account and how many transactions are about to be saved.

⚠️ This Writes Directly to Your Real Data

Importing can't be undone in bulk - if something's wrong after the fact, you'd need to delete the rows one at a time from your Transactions page. Take the extra minute on the review screen before you click Import.

Leaving Before You're Done

Once you've uploaded a file, HOB warns you before letting you navigate away - closing the tab, refreshing, typing a new URL, using your browser's back/forward buttons, or clicking "Back to Transactions" all prompt a confirmation first. That protection stays active until you either finish the import or click "Import Another File" to start over. If you cancel that confirmation and later come back to the mapping step without changing anything, HOB restores your review screen exactly as you left it - categories, splits, transfers, and all - instead of making you redo it.

Tips for a Clean Import

  • Export a reasonable range at a time - a few months is easier to review carefully than several years at once.
  • Match your duplicate window to your bank - if you know your bank posts a day or two after the purchase date, widen it from "Same day" before reviewing.
  • Fix the mapping, not the file - if a lot of rows fail to parse, it's almost always the date format or amount column setting, not a bad export.
  • Use transfers and splits as you go - it's faster to mark them during review than to fix them after import.

Troubleshooting

Every date shows as unparseable:

You likely have the wrong date format selected - try the other options in the dropdown.

Every row comes in as the wrong type (income/expense flipped):

In single-column mode, check whether your bank exports expenses as positive numbers (some do) - you may need to flip rows individually, or re-check which column you mapped. In debit/credit mode, confirm you mapped "money out" to Debit and "money in" to Credit, not the reverse.

A category I need isn't in the dropdown:

Category dropdowns only show categories matching that row's current type - an expense row only shows expense categories. If you don't see the one you want, use "+ Create New Category," or check whether the row's type needs flipping first.

Too many (or too few) rows are flagged as duplicates:

Adjust the "Flag as duplicate if within" window on the review screen - it re-checks every row immediately without needing to re-upload.

A split won't confirm:

Every part needs both a category and an amount greater than zero, and the parts need to add up to exactly the original row's amount.

Next Steps

Still have questions? Contact support