neatstatement

CSV to OFX converter

Plain OFX, the open format, with no branding tag for QuickBooks or Quicken. For everything else that reads a bank feed.

Free, no accountNothing is uploadedNo file size limit

Drop your CSV here

or click to choose a file · nothing is uploaded

Converting CSV to OFX, step by step

  1. 1Confirm your software wants plain OFX

    The distinction matters here more than anywhere else on the site. If the software is QuickBooks or Quicken it will reject a plain OFX, and you need the branded QBO or QFX instead. Everything else that reads bank feeds wants exactly what this page produces.

    Step 1 of the CSV to OFX converter: confirm your software wants plain ofx
  2. 2Drop the CSV in and set the columns

    Date, description and amount are detected and shown for correction. If your export splits money out and money in across two columns, set both, and the first is negated on the way through.

    Step 2 of the CSV to OFX converter: drop the csv in and set the columns
  3. 3Set the account type

    Checking, savings or credit card. Unlike the Intuit formats, most OFX readers use this only to label the account rather than to change sign conventions, but getting it right still saves a conversation with the import wizard.

    Step 3 of the CSV to OFX converter: set the account type
  4. 4Download the .ofx

    What comes out is OFX 1.02 in SGML form, with no Intuit branding tag anywhere in it. Open it in a text editor if you want to see that for yourself: the SONRS block is where a QBO would carry INTU.BID and this file simply does not.

    Step 4 of the CSV to OFX converter: download the .ofx

One CSV transaction, and the OFX it becomes

Note the ampersand in the payee: it goes, and the reason is a limitation of the format rather than a choice.

Your CSV
Date,Description,Amount
2026-03-20,REFUND ARDEN & CO,18.99
The OFX it becomes
<STMTTRN>
<TRNTYPE>CREDIT
<DTPOSTED>20260320120000
<TRNAMT>18.99
<FITID>202603201899REFUNDARDEN
<NAME>REFUND ARDEN  CO
</STMTTRN>

What survives CSV to OFX

The interesting row is the last one. A CSV cannot be trusted about balances, so none is declared rather than declaring a wrong one.

FieldWhat happens to it
DateKeptWritten as an OFX timestamp at midday, which avoids timezone rounding across a date boundary
DescriptionRebuiltAngle brackets and ampersands are stripped: OFX 1.x has no escaping, so they would break the file
AmountKeptSigned, two decimals
Transaction typeRebuiltInferred from the sign
Transaction idRebuiltGenerated and stable, so the same CSV converted twice produces the same ids
Branding tagLostDeliberately absent. This is the whole difference between an .ofx and a .qbo
BalanceLostWritten as zero: a CSV column of running balances is not reliable enough to declare as the closing balance

Importing OFX into the software that reads it

GnuCash: File, then Import, then Import OFX/QFX. GnuCash matches the account from the file and remembers the mapping for next time.

Moneydance: File, then Import, and select the OFX. It will ask which account to file the transactions under.

Banktivity and MoneyWiz both take OFX from their own import menus and use the transaction ids to skip anything already present.

Firefly III and other self hosted tools generally accept OFX through an importer plugin rather than the main interface, and the plugin will want the account chosen up front.

Plain OFX, not a rebranded QBO

OFX is the open specification that QBO and QFX are both built on. The difference is a tag identifying the file to Intuit's software, which QuickBooks and Quicken require and everything else ignores or trips over.

This writes the file without that tag. If you are importing into QuickBooks or Quicken you want one of the branded formats instead: they are on this site too, and a plain OFX will be refused by both.

What reads plain OFX

GnuCash, Moneydance, Banktivity, KMyMoney, Firefly III, MoneyWiz, and most self hosted personal finance software. Several bookkeeping packages outside the US accept OFX as their standard import.

Some of them accept QFX as well, by ignoring the extra tag. If yours does, either file works and it makes no difference which you pick.

Structure is what you gain over a CSV

A CSV is a table and the receiving software has to be told what each column means, every time. An OFX states it: this field is the posted date, this is the amount, this is the payee, this is the type, and this id is unique to this transaction.

That last part is the practical gain. Transactions get ids generated from their date, amount and payee, which are stable across conversions, so re-importing the same file is a no-op rather than a duplicate month.

Why the payee loses its punctuation

Look closely at the sample above: the ampersand in the payee is gone. OFX 1.x is SGML with no escaping mechanism at all, so a literal angle bracket or ampersand inside a value ends the value early and corrupts everything after it.

Rather than write a file that some readers cope with and others reject, those three characters are replaced with spaces. It is a small cosmetic loss in exchange for a file that parses everywhere.

Which OFX version this writes

OFX 1.02, the SGML form. It looks wrong to anyone expecting XML, because leaf tags are never closed, and that is correct: closing them produces a file that most desktop finance software rejects.

OFX 2.x exists and is real XML, but support for it outside of bank servers is thin. If your software specifically asks for OFX 2, it will also tell you so, and that is a rare enough case that it is not offered here.

OFX problems, and what causes them

What you seeWhyWhat to do
QuickBooks or Quicken rejected the fileWorking as intended. Both check for the Intuit branding tag, which a plain OFX does not carry.Use the CSV to QBO page for QuickBooks or the CSV to QFX page for Quicken.
The importer complains that the XML is malformedIt is expecting OFX 2.x. This file is OFX 1.02, which is SGML: leaf tags are never closed, and an XML parser reads that as broken.Look for an OFX 1 or legacy option in the importer. Most desktop finance software prefers 1.02, which is why it is what gets written.
The payee lost an ampersand or a bracketOFX 1.x has no escaping, so those characters would end a value early and corrupt the rest of the file.Nothing to fix in the file. Edit the payee after import if the exact string matters.
The closing balance shows as zeroA CSV cannot be trusted to state a balance, so none is declared rather than declaring a wrong one.Most importers ignore the declared balance and compute their own from the transactions. If yours insists, edit the BALAMT line, which is plain text near the end of the file.
Re-importing added everything twiceThe ids are stable for an unchanged CSV, so this points at the CSV having changed between conversions, even by a whitespace edit.Convert from the original export each time rather than from a copy you have been editing.

CSV to OFX questions

What is the difference between OFX and QFX?
QFX is OFX plus a tag identifying the file to Quicken. The transactions are the same. Quicken requires the tag; other software does not care or actively prefers it absent.
Will this OFX import into QuickBooks?
No. QuickBooks checks for the Intuit tag and rejects a plain OFX as being from an unsupported institution. Use the CSV to QBO converter for QuickBooks.
Which OFX version does it write?
OFX 1.02, which is the SGML form and the one nearly everything accepts. OFX 2.x is XML and is far less widely supported by desktop finance software.
Why is the closing balance zero in the file?
Because a CSV cannot be trusted to state one. A balance column may be running, may be per account, or may not be a balance at all, and declaring the wrong closing figure is worse than declaring none.