White Paper

QIF vs OFX vs CSV: What These Bank File Formats Actually Mean

← All white papers

By Ian, founder of ThriftyOwl.money

Every bank has a "Download transactions" button, and nearly every one of them asks you to choose a format. The list is usually some mix of QIF, OFX, QFX, CSV and occasionally Excel, with no explanation of which one you want. Pick the wrong one and the best outcome is a file your app refuses to open. The worst outcome is a file that opens, looks fine, and quietly puts every date in the wrong month.

This is a plain-language guide to the three formats you will meet most often, what is really inside each of them, and how to choose between them. It is written for people moving their records from one program to another, and for anyone who has ever looked at a .qif file in Notepad and wondered what they were looking at.

The short answer

QIF OFX CSV
Full name Quicken Interchange Format Open Financial Exchange Comma-separated values
Age Early 1990s 1997 (version 2 is XML) Decades older than either
Looks like Lines of text, one field per line, each starting with a letter Tagged markup, like a simplified web page A spreadsheet saved as text
One file holds One account One or more accounts Whatever you put in it
Splits and transfers Yes Limited Only if you invent a column
Unique transaction ID No Yes No
Official standard No, a de facto convention Yes, a published specification No, only a loose description
Best for Moving old history from legacy software Regular downloads from a bank Anything else, and spreadsheets

None of them is simply the best. Each one was designed for a different job, and the trouble starts when you use one for a job it wasn't built for.

QIF: the old-timer

QIF was created by Intuit for Quicken in the early 1990s, and it was never a formal standard. Other programs copied it because it was simple, and because Quicken's popularity meant that anything that could read it could take in a lot of people's data. Microsoft Money exported it, so did a large number of banks, and it is still the format most people end up with when they dig a decade-old file out of a drawer.

A QIF file is plain text. You can open it in Notepad. A short one looks like this:

!Type:Bank
D14/03/2008
T-45.20
PTesco
LGroceries
MWeekly shop
^
D15/03/2008
T1250.00
PAcme Ltd
LSalary
^

Each line starts with a one-letter code that says what the rest of the line means: D for date, T for the amount, P for the payee, L for the category, M for a memo, and N for a cheque number. A C line marks a transaction as cleared or reconciled. A caret (^) ends each transaction, and the !Type line at the top says what kind of account the file describes.

What QIF is good at. It carries more of the detail that people care about than the other two. Categories (including sub-categories written as Parent:Child), memos, cheque numbers, cleared status, split transactions and transfers between accounts all have a place in the format. That is why it remains the standard route for rescuing history from retired desktop software.

Where QIF goes wrong:

OFX: the banking format

OFX was published in 1997 by Microsoft, Intuit and CheckFree, to solve a different problem: letting software talk to banks directly. It is a real, published specification, and the versions you will see differ in an important way. Version 1 uses a tagged format based on SGML, in which closing tags are often missing. Version 2 is proper XML.

If you have ever clicked "Download to Quicken" or "Download to Money" on a bank's website, the file you received was almost certainly OFX or its close cousin, QFX, which is OFX with extra Quicken-specific identifiers added. QFX is mostly a licensing arrangement. If a program wants OFX and you only have QFX, the data inside is nearly always the same.

A cut-down example:

<OFX>
  <BANKMSGSRSV1>
    <STMTTRNRS>
      <STMTRS>
        <CURDEF>GBP
        <BANKACCTFROM>
          <BANKID>123456
          <ACCTID>12345678
          <ACCTTYPE>CHECKING
        </BANKACCTFROM>
        <BANKTRANLIST>
          <STMTTRN>
            <TRNTYPE>DEBIT
            <DTPOSTED>20080314
            <TRNAMT>-45.20
            <FITID>20080314-0001
            <NAME>TESCO STORES
          </STMTTRN>
        </BANKTRANLIST>
        <LEDGERBAL>
          <BALAMT>1204.80
          <DTASOF>20080314
        </LEDGERBAL>
      </STMTRS>
    </STMTTRNRS>
  </BANKMSGSRSV1>
</OFX>

What OFX is good at. It describes the account as well as the transactions. The currency, account number, account type and the balance on a given date are all in the file, so a program can verify that its running total agrees with the bank's. Dates are written as 20080314, which is unambiguous. And every transaction carries a FITID, a unique ID assigned by the bank. That ID is what lets software recognise a transaction it has already imported and skip it, so downloading the same month twice does not create duplicates.

Where OFX goes wrong:

CSV: the one with no rules

CSV stands for comma-separated values, and the name more or less describes the entire format. Each line is a row, and the values in the row are separated by commas. It was in use long before QIF or OFX, and it is the format that every spreadsheet understands. A bank's CSV download looks like this:

Date,Description,Money Out,Money In,Balance
14/03/2008,TESCO STORES 4521,45.20,,1204.80
15/03/2008,ACME LTD,,1250.00,2454.80

What CSV is good at. It is the most universal format there is. Any bank will give you one, any spreadsheet will open it, and you can see and fix the contents yourself. If you've kept your finances in Excel, a CSV is how you get them out. It is also the only one of the three that you can easily produce by hand.

Where CSV goes wrong:

So which should you pick?

The right choice depends on what you are trying to do.

Moving years of history out of old software (Microsoft Money, older Quicken versions): use QIF. It preserves the categories, splits, transfers and reconciliation state that the other formats can't carry. ThriftyOwl.money's Microsoft Money import is built around exactly this route.

Staying up to date with a current bank account: use OFX (or QFX) if your software supports it. The unique transaction ID and the balance check make it the most reliable for repeated downloads. If your destination app doesn't read OFX, fall through to CSV.

Bringing in a spreadsheet, or a bank that offers nothing else: use CSV. It is the format that nearly everything can produce, and a careful import that shows you the detected columns and a preview of the rows, before anything is saved, takes most of the risk out of the loose standard. ThriftyOwl.money's CSV import works this way. It recognises common column names such as Date, Description, Amount, Money In and Money Out, Debit and Credit, then asks you to confirm the columns and date format against a preview, and offers a "flip the sign" option for card statements that list spending as positive.

The Import CSV page in ThriftyOwl.money, with its guide to preparing a file and the upload area

After the upload, the "Check your columns" step shows what was detected, with a preview of your rows, and lets you correct the date format or flip the sign before anything is saved:

The Check your columns step, with each field matched to a column, a date format chosen, and a preview of five sample transactions

If you have a choice between several, take the richest the destination accepts: QIF over CSV for history, because it keeps categories and splits, and OFX over CSV for downloads, because it prevents duplicates.

A short checklist for any file import

Whatever format you use, a few habits save a lot of trouble:

  1. Keep the original file untouched. Work from a copy.
  2. Check the date format against a transaction where the day is above 12, so you know which of day and month comes first.
  3. Check the signs. Make sure money going out is going out, in particular on credit card files.
  4. Compare a balance. After importing, check that an account's total matches the balance the bank or old program shows for the same date. If it matches, every transaction almost certainly arrived.
  5. Don't import the same file twice unless the format has transaction IDs, and even then check afterwards.
  6. Import a small account first. Run a quick test with a single account before you commit your whole history.

The bottom line

The three formats are less rivals than tools for different jobs. QIF is the best carrier of your own history, OFX is the best carrier of your bank's records, and CSV is the universal fallback that everyone can read and nobody can agree on. Knowing which is which turns a confusing download menu into a straightforward decision, and it stops the quiet errors, such as swapped dates, flipped signs and duplicated transactions, that make people distrust a migration that was actually fine.

If you're moving from Money or a spreadsheet, ThriftyOwl.money imports QIF, CSV and Excel files, and it shows you what it found before it saves anything.


About the author: Ian is the founder of ThriftyOwl.money. He built its Microsoft Money import tools himself and writes ThriftyOwl's white papers on the personal finance software industry.

Sources: Open Financial Exchange specification (ofx.net); FileFormat.com, "What is an OFX file?"; RFC 4180, "Common Format and MIME Type for Comma-Separated Values (CSV) Files" (IETF); Infinite Kind, "Importing From Microsoft Money".