Skip to main content
Tools

Free tool

OFX & QIF to Beancount

Your bank offers a download but no CSV. Paste the OFX, QFX or QIF file here and get balanced double-entry transactions back.

Runs entirely in your browser — your statement never leaves this page.

Beancount output

Paste your export or choose a file to see converted transactions here.

How QIF split transactions convert

Quicken, GnuCash and other personal-finance apps export a split transaction as one bank record followed by S (category), E (memo) and $ (amount) lines. The converter keeps every part: the bank posting stays exactly as the file wrote it, and each part becomes its own posting on the account you choose, with its memo attached.

QIF export (bank register)
!Type:Bank
D01/16/2026
T1850.00
PACME PAYROLL
MJanuary pay
L--Split--
SSalary
EGross pay
$2400.00
STaxes:Federal
EWithholding
$-450.00
S[Savings]
EAutomatic transfer
$-100.00
^
D01/18/2026
T-100.00
PCOSTCO
MWeekly shop
L--Split--
SGroceries
EProduce and bread
$-60.00
SHousehold
ECleaning supplies
$-40.00
^
D01/20/2026
T-25.00
PCITY PARKING
^
Accounts chosen in the split review
Salary
Income:Salary
Taxes:Federal
Expenses:Taxes:Federal
[Savings]
Assets:Savings
Groceries
Expenses:Groceries
Household
Expenses:Household
Beancount output (open directives omitted)
2026-01-16 * "ACME PAYROLL" "January pay"
  Assets:Bank:Checking    1850.00 USD
  Income:Salary           -2400.00 USD
    memo: "Gross pay"
  Expenses:Taxes:Federal  450.00 USD
    memo: "Withholding"
  Assets:Savings          100.00 USD
    memo: "Automatic transfer"

2026-01-18 * "COSTCO" "Weekly shop"
  Assets:Bank:Checking    -100.00 USD
  Expenses:Groceries      60.00 USD
    memo: "Produce and bread"
  Expenses:Household      40.00 USD
    memo: "Cleaning supplies"

2026-01-20 * "CITY PARKING"
  Assets:Bank:Checking    -25.00 USD
  Expenses:Uncategorized  25.00 USD

What converts

  • Bank and credit-card records whose split amounts add up exactly to the transaction total, including refunds and mixed signs such as gross pay minus withholding. Amounts keep the precision the file wrote.
  • Each category and [bracketed] transfer posts to the account you choose in the split review. Suggestions apply only when you accept them, and the statement's own account cannot be a destination.
  • Records without splits convert as before, with the other side on the counter account, or on the file's category when category hints are on.
  • QIF names no currency, so amounts are written in USD. If the register is kept in another currency, replace USD in the output before you check it.

What is left out, with a note

  • A split transaction with any category still unmapped, or mapped to an invalid account, until you fix the mapping. It is never exported as a single uncategorized posting.
  • Splits given only as percentages, parts without an amount, parts that do not add up to the total, duplicated split fields, and records whose T and U amounts disagree.
  • Investment registers, and files that contain more than one account register. Export one bank or card account at a time.

Each left-out record is listed on its line below the output and is not counted as converted. Fix the export and convert again, or enter those transactions by hand. Import bank exports with the CLI

Questions about OFX and QIF

Is my bank statement uploaded anywhere?

No. The conversion runs in your browser with JavaScript, so the file never leaves your computer. You can confirm it by opening this page, disconnecting from the network, and converting anyway.

Which file types does this accept?

OFX in both of its forms — the older SGML dialect and the newer XML one — plus QIF. Banks also ship OFX under the .qfx and .qbo extensions, and those work too: the format is detected from the file's contents rather than its name.

Why is every transaction posted to Expenses:Uncategorized?

Because a bank export only knows what happened to one account. Double-entry needs both sides, so the second one is a placeholder you replace — either by setting the account above, or by categorising the entries afterwards. A guess that looks right is worse than a placeholder that is obviously wrong.

What stops a re-download creating duplicates?

Each OFX transaction carries a FITID, an ID the bank keeps stable across downloads, and it is kept as id: metadata on every entry. When date ranges overlap, add the file you converted last time as the optional previous export: IDs are matched only within the same bank and account, and you choose which matches to exclude — nothing is dropped automatically. QIF has no transaction ID, so overlapping QIF exports need checking by hand.

What happens to split transactions in QIF?

Every part is kept. For bank and credit-card records whose split amounts add up exactly to the transaction total, the split review lists each category and transfer with its amounts and memos. Once you choose an account for each, the bank posting stays exactly as exported and every part becomes its own posting, with its memo as metadata. Splits given only as percentages, parts without an amount, splits that do not add up, and investment registers are left out with a note instead of being flattened into one category.

My download contains several accounts. How do I convert it?

One statement at a time. Pick a statement above — each choice names its account, type, currency and transaction count — then check the account field matches where the money lives and copy or download that statement's ledger. Repeat for each remaining statement and append every download to your ledger. A file with a single statement converts immediately; a file with several converts nothing until you choose, so one statement's currency can never leak into another's.

Skip the download entirely

Beancount.io connects to your bank and writes the transactions straight into your ledger — no export file in the middle.