Bank CSV to OFX Converter
Turn a bank CSV export with separate Withdrawal and Deposit columns into OFX. Map the columns yourself, inspect the five-row preview and verify the downloaded file before importing.
Convert to OFX
100% free, runs in your browser
Drop your file here
Excel (.xlsx) or CSV
Input Formats
Output Formats
This bank CSV to OFX workflow generates an OFX 2.03 XML bank statement from structured transaction rows in your browser. It does not extract PDF or scanned statements, identify a bank layout with AI, or connect to accounting software. Prefer a native OFX download from your bank when available: this converter creates local transaction IDs, not the original bank-issued identifiers. For Excel workbooks or a single signed amount column, see the separate Excel to OFX guide linked below.
Before converting: prefer your bank’s native OFX export
Check the bank download menu first. If it offers native OFX for the same account and date range, use that instead of rebuilding a statement from CSV. Retain the original download and statement for reconciliation. Converting CSV cannot recover missing bank-issued transaction IDs or certify acceptance by a particular application.
This page covers a bank CSV with separate unsigned Withdrawal and Deposit columns. It is not a PDF extractor, bank feed, batch service or categorized double-entry ledger. The shared widget also reads spreadsheets, but workbook preparation and signed-amount examples belong to the Excel to OFX owner linked below. External application import of this output has not been tested.
Prepare bank CSV headers, dates and unsigned amounts
Use a CSV with unique column headers in the first row: Date, Description, Withdrawal, Deposit and optionally Reference. Remove report titles, opening balances, totals and non-transaction rows. Keep one bank account and one currency per file. Inspect the preview for correct delimiters and text decoding; do not continue if the bank export has been split into the wrong columns.
Enable Split Debit/Credit, map Withdrawal to Debit and Deposit to Credit, and check both mappings even if they were guessed. Map Date and Description to different columns. A description column is required even if a particular description is blank. Select Reference explicitly if needed; leave unused optional fields unmapped. Do not open and resave a CSV in software that strips leading zeros from references.
Use nonnegative amounts on only one nonzero side of each row. A blank opposite side counts as zero. The signed output is Deposit minus Withdrawal. Negative values, two nonzero sides, two blank sides and malformed numbers are rejected. Do not map already-negative withdrawals as Debit: use a signed-amount workflow instead. Plain decimal text may use 1234.56 or 1234,56, and grouped decimals may use 1,234.56 or 1.234,56. Quote comma-containing fields in comma-delimited CSV. Remove currency symbols; ambiguous 1,234, scientific notation and more than two decimal places are rejected.
Choose the date format used by the CSV, not your computer locale. For the example below select dd/MM/yyyy: 01/10/2026 means October 1, not January 10. Other supported text formats are MM/dd/yyyy, yyyy-MM-dd, yyyy/MM/dd, dd-MM-yyyy and MM-dd-yyyy. Missing or invalid dates such as 31/02/2026 stop conversion. Fix the indicated source row and retry; rows are not silently skipped or assigned today’s date.
Enter the real account and dated closing ledger balance
Enter the real bank ID (up to 9 characters) and account ID (up to 22 characters), select CHECKING, SAVINGS or CREDITLINE, and confirm the supported uppercase currency code, such as EUR or USD. These fields describe a bank account; this is not an investment or credit-card-specific OFX message. Keep account identifiers as text.
Provide the actual closing ledger balance from the bank statement, with an as-of date on or after the latest transaction. A transaction export may omit the opening balance, so its net movement is not your closing balance. The converter does not calculate or infer LEDGERBAL from the transaction sum or an optional balance-column mapping. If the real balance is unavailable, obtain it before generating the file.
The on-page preview shows only the first five transactions, not the complete file. Before importing, check every transaction in the downloaded OFX against the source CSV, including the count, dates, signs, references and account details. The preview and successful generation do not replace full-file verification.
Worked bank CSV example: withdrawals, deposits and leading-zero references
Use the first five columns below as the CSV input; the final column is the expected OFX amount, not an input field. Enable Split Debit/Credit and map Date, Description, Withdrawal (Debit), Deposit (Credit) and Reference. Select dd/MM/yyyy, EUR and SAVINGS. The sample bank ID 123456789, account ID SAMPLEACCOUNT and closing ledger balance 2500.00 dated 2026-10-03 are illustrative only: replace them with the actual bank statement values.
The transaction excerpt is checked against this tool’s normalizer and OFX generator. It is not a complete importable file or evidence of a customer import. The download adds account metadata, currency, transaction range and the supplied closing balance. DTPOSTED uses the source date with a fixed noon time, not an original transaction timestamp or timezone. Reference 000123 remains text; ampersands are escaped as XML.
| Date | Description | Withdrawal | Deposit | Reference | OFX amount |
|---|---|---|---|---|---|
| 01/10/2026 | Office & supplies | 45.67 | 000123 | -45.67 | |
| 02/10/2026 | Client payment | 1.234,56 | 000124 | 1234.56 | |
| 03/10/2026 | Bank fee | 10.00 | 000125 | -10.00 |
<STMTTRN>
<TRNTYPE>DEBIT</TRNTYPE>
<DTPOSTED>20261001120000</DTPOSTED>
<TRNAMT>-45.67</TRNAMT>
<FITID>local:sha256:11a76d985af6923a8b8c1aa25818e1e86ab9d4f694b409b2d87982b7c2564873:1</FITID>
<REFNUM>000123</REFNUM>
<NAME>Office & supplies</NAME>
<MEMO>Office & supplies</MEMO>
</STMTTRN>
<STMTTRN>
<TRNTYPE>CREDIT</TRNTYPE>
<DTPOSTED>20261002120000</DTPOSTED>
<TRNAMT>1234.56</TRNAMT>
<FITID>local:sha256:b4024644720415162d3d227596212623ae1c288bfb5cb2b54f2a054e33750aae:1</FITID>
<REFNUM>000124</REFNUM>
<NAME>Client payment</NAME>
<MEMO>Client payment</MEMO>
</STMTTRN>
<STMTTRN>
<TRNTYPE>DEBIT</TRNTYPE>
<DTPOSTED>20261003120000</DTPOSTED>
<TRNAMT>-10.00</TRNAMT>
<FITID>local:sha256:e0aa63d372aa34014841473a40ce0d5b4b13a6615d9cb6fa964a9cdcae02d009:1</FITID>
<REFNUM>000125</REFNUM>
<NAME>Bank fee</NAME>
<MEMO>Bank fee</MEMO>
</STMTTRN>GnuCash: native CSV alternative and documented OFX import
GnuCash has a native CSV importer: File > Import > Import Transactions from CSV. Its assistant lets you set separators, date and number formats and map columns. If your destination is GnuCash, try that route before adding an OFX conversion step.
For OFX, the manual describes account selection followed by the generic transaction import matcher. These are documentation-based directions, not certification: importing this output in GnuCash has not been tested. Back up your books or use a disposable test book first; menu wording and importer availability may vary by installation.
- Choose File > Import > Import OFX/QFX transactions, select the downloaded .ofx file and press Import.
- In the account-selection dialog, select the correct account from your chart of accounts and confirm. GnuCash remembers source-account mappings for later imports.
- Review the matcher: check dates, signed amounts, descriptions, transfer-account assignments and proposed duplicate matches before accepting. Correct assignments or cancel if anything is wrong.
- Compare the resulting account register with the original bank statement and reconcile against its actual balance.
Source: GnuCash manual, section 6.16: CSV, OFX/QFX and import matcher
Duplicates, limits and software acceptance
FITIDs use local SHA-256 fingerprints of account metadata and mapped transaction content, with counters for identical rows. Changing row order does not change distinct transaction IDs, but editing mapped values can. Overlapping files containing indistinguishable repeated transactions cannot be reliably deduplicated from content alone. Review the destination’s matches and existing register; do not assume importing the same date range again is safe.
Mapped references become REFNUM, not bank-issued FITIDs. Descriptions become NAME (first 32 characters) and MEMO (up to 255 characters). Descriptions longer than 255 characters or references longer than 32 characters stop OFX generation. Do not trim away meaningful data without reviewing it. Browser memory limits practical file size; no timing or row-count guarantee is offered.
An OFX file is not a certified QuickBooks QBO or Quicken QFX Web Connect file. Renaming the extension does not establish institution certification or application acceptance. Successful generation and the illustrative example do not prove a successful external application import. Check the destination’s current requirements and test a small sample before importing a full account history.
How It Works
Prepare one bank CSV
Export one account and currency. Put unique headers in the first row and keep only transaction rows, with unsigned Withdrawal and Deposit columns.
Map withdrawals and deposits
Enable Split Debit/Credit. Map Withdrawal to Debit and Deposit to Credit, choose the exact date format, and confirm references and account details.
Check and download
Supply the actual dated closing ledger balance. Inspect the five-row preview, fix rejected rows in the source, then check the complete downloaded OFX before a small test import.
Features & Benefits
Explicit column mapping
Withdrawal becomes Debit and Deposit becomes Credit. Column guesses need your review; no bank-specific layout recognition is promised.
Signed OFX amounts
Nonnegative withdrawals become negative amounts and deposits positive. Two nonzero sides or two blank sides stop conversion.
Reference preservation
A mapped reference such as 000123 stays text in REFNUM. It is separate from the locally generated FITID.
Fail-closed validation
Invalid dates, malformed amounts and ambiguous mappings stop conversion rather than silently dropping a row or inventing a value.
Common Use Cases
- Convert a single bank CSV with separate withdrawals and deposits into a test OFX statement
- Check transaction signs, dates and leading-zero references before an OFX import
- Compare a CSV-to-OFX route with GnuCash’s native CSV import before choosing a workflow
Frequently Asked Questions
Should I use a bank OFX download instead of CSV conversion?
Yes, prefer your bank’s native OFX export for the required account and date range when available. CSV conversion creates local IDs and cannot reconstruct original bank-issued transaction identifiers.
How do Withdrawal and Deposit map to OFX signs?
Enable Split Debit/Credit, map Withdrawal to Debit and Deposit to Credit, and use nonnegative values. OFX amount is Deposit minus Withdrawal. A blank opposite side is zero; negative inputs, two nonzero sides or two blank sides stop conversion.
Why does my bank CSV stop on a row?
Fix the reported source row and retry. Dates must match the selected format, amounts must be unambiguous, and required fields must map to distinct columns. Invalid rows are not silently discarded.
Can I use a transaction total as the closing balance?
No. Supply the actual closing ledger balance and its date from the bank statement. Transaction totals alone do not establish the balance, and the converter does not infer it from an optional balance column.
Can this page extract a PDF statement or guarantee software import?
No. This workflow starts with structured bank CSV rows and downloads OFX. It does not extract PDFs or connect to accounting software. External application import has not been tested, and QBO/QFX certification is not provided.
