ConvertCSV

Finance file converter

CSV to OFX Converter

Convert spreadsheet transaction data into OFX format for bank imports. Upload a file or paste its contents, check the parsed transactions, then download the OFX file.

  • No signup
  • Files stay on your device
  • Transaction preview
  • Download ready

1 · Source

Add your CSV file

.csv.ofx
2 · Options

Used only if the file has none.

3 · Result

Output preview

Nothing converted yet

A sample CSV file is loaded — press “Convert to OFX” to see how the output looks.

Designed for finance exports

The parser recognises date, description, amount, debit/credit, memo, category, and transaction id fields, including headers like Narration or Withdrawal Amt. used by many banks.

Check before you import

Each conversion shows the parsed transactions with money in, money out, and date range, plus warnings about ambiguous dates or missing account details.

Private browser workflow

PDFs and text files are read by your browser and never sent to a server. Close the tab and the data is gone.

CSV to OFX Converter

Payment processors, neobanks, and brokerage back offices export CSV. Accounting and bookkeeping software imports bank activity as OFX. The gap between the two is why so many bookkeepers end up copying rows into a QuickBooks register by hand, or importing a CSV through a mapping wizard that forgets the mapping next month. This converter writes a proper OFX statement from any CSV that has a date, a description, and an amount.

The point of OFX over a plain CSV import is the transaction id. Every STMTTRN carries a FITID, and importers use it to skip transactions they have already seen. If your CSV has an Id, FITID, or check-number column, that value is used. If it does not, the converter derives an id from the row's date, amount, description, and position, so converting the same export twice produces identical ids and a second import is recognised as a duplicate rather than doubled.

The file is parsed and the OFX text is assembled in your browser. Nothing is uploaded, so a payout report that lists every customer payment for the month stays on your machine.

Key features

  • Recognises bank-style headers without renaming: Posting Date, Payee, Narration, Particulars, Debit and Credit pairs, Ref No, Cheque No.
  • Writes stable FITIDs: your Id column when present, otherwise a hash of the row content and position.
  • Fills FID, INTU.BID, and BANKACCTFROM from the Intuit bank ID field.
  • Truncates NAME to the 32-character OFX limit and moves longer descriptions into MEMO.
  • Shows the parsed transactions and the raw OFX side by side before download; runs entirely in the browser.

About the CSV to OFX format

The output is OFX 1.02 in its SGML form: a plain-text header (OFXHEADER:100, DATA:OFXSGML) followed by tags without closing tags. This older flavour is what most desktop importers were written against and remains the safest choice; XML-style OFX 2.x is accepted by fewer programs.

Column mapping: Date becomes DTPOSTED (YYYYMMDDHHMMSS, time fixed at midnight), Description becomes NAME, Amount becomes TRNAMT, and a Memo, Note, or Reference column becomes MEMO. Id, FITID, Transaction ID, Ref No, or Check No columns become FITID. A Category column is ignored, because an OFX bank statement has no category field; if categories matter to you, CSV to QIF or CSV to IIF carry them.

NAME is cut at 32 characters, the limit in the OFX specification, because importers that enforce it would otherwise reject the file. When a description is longer and the row has no memo, the full text is written to MEMO, which allows 255 characters, so nothing is lost.

TRNTYPE is CREDIT for positive amounts and DEBIT for negative ones. If your CSV has separate Debit and Credit columns instead of one signed Amount, the two are merged into a single signed value, with debits negative.

The Intuit bank ID field fills the FID and INTU.BID tags. Intuit products use this number to recognise the institution; other importers ignore it. A BANKACCTFROM block is written with the same id, a placeholder ACCTID of 00000000, and ACCTTYPE CHECKING, so your software will prompt you to pick the destination account on first import. CURDEF is fixed at USD and LEDGERBAL at 0.00, because a CSV export rarely states either reliably; importers reconcile balances from the transactions themselves.

How it works

The CSV delimiter (comma, semicolon, or tab) is detected from the header line, and each header is matched against a list of known names to find the date, description, amount or debit/credit, memo, and id columns.

Dates are parsed into a single calendar date using the Date order setting, or auto-detected when any value has a day above 12. Amounts are stripped of currency symbols and separators, and parentheses or a trailing minus are treated as negative.

Each row is written as a STMTTRN block with TRNTYPE, DTPOSTED, TRNAMT, FITID, NAME, and MEMO where present, wrapped in the sign-on and statement sections an importer expects.

The result is offered as a .ofx download and as text you can copy.

Common use cases

  • A bookkeeper imports a monthly Stripe or PayPal payout report into QuickBooks Desktop, which accepts OFX but not CSV for bank feeds.
  • A company's bank dropped direct-connect downloads, leaving CSV as the only export, while the finance team's reconciliation workflow is built around OFX files.
  • A sole trader keeps a spreadsheet ledger with transaction references and wants those references preserved as FITIDs when loading history into GnuCash.
  • A business receives card statements from a corporate card provider as CSV and needs them in Xero, which imports OFX through its bank statement upload.
  • A finance team consolidates CSV exports from several banks into one OFX per account so every import goes through the same path.

How to use this tool

  1. Export the transactions as CSV and upload the file, or paste the CSV text into the box.
  2. Enter your bank's Intuit ID if your software is QuickBooks; otherwise leave the default.
  3. If the preview warns about ambiguous dates, set Date order to match the export.
  4. Compare the row count, signs, and the first and last dates with the source.
  5. Download the .ofx file and import it through your software's bank file or statement import, choosing the account when prompted.

Example

CSV (payout report)

Date,Description,Amount,Id
2026-06-02,Stripe payout,1842.10,po_1Q2w3e
2026-06-02,Stripe fees,-53.42,fee_9z8y7x

OFX (transaction list)

<STMTTRN>
<TRNTYPE>CREDIT
<DTPOSTED>20260602000000
<TRNAMT>1842.10
<FITID>po_1Q2w3e
<NAME>Stripe payout
</STMTTRN>
<STMTTRN>
<TRNTYPE>DEBIT
<DTPOSTED>20260602000000
<TRNAMT>-53.42
<FITID>fee_9z8y7x
<NAME>Stripe fees
</STMTTRN>

Tips for best results

  • Include an Id or Reference column from the source system whenever you can. Source ids survive reordering and re-exports; derived ids change if a row's position or description changes.
  • Keep a signed Amount column rather than unsigned amounts with a separate type column. A Debit/Credit column pair is handled, but a Type column saying DR or CR next to an unsigned amount is not.
  • Set the Date order control when dates look like 03/05/2026 and no row in the file has a day above 12. The auto-detector flips to day-first as soon as it sees a 13 or higher in the first position; until then it assumes month-first.
  • Check the row count and the first and last dates in the preview against your source before downloading. DTSTART and DTEND in the file are taken from the first and last rows.
  • Convert one statement period at a time and name the file after the account and month. Reconciliation in most programs is per statement.

Common errors and how to fix them

The converter cannot find a date, description, or amount column.
The first line must be a header row. Headers such as Txn Dt, Details, or Value are not recognised; rename them to Date, Description, and Amount. A file with no header at all needs one added.
Every imported transaction shows as a deposit.
The CSV used unsigned amounts with a separate type column. Either add a minus sign to the debits in a spreadsheet, or split the amounts into Debit and Credit columns, which the converter merges with the correct sign.
The importer skipped every transaction as a duplicate.
The same period was imported before, and the FITIDs matched. That is the intended behaviour. If the earlier import was wrong, delete those transactions in your software first, then import again.
Payee names show odd characters after import.
The OFX header declares Windows-1252. Characters outside that set, such as ₹ or Cyrillic letters, are written as-is but a strict importer may display them wrongly. Edit those payee names to plain letters in the CSV before converting.
Quicken refuses to open the file.
Quicken only imports QFX. Run the downloaded file through the OFX to QFX converter, which adds the Intuit-specific tags Quicken checks for.

Best practices

  • Export with a reference or transaction id column and keep it; it is the one thing that makes re-imports safe.
  • Keep the original CSV next to the OFX file so any register entry can be traced back to the source export.
  • Import a single small file the first time you use a new export layout, and check signs and dates in the register before importing a year.

Frequently asked questions

Why is the balance zero in the imported statement?

LEDGERBAL is written as 0.00 because a CSV export does not reliably state the closing balance. Programs that display the file's balance show zero until you reconcile; the transactions themselves are complete.

Why does the file say USD when my account is in another currency?

CURDEF is fixed at USD. Single-currency accounts in most programs ignore the tag and use the account's own currency. If your software enforces it, open the .ofx in a text editor and change the three letters after CURDEF before importing.

Can I include categories?

OFX bank statements have no category field, so a Category column is dropped. Use CSV to QIF for Quicken-style category lines, or CSV to IIF to post QuickBooks Desktop splits to named accounts.

What happens to a Debit and a Credit column?

They are merged into a single signed amount, with the Debit column negative. A row with values in both columns is unusual and should be checked in the preview.

For more background on data formats and conversion workflows, read our format guides.