OFX to CSV Converter
Convert OFX bank export files to CSV for Excel or Google Sheets. Free, instant, 100% in your browser.
Drop your OFX file here
or click to browse
How to convert OFX to CSV
Download your OFX file
Export your bank transactions as OFX from your bank's online portal.
Upload OFX
Drop the file into the converter — all transactions are extracted automatically.
Open in Excel
Download the CSV and open it directly in Excel, Google Sheets, or Numbers.
About OFX to CSV conversion
An OFX file is a bank's answer to a question, not a table of numbers. The format was designed in 1997 around a request-and-response conversation between finance software and a bank server, and the file you download is one frozen response from that conversation. That is why it opens with a sign-on block reporting a status code, wraps the statement in a transaction-response envelope carrying its own status, and only then declares which account this concerns before listing what happened to it. Most of the document is protocol scaffolding; the transactions are the payload buried inside.
Converting to CSV keeps the payload and discards the envelope. Each transaction record yields one row with five fields: the posted date, the signed amount, the description, the transaction type, and the FITID. Dates are normalised from the OFX timestamp — which carries a time and a bracketed timezone offset such as [-5:EST] — down to a plain YYYY-MM-DD that Excel and Google Sheets recognise as a date without being told. Descriptions are read from MEMO where the bank filled it and from NAME where it did not, and every field is properly quoted, so a payee containing a comma stays in one cell.
The statement-level facts stay behind, and that is usually the right call. LEDGERBAL and AVAILBAL report the closing and available balances for the whole statement, and DTSTART and DTEND bound the period it covers — one value each for the file, not per transaction, so putting them in a column would mean repeating the same number down every row. If you need them, they are readable in a text editor at the bottom of the statement block. What people actually reach for the CSV to do is reconcile against an accounting system line by line, pivot a year of spending by month, hand transactions to a bookkeeper who does not use their software, or check what a bank actually sent before importing it anywhere.
Which OFX tags reach the CSV
| OFX tag | Where it lives | CSV column |
|---|---|---|
| DTPOSTED | Per transaction | Date (YYYY-MM-DD) |
| TRNAMT | Per transaction | Amount |
| MEMO | Per transaction | Description |
| NAME | Per transaction | Description, if MEMO is absent |
| TRNTYPE | Per transaction | Type |
| FITID | Per transaction | FITID |
| CHECKNUM | Per transaction | not exported |
| LEDGERBAL | Per statement | not exported |
| DTSTART / DTEND | Per statement | not exported |
| BANKID / ACCTID | Per statement | not exported |
Statement-level tags hold one value for the whole file rather than one per transaction, which is why they have no natural column in a per-transaction sheet.
Troubleshooting OFX to CSV
Excel turned my FITID column into scientific notation. Many banks build FITIDs out of long digit strings, and Excel treats anything that looks numeric as a number, so a sixteen-digit ID becomes 1.23457E+15 and the original value is gone. Import with Data > From Text/CSV and set the FITID column to Text before loading, rather than opening the file by double-click.
Long descriptions are cut off mid-word. That truncation comes from the bank. NAME is conventionally limited to 32 characters, and institutions that do not also populate MEMO leave you with the abbreviation and nothing else. The converter prefers MEMO precisely because it is usually the longer field — if the output is short, the long form was never in the file.
A day's transactions appear on the previous or following day. OFX timestamps carry a timezone offset in brackets, and a transaction posted late in the evening in one zone can carry a date that reads as the next day in another. The date is taken exactly as written in DTPOSTED, without shifting it into your local timezone — so an occasional off-by-one against your bank's web view reflects that offset rather than a parsing error.
The file produced no rows at all. Three causes account for nearly all of these: an investment statement, which stores activity in a different record type than bank and card statements do; a genuinely empty date range; and an HTML page saved with an .ofx extension after a bank session expired mid-download. Opening the file in a text editor distinguishes them immediately — an HTML error page is unmistakable.
Frequently asked questions
What is an OFX file?
OFX (Open Financial Exchange) is the file a bank produces when it hands transaction data to accounting software. Inside is a nested document: a sign-on block, a statement response naming the account, and a transaction list holding one record per transaction with a posted date, an amount, a description, and a bank-assigned unique ID.
What columns does the CSV output include?
Five: Date, Amount, Description, Type, and FITID. Date comes from DTPOSTED, Amount from TRNAMT, Description from MEMO with a fallback to NAME, Type from TRNTYPE, and FITID from the tag of the same name — the bank's unique identifier for that transaction.
What happened to the time and timezone on my transactions?
OFX timestamps look like 20260614120000[-5:EST] — a full date and time with a bracketed timezone offset. Only the date portion is exported. The time on a posted bank transaction is a batch-processing artefact rather than the moment of purchase, so keeping it would imply a precision the data does not have.
Why is the Type column sometimes blank or full of unfamiliar words?
TRNTYPE is copied through verbatim. The standard values include DEBIT, CREDIT, CHECK, POS, ATM, XFER, FEE, INT, and DIRECTDEP, but banks are inconsistent about which they use and some omit the tag entirely. A blank Type means the source file had none, not that parsing failed.
What is the FITID column for?
FITID is the bank's permanent identifier for a transaction, and it is what accounting software uses to recognise a record it has already imported. In a spreadsheet it is the reliable key for deduplicating two overlapping exports, or for matching rows against a second system — far safer than matching on date and amount, which collides on repeated identical charges.
Does this work with QFX and QBO files too?
Yes. QFX is Quicken's branded OFX and QBO is QuickBooks', and both carry the same transaction records under the same tag names. All three extensions are accepted here and produce identical output.
Does it handle both OFX 1.x and OFX 2.x files?
Yes. OFX 1.x uses an SGML dialect where leaf tags are opened but not closed, while OFX 2.x is strict XML with everything closed. The parser works from the transaction blocks rather than assuming one dialect, so files of either generation convert.
My OFX file covers two accounts — will both convert?
All transaction records in the file are exported, whichever statement block they sit in, and they arrive as one continuous list. There is no account column, so if the file mixes a checking account and a credit card the rows interleave. Download each account separately when you need them kept apart.
Is my financial data safe?
The file is read and converted entirely in your browser. Nothing is uploaded, no account is required, and no copy is retained anywhere — which matters more than usual for a file that contains your routing and account numbers.