← AI Bookkeeper

Bank statement to QuickBooks or Xero: categorize first, then import a journal

A bank-feed import leaves you with a pile of uncategorized lines to click through one at a time. Doing the categorizing first, in a file you can see, and importing finished two-sided entries puts the work before the import instead of after it.

Worked example: a four-line Chase statement

The tool ships a synthetic Chase checking export for March 2026 (fixtures/chase-checking.csv: a customer payment, a software subscription, a check, and a payment to a credit card). Importing it reads the format by itself, checks the statement's running balance against every row, and leaves four lines for review; the example files each line to an account (confirm), then exports.

Figures from running import, confirm, export qbo|xero|iif and report on that file. Synthetic data, not a real business.
Statement lineAmountFiled to
ACH CREDIT NORTHWIND LLC INV 10414,200.004000 Sales
ADOBE *CREATIVE CLD−59.996060 Software and subscriptions
CHECK 1007−850.006080 Rent
Payment to Chase card ending in 4417−300.002000 Credit card (a transfer, not an expense)
Net profit for March 20263,290.01

The Adobe line was suggested by a built-in keyword and the rest were filed by hand; the card payment is kept out of expenses, which is the mistake bank-feed categorizing most often makes. The checking balance ends at 7,990.01, the last balance printed on the statement.

The three files it writes

All three come from the same books, so they agree to the cent. The first rows of each are below (the opening balance entry is the statement's first balance).

Plain-text accounting files (export ledger, export beancount) come from the same command; the project checked those with the ledger-cli, hledger and Beancount programs themselves.

How to do it with your own statement

  1. Download the statement from your bank as CSV (also read: OFX/QFX, QIF, MT940, CAMT.053, BAI2, Excel, and PDFs with a text layer).
  2. Open AI Bookkeeper and import it. Review the lines it could not file; filing a line teaches it that payee, so the next statement needs fewer clicks.
  3. Match your chart. If the company file already exists, load its Account List (QuickBooks) or Chart of Accounts (Xero) first (switch chart FILE) so the exported names and codes already exist there.
  4. Export and import. Upload the journal in your system. Try a month first and compare its profit and loss with the report here.

Honest limits: the QuickBooks and Xero layouts follow their published import templates as the project understood them, but no real company file has been tried, and the Chase file here is hand-written. Import one small month before relying on it.

Questions

Can I import a bank statement CSV straight into QuickBooks Online?

QuickBooks Online imports bank lines into its bank feed, where you still categorize every line by hand. A journal import instead posts finished two-sided entries. AI Bookkeeper categorizes the lines first, then writes a journal file in QuickBooks Online's journal-entry import layout (JournalNo, JournalDate, AccountName, Debits, Credits, Description).

Does the tool connect to my bank or to QuickBooks?

No. It reads a file you download from your bank and writes a file you upload to QuickBooks Online, Xero or QuickBooks Desktop. Nothing is uploaded to us and there is no login.

Which accounting systems can it export to?

QuickBooks Online (journal CSV), Xero (manual journal CSV with account codes), QuickBooks Desktop (IIF, with an account list declared at the top), and plain-text ledger-cli, hledger and Beancount files.

Do the account names have to match my QuickBooks or Xero chart?

Yes, the account name (QuickBooks) or code (Xero) in the file must exist in the company file. The tool can read a QuickBooks Account List or a Xero Chart of Accounts CSV first, so its accounts use your names and codes.

Is it free?

Yes. It is open source (MIT) and runs in your browser or as a command line tool.

Open AI Bookkeeper and import your bank statement.