u/TXFireplug

Bank2Actual — free local converter for US bank statement exports (BofA, Chase, Citi, Amex CSV + Chase PDF) into clean Actual imports

Bank2Actual — free local converter for US bank statement exports (BofA, Chase, Citi, Amex CSV + Chase PDF) into clean Actual imports

US bank CSV exports don't go into Actual cleanly — Bank of America's are the worst: a summary preamble before the header, balance rows mixed into the transactions, and malformed quoting in the descriptions. So we built a small open-source converter: drop the bank's file on it, get a clean four-column Date, Payee, Notes, Amount CSV that maps straight into Actual's import dialog.

To be clear about scope: Chase, Citi, and Amex also offer QFX downloads that Actual imports natively, and if that works for you it's zero setup. This is for when it doesn't — banks whose only export is CSV (BofA), date ranges QFX won't cover, or the occasional QFX that imports with missing or unmatched transactions. It handles those banks' CSV quirks too when CSV is what you have: split debit/credit columns, Amex's flipped signs, Citi's pending rows dropped so they don't duplicate when they settle.

  • Runs entirely locally — a single HTML file you open in your browser (one download, everything embedded), or a Python script. Nothing is uploaded anywhere.
  • Format auto-detected: BofA (checking/savings/credit), Chase (checking/credit), Citi credit, Amex.
  • It also reads Chase credit-card PDF statements — for accounts where Chase offers no CSV at all. Text is extracted locally, and it refuses to produce output unless every transaction reconciles against the statement's own Previous → New Balance.
  • Same reconciliation guard on BofA checking: output is cross-checked against the statement's "Total credits / Total debits."
  • --merge combines overlapping statements and dedupes, without eating legitimate same-day duplicate charges.

MIT licensed: https://github.com/Ildana-ai/bank2actual

Happy to add other banks' formats if you send an anonymized sample of the header rows.

u/TXFireplug — 7 days ago