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.
Finance file 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.
1 · Source
3 · Result
Nothing converted yet
A sample CSV file is loaded — press “Convert to OFX” to see how the output looks.
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.
Each conversion shows the parsed transactions with money in, money out, and date range, plus warnings about ambiguous dates or missing account details.
PDFs and text files are read by your browser and never sent to a server. Close the tab and the data is gone.
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.
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.
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.
CSV (payout report)
Date,Description,Amount,Id
2026-06-02,Stripe payout,1842.10,po_1Q2w3e
2026-06-02,Stripe fees,-53.42,fee_9z8y7xOFX (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>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.