CSV to QBO Converter — For QuickBooks

Turn a CSV your bank exported into a QuickBooks Web Connect file. Your columns are read wherever they are and whatever they are called — Debit and Credit, Paid In and Paid Out, or a single signed Amount — and each transaction keeps the direction your file gave it.

Not the file you need?

QuickBooks reads a QBO with no columns to map. Desktop cannot import a bank CSV at all.

Your headings, not a fixed template

There is no mapping screen. The columns are worked out from what is under them as well as what they are called, so a file headed "Money In" and "Money Out" needs no more from you than one headed Credit and Debit.

Every transaction gets a stable id

QuickBooks silently drops a repeated FITID, so two identical amounts on the same day would become one line. Each row is given an id derived from its own contents, so they stay two.

A direction for every figure

A ledger file needs to know which way each amount moves. Where a CSV carries one signed column the sign is read; where it carries two the heading decides. If neither can settle it you are told, rather than handed a file with every payment the wrong way round.

What the QBO file contains

Field by field, where each part of the download comes from.

In your CSVIn the QBOHow
Date<DTPOSTED>Written YYYYMMDD. The day-month order comes from the file's own dates: 03/16/2026 can only be month first.
Amount, or Debit and Credit<TRNAMT>One signed figure, money out negative, from the sign, a Dr or Cr marker, the column heading or the running balance - whichever the file has.
Money in or out<TRNTYPE>CREDIT or DEBIT.
Description<NAME>, <MEMO>The first 32 characters in <NAME>, the most OFX allows. A longer description goes into <MEMO>, up to 96 characters.
Balance<LEDGERBAL>The balance on the latest-dated row. With no balance column it is 0.00, because the tag is required.
Currency in a heading<CURDEF>USD when the file names none, and the preview says so before you download.
Not in a CSV<FITID>24 characters made from each row's date, description, amount and position, so the same file always gives the same ids.
Not in a CSV<INTU.BID>3000, the id Intuit registered for Wells Fargo - a common stand-in when a file names no bank - so the import may be labelled with that bank's name.

Sample output

Made by this converter's own code from the made-up file shown. The output is the file it writes, not retyped.

The input: CSV

A made-up CSV in the shape a US bank exports: one signed Amount column, dates month first, and the same coffee bought twice on one day.

Date,Description,Amount,Balance
03/02/2026,SAMPLE COFFEE ROASTERS,-4.75,595.25
03/02/2026,SAMPLE COFFEE ROASTERS,-4.75,590.50
03/06/2026,EXAMPLE CO PAYROLL,2500.00,3090.50
03/16/2026,MADE-UP POWER & LIGHT CO ONLINE BILL PAYMENT,-126.40,2964.10

The output: QBO

The whole file. The writer puts everything after the header on one line; line breaks are added here before each transaction so it can be read.

OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE

<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0</CODE><SEVERITY>INFO</SEVERITY></STATUS><DTSERVER>20260316120000</DTSERVER><LANGUAGE>ENG</LANGUAGE><INTU.BID>3000</INTU.BID></SONRS></SIGNONMSGSRSV1>
<BANKMSGSRSV1><STMTTRNRS><TRNUID>1</TRNUID><STATUS><CODE>0</CODE><SEVERITY>INFO</SEVERITY></STATUS>
<STMTRS><CURDEF>USD</CURDEF><BANKACCTFROM><BANKID>000000000</BANKID><ACCTID>000000000</ACCTID><ACCTTYPE>CHECKING</ACCTTYPE></BANKACCTFROM>
<BANKTRANLIST><DTSTART>20260302</DTSTART><DTEND>20260316</DTEND>
<STMTTRN><TRNTYPE>DEBIT</TRNTYPE><DTPOSTED>20260302</DTPOSTED><TRNAMT>-4.75</TRNAMT><FITID>26A40A0FFA04FE01AF3373BD</FITID><NAME>SAMPLE COFFEE ROASTERS</NAME></STMTTRN>
<STMTTRN><TRNTYPE>DEBIT</TRNTYPE><DTPOSTED>20260302</DTPOSTED><TRNAMT>-4.75</TRNAMT><FITID>01B3C246FCC497E0F00BEDC4</FITID><NAME>SAMPLE COFFEE ROASTERS</NAME></STMTTRN>
<STMTTRN><TRNTYPE>CREDIT</TRNTYPE><DTPOSTED>20260306</DTPOSTED><TRNAMT>2500.00</TRNAMT><FITID>E05D5CEF8B4AB43DCCF7E65D</FITID><NAME>EXAMPLE CO PAYROLL</NAME></STMTTRN>
<STMTTRN><TRNTYPE>DEBIT</TRNTYPE><DTPOSTED>20260316</DTPOSTED><TRNAMT>-126.40</TRNAMT><FITID>398EE8974A72DDD411A6B277</FITID><NAME>MADE-UP POWER &amp; LIGHT CO ONLINE</NAME><MEMO>MADE-UP POWER &amp; LIGHT CO ONLINE BILL PAYMENT</MEMO></STMTTRN>
</BANKTRANLIST><LEDGERBAL><BALAMT>2964.10</BALAMT><DTASOF>20260316</DTASOF></LEDGERBAL>
</STMTRS></STMTTRNRS></BANKMSGSRSV1></OFX>

Questions about converting CSV to QBO

Why does QuickBooks reject my QBO file?

A QBO without an <INTU.BID> tag, with dates in any form but YYYYMMDD, or with a header that does not match its body is refused, usually without saying which. This file carries an INTU.BID, writes every date YYYYMMDD and is laid out as OFX 1.0.2, the version QuickBooks reads.

Will importing the same file twice duplicate my transactions?

Not when it is the same file. Converting the same CSV again gives every transaction the same FITID, and QuickBooks does not add a FITID it has already imported. An export covering a different date range gives the overlapping rows different ids, so import each period once.

What date format does my CSV need?

Whatever your bank wrote: 03/16/2026, 16/03/2026, 2026-03-16 or 16 Mar 2026. The order of day and month is taken from the whole file. When no day in it is above 12 the file cannot prove the order, dates are read day first, and the preview tells you to check one.

Can QuickBooks import a CSV directly?

QuickBooks Online can, from its upload screen, where you match the columns yourself. QuickBooks Desktop cannot import a bank CSV. Both read a QBO with nothing to map, and a QBO carries an id on every transaction so a repeated import is recognised.

Related guides