OFX and QFX File Format: Bank Statement Files Explained
OFX (Open Financial Exchange) is the format most banks use when you download transactions for personal finance or accounting software. It was created in 1997 by Microsoft, Intuit and CheckFree and contains your transactions together with account details and the closing balance.
QFX and QBO are not separate formats: they are OFX files with a few extra Intuit-specific fields, used by Quicken (QFX) and QuickBooks (QBO).
OFXHEADER:100
DATA:OFXSGML
VERSION:102
<OFX>
<BANKMSGSRSV1>
<STMTTRNRS>
<STMTRS>
<CURDEF>USD
<BANKACCTFROM>
<BANKID>999999999
<ACCTID>1234567890
<ACCTTYPE>CHECKING
</BANKACCTFROM>
<BANKTRANLIST>
<DTSTART>20240101
<DTEND>20240131
<STMTTRN>
<TRNTYPE>DEBIT
<DTPOSTED>20240115120000[-5:EST]
<TRNAMT>-42.50
<FITID>2024011500001
<NAME>COFFEE ROASTERS
<MEMO>Card purchase
</STMTTRN>
</BANKTRANLIST>
<LEDGERBAL>
<BALAMT>1520.35
<DTASOF>20240131
</LEDGERBAL>
</STMTRS>
</STMTTRNRS>
</BANKMSGSRSV1>
</OFX>Convert OFX / QFX files
- Convert OFX Bank Statement to CSV— Convert OFX/QFX bank exports to a clean spreadsheet
- Convert OFX / QFX to JSON— Convert an OFX or QFX bank statement to a JSON array of transactions
- Convert CSV to OFX— Convert a CSV of transactions to OFX format for import into Quicken, QuickBooks, or banking software
- Convert CSV to QFX— Convert a CSV of transactions to QFX format for import into Quicken
- Convert CSV to QBO— Convert a CSV of transactions to QBO format for import into QuickBooks
- Convert SWIFT MT940 to OFX— Convert a SWIFT MT940 bank statement to OFX format for import into Quicken or QuickBooks
- Convert CAMT.053 to OFX— Convert an ISO 20022 CAMT.053 SEPA bank statement to OFX format
How an OFX file is structured
Every transaction is an <STMTTRN> block inside <BANKTRANLIST>. The fields you will see most often are:
- TRNTYPE: transaction type, such as DEBIT, CREDIT, CHECK, FEE or INT (interest)
- DTPOSTED: posting date as YYYYMMDD, optionally followed by a time and a time zone in brackets
- TRNAMT: amount, negative for money leaving the account
- FITID: a unique ID per transaction. Accounting software uses it to skip duplicates when you import overlapping date ranges
- NAME and MEMO: payee and description
OFX 1.x vs OFX 2.x
OFX 1.x files are SGML: they start with plain header lines (OFXHEADER:100, DATA:OFXSGML) and leaf elements such as <TRNAMT>-42.50 have no closing tag. OFX 2.x files are proper XML with an <?xml ?> declaration and closing tags everywhere. Many banks still produce 1.x files, which is why generic XML tools often fail to read them.
Credit card statements use the same structure with CREDITCARDMSGSRSV1 and CCSTMTRS instead of the BANK… elements.
OFX vs QFX vs QBO
Because the content is the same, converting between them is mostly a matter of the header fields. Banks that are not registered with Intuit cannot produce QFX files that Quicken will accept.
- OFX: the open standard, read by GnuCash, Moneydance, Banktivity, Microsoft Money and many budgeting apps
- QFX: OFX plus Intuit fields such as <INTU.BID> (the bank ID). Quicken in the US expects QFX and may reject a plain OFX file
- QBO: the QuickBooks Web Connect variant, also OFX-based
How to open an OFX file
- Import it into finance software: Quicken, QuickBooks, GnuCash, Moneydance or Banktivity
- Read it in any text editor: it is plain text
- Convert it to CSV or JSON to work with the transactions in Excel, Google Sheets or your own code
Frequently Asked Questions
- What is the difference between OFX and QFX?
- QFX is OFX with extra Intuit-specific fields, mainly the bank ID <INTU.BID>. The transactions are stored identically. Quicken in the US expects QFX files; most other finance software reads plain OFX.
- Can I open an OFX file in Excel?
- Excel cannot read OFX directly. Convert the file to CSV first, then open the CSV in Excel or Google Sheets. Each transaction becomes a row with date, amount, payee and memo.
- Why are some of my transactions missing after import?
- Finance software skips transactions whose FITID it has already seen, to avoid duplicates. If a bank reuses IDs or your software has old transactions with the same ID, those rows are skipped.