Free browser tool
CSV to Beancount converter
Paste a bank export and get balanced double-entry transactions, ready to drop into your ledger. Column mapping is detected for you and stays editable.
Everything runs in your browser. Your statement is never uploaded anywhere.
Saved mappings
Profiles live only in this browser. Your transactions never leave it.
No saved mappings yet. Paste a CSV, set the columns, then save the setup here to reuse it later.
Import profiles from a file
Choose a .json file exported from this converter. Nothing is saved or applied until you choose.
Beancount output
Already know your bank or app?
These exports are already mapped — pick yours and skip the setup.
Questions about this tool
Is my bank data uploaded anywhere?
No. The conversion runs entirely in your browser using JavaScript on this page — your CSV is never sent to beancount.io or anyone else, and nothing is stored. You can confirm it by opening your browser's network tab, or by disconnecting from the internet and converting anyway: it still works.
Which CSV formats does it understand?
Comma, semicolon, tab and pipe separated files, with or without a header row. It reads quoted fields containing commas or line breaks, US and European number formats (1,234.56 and 1.234,56), parenthesised and trailing-minus negatives, and dates written as ISO, day-first, month-first or 'Aug 9, 2026'. Both a single signed amount column and separate debit and credit columns work.
What are the two accounts for?
Double-entry means every transaction moves money between two accounts, so the two sides always cancel out. The first is the account the statement belongs to — your chequing account or credit card. The second is where the money went; leaving it as Expenses:Uncategorized is normal, and you categorise from there once the transactions are in your ledger.
How do I check the export against my statement balances?
Turn on statement reconciliation in the converter and enter the statement start/end dates plus the signed opening and closing balances for one currency. Credit-card balances you owe are usually negative. Only the rows you keep (after overlap review) count toward the movement; skipped or excluded rows do not. Complete mode can write an opening transaction; append mode never does. A match adds a closing balance assertion — then run bea check (or bean-check) on the download to confirm, and inspect any mismatch with bea balances / bean-report before treating the import as settled.
Can I split one bank row across several accounts?
Yes, one row at a time under Split a row across accounts. Worked example: a -100.00 USD card charge at a corner market, split 60.00 to Expenses:Groceries and 40.00 to Expenses:Household, becomes one transaction with three postings — Liabilities:CreditCard -100.00 USD, Expenses:Groceries 60.00 USD, Expenses:Household 40.00 USD. A +25.00 USD refund split 15.00 and 10.00 posts -15.00 USD and -10.00 USD instead: you always type positive amounts and the converter applies the opposite sign. The amounts must add up exactly to the row's amount, with no more decimals than the row has, in the row's own currency (no exchange rates), and no split line may use the statement account. Until a split balances, copy and download stay paused — fix it, remove it, or exclude the row, whose split is then ignored. Splits are temporary edits to this file: they are never saved in mapping profiles, and changing the file, column mapping, sign or source account clears them.
Can I stop doing this by hand every month?
Yes — that is what Beancount.io's Smart Import and Bank Sync are for. They connect to supported institutions, categorise transactions automatically and write them into a ledger you still own as plain text. This tool exists for one-off imports, for banks nobody supports, and for the healthy habit of checking what an importer actually produces.
Keep the ledger. Skip the copy-and-paste.
Beancount.io syncs your accounts, categorises the transactions and keeps every one of them in plain-text files you can download and keep forever.