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
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.
!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
^
- Salary
- Income:Salary
- Taxes:Federal
- Expenses:Taxes:Federal
- [Savings]
- Assets:Savings
- Groceries
- Expenses:Groceries
- Household
- Expenses:Household
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.