Free tool

CSV to QBO Converter

Turn a bank or card CSV into a QuickBooks Web Connect file your QuickBooks will actually accept. Every transaction carries a stable ID, so re-importing an overlapping date range does not post the same transaction twice. Nothing you drop in leaves your browser.

Convert your file

Your bank sends CSV. QuickBooks Desktop and Enterprise will not take CSV for bank transactions, and QuickBooks Online will take it only in a stripped three or four column shape with no duplicate protection. This converts one into the other, in the page, with the checks you would otherwise find out about at the reconciliation.

Reading meridian-operating-2026-09.csv. Header found on row 4. CSV or TSV; for Excel, save as CSV first.

Columns

matched by its header. 09/01/2026 · 09/01/2026 · 09/02/2026

matched by its header. ACH CREDIT CASTELLAN FOODS CORP REMIT 88213 · ACH DEBIT ADP PAYROLL FEES · ACH DEBIT MIDWEST POLYMER SUPPLY CO INV 44821

Optional.

matched by its header. 1284.50 · 18420.00 · 2145.60

matched by its header. 42315.00 · 12880.40 · 96500.00

Optional.

matched by its header. 10447 · 10448 · 10449

Optional.

Optional.

matched by its header. 20260901AB7741 · 20260901AB7778 · 20260902AB7815

matched by its header. 410415.00 · 409130.50 · 390710.50

The commonest reason a converted file posts backwards. Check the preview: the amounts out should be negative.

Read as month-first.

A credit card writes a different statement block. Match the register in QuickBooks.

The bank ID QuickBooks reads. Same value every month.

The account number, or the last four with a prefix. It must be the same every month: it decides which register the file goes into.

With the closing balance, this proves the file is complete.

Typed off the statement, not worked out from the file.

Advanced

Leave blank to use the first transaction's date.

Rows outside the period are flagged.

One per file.

3000 is widely accepted. Change it only if QuickBooks says it cannot verify the financial institution.

The bank's own reference is permanent. The derived ID is stable across re-runs of the same export.

Longer descriptions are cut here, and the full text is kept in the memo.

Runs entirely in your browser. Nothing you enter is sent to us or stored.

2026-09-01 to 2026-09-30, net 68,141.01

28 transactions

Before you download

  • PassTies out to the statementOpening 368,100.00 plus net 68,141.01 equals the closing balance 436,241.01.
  • PassRunning balance is continuousEvery one of 28 balances follows from the one before it and that row's amount (oldest first).
  • Note28 of 29 rows converted1 skipped, each listed with its reason below.
  • NoteNet 68,141.01Money in 543,152.09. Money out 475,011.08. Net 68,141.01.
  • PassEvery date is inside the statement periodTransactions run 2026-09-01 to 2026-09-30, inside 2026-09-01 to 2026-09-30.
  • Check1 repeated transactionRows with the same date, amount and description. Often real (two wires sent the same day carry two identical fees), sometimes a range pasted twice. Each still gets its own transaction ID, so both will import.
  • Pass28 unique IDs from the bank's referenceEvery transaction carries the bank's own reference, which never changes.
  • PassRouting number is valid991234561 passes the ABA checksum.
  • Note1 row has no date and was skippedUsually a title, a column of totals, or a note the bank adds above or below the transactions.

As QuickBooks will read it

DateTypePayeeAmountTransaction ID
2026-09-01CREDITACH CREDIT CASTELLAN FOODS CORP 42,315.0020260901AB7741
2026-09-01DEBITACH DEBIT ADP PAYROLL FEES-1,284.5020260901AB7778
2026-09-02DEBITACH DEBIT MIDWEST POLYMER SUPPLY-18,420.0020260902AB7815
2026-09-03CREDITACH CREDIT JOHNSON & SONS DISTRI12,880.4020260903AB7852
2026-09-04CHECKCHECK PAID-2,145.6020260904AB7889
2026-09-04DEBITOUTGOING WIRE ARGENT TOOLING GMB-31,750.0020260904AB7926
2026-09-04DEBITWIRE FEE-35.0020260904AB7963
2026-09-04DEBITOUTGOING WIRE NORTHBAY FREIGHT L-9,400.0020260904AB8000
2026-09-04DEBITWIRE FEE-35.0020260904AB8037
2026-09-08CREDITWIRE IN KESTREL INDUSTRIAL HOLDI96,500.0020260908AB8074
2026-09-09DEBITACH DEBIT CENTERPOINT ENERGY-6,212.3320260909AB8111
2026-09-10CHECKCHECK PAID-975.0020260910AB8148
2026-09-11DEBITACH DEBIT PAYROLL MERIDIAN COMPO-148,226.1820260911AB8185
2026-09-11CREDITTRANSFER FROM SWEEP XX9902120,000.0020260911AB8222
2026-09-14CREDITACH CREDIT HALVERSON MACHINE WOR27,604.0020260914AB8259
2026-09-15DEBITANALYSIS SERVICE CHARGE-388.1220260915AB8296
2026-09-16DEBITACH DEBIT AMERICAN EXPRESS CORP -22,918.4720260916AB8333
2026-09-17CHECKCHECK PAID-4,410.0020260917AB8370
2026-09-18CREDITACH CREDIT CASTELLAN FOODS CORP 38,790.2520260918AB8407
2026-09-21DEBITACH DEBIT UNITED HEALTHCARE PREM-18,906.0020260921AB8444
2026-09-22DEBITACH DEBIT IRS USATAXPYMT EFTPS-41,337.9220260922AB8481
2026-09-23CREDITACH CREDIT DELACROIX AUTOMATION15,250.0020260923AB8518
2026-09-24DEBITACH DEBIT PAYROLL MERIDIAN COMPO-149,018.6620260924AB8555
2026-09-24CREDITTRANSFER FROM SWEEP XX9902135,000.0020260924AB8592
2026-09-25DEBITACH DEBIT CINTAS CORP 2-1,128.3020260925AB8629

The first 25 of 28. Every one is in the file.

Download

How the conversion works

What a .QBO file actually is

A Web Connect file is an OFX 1.0.2 document with an Intuit header on the front. OFX is the format banks have used for direct download since the late nineties, and it is SGML rather than XML, which is why a .QBO file opened in a text editor looks like HTML with the closing tags missing. They are genuinely optional in this version of the format.

The structure is a statement, not a list:

OFXHEADER:100 the Intuit header block VERSION:102 ... <OFX> <SIGNONMSGSRSV1> who produced this file, and when <SONRS> <FI><ORG>...<FID>... <INTU.BID>3000 which financial institution QuickBooks thinks this is <BANKMSGSRSV1> <STMTRS> one statement response <CURDEF>USD the currency <BANKACCTFROM> which account this statement belongs to <BANKID> routing number <ACCTID> account number <ACCTTYPE>CHECKING <BANKTRANLIST> <DTSTART> <DTEND> <STMTTRN> one of these per transaction <TRNTYPE>DEBIT <DTPOSTED>20260930120000 <TRNAMT>-1250.00 <FITID> the unique ID, see below <NAME> the payee, read short <MEMO> the detail <LEDGERBAL> the closing balance, and its date

Everything the converter does is filling that shape correctly from a file that was never designed to fill it.

FITID, and the promise it makes

FITID is the financial institution transaction ID. QuickBooks keeps the ones it has seen for an account and skips any transaction whose ID it already holds. That is what makes a bank feed safe to re-pull: overlapping date ranges do not post twice.

A CSV has no FITID, because it was built for a spreadsheet. The converter has to invent one, and the quality of that invention is the whole difference between converters.

  • Best: a column from your file. Many commercial banking portals export a transaction reference or a unique identifier alongside the amount. Map it, and the IDs are the bank's own, permanently stable, correct by construction.
  • Default: a hash. Date, amount, description, and an ordinal counted only among transactions that are otherwise identical, hashed to a fixed-length string. The same export converted again gives the same IDs. An overlapping download for the following month gives the same IDs for the days that overlap, so those rows are skipped on import, which is the behaviour you want.
  • Why the ordinal counts only identical twins. Counting position within the day looks equivalent and is not. A bank that late-posts one transaction into a day you already downloaded would shift the position of everything after it that day, change their IDs, and import every one of them twice. Counting only among identical transactions means a late arrival can change nothing but its own twin's ID, and twins are interchangeable.
  • What this cannot survive. If the bank revises a description after posting, cleaning up a merchant name a few days later, the hash changes and that one transaction can import twice. It is uncommon and it is visible in the reconciliation. The tool says so on the page rather than in a footnote.
  • Never: a sequence number. A converter that numbers rows 1, 2, 3 produces IDs that collide between files and across months, and the duplicate protection stops being protection. This is the defect to check for in any converter, including the ones that charge.

Payee names are read short

The payee field is read as a short string, so a long description is cut. Lose the wrong end and AMAZON WEB SERVICES AWS and AMAZON MKTPLACE PMTS can arrive as the same payee, which makes a vendor rule fire on the wrong transactions. The converter truncates at a stated point, keeps the full original in the memo, and shows you the result before you download. The memo field holds far more, so nothing is lost, only moved.

Signs and types

In OFX, money out of the account is a negative TRNAMT. Money in is positive. For a credit card the convention inverts in a way that catches people out: a purchase increases what you owe but is still negative in the statement file, and a payment to the card is positive.

TRNTYPE is informational. QuickBooks uses it to style the row and to set the check number behaviour, and it does not change the amount. Guessing it from description text is tempting and gets things wrong, so the default is DEBIT or CREDIT from the sign, with CHECK set only where you actually mapped a check number column.

Dates

DTPOSTED carries a timestamp. Written without a time zone and read in a different one, a transaction can land on the day before or the day after, which puts it in the wrong month end and breaks the tie-out for two periods instead of none. The converter writes noon with an explicit offset, GMT unless you set another, so a transaction stays on its date in any time zone within eleven hours of it.

Why not just upload the CSV

Three answers, depending on which QuickBooks you run.

  • QuickBooks Desktop and Enterprise do not import bank transactions from CSV at all. Web Connect is the supported route, which is why converters exist for this at all rather than being a convenience.
  • QuickBooks Online does accept CSV, in a three or four column shape, under a file size cap, which a full month of a busy operating account will exceed.
  • A CSV import carries no transaction IDs, so nothing stops a second import of an overlapping range from posting everything again. The duplicate protection is the format, not the software.

If your bank offers Web Connect directly, use it and skip this page. Most commercial and treasury portals do not, which is the situation this tool is for.

Worked example

The sample the tool loads, and the fixture its tests assert every figure in this section against. Every company, account and number is invented, and the routing number starts 99, a prefix assigned to no institution.

Meridian Components runs its operating account with a commercial bank whose treasury portal exports CSV and offers no Web Connect feed. September has to be in QuickBooks by the fourth working day.

What the portal gave them. Two lines of preamble and a blank line above the header, which the tool skipped to find the header on row 4:

Posting DateTransaction DetailDebit AmountCredit AmountBalanceReferenceCk No
09/01/2026ACH CREDIT CASTELLAN FOODS CORP REMIT 8821342315.00410415.0020260901AB7741
09/01/2026ACH DEBIT ADP PAYROLL FEES1284.50409130.5020260901AB7778
09/02/2026ACH DEBIT MIDWEST POLYMER SUPPLY CO INV 4482118420.00390710.5020260902AB7815
09/03/2026ACH CREDIT JOHNSON & SONS DISTRIB INV 771212880.40403590.9020260903AB7852
09/04/2026CHECK PAID2145.60401445.3020260904AB788910447

Twenty-eight transactions in all, then a footer line reading Ending balance with no date.

What the tool decided, and showed them before they confirmed. Every column mapped from its header: debit and credit as two columns, so the sign convention was settled by the file itself; Reference as the transaction ID, the good case, because the IDs are the bank's own; Ck No as the check number; Balance as a running balance. Account type Checking. Opening balance 368,100.00 and closing balance 436,241.01, typed off the statement PDF.

What the pre-flight check said.

Ties out to the statement PASS 368,100.00 + 68,141.01 = 436,241.01 Running balance is continuous PASS all 28 balances follow, oldest first 28 of 29 rows converted INFO row 33 has no date: the footer Net 68,141.01 INFO in 543,152.09, out 475,011.08 Every date inside the period PASS 2026-09-01 to 2026-09-30 1 repeated transaction FLAG rows 11 and 13 28 unique IDs from the reference PASS Routing number is valid PASS

The one flag. Two rows on September 4, each WIRE FEE for 35.00. Real: two outgoing wires went that day and each carried a fee. The flag exists so the accountant looks, not so the tool decides, and each fee still gets its own transaction ID so both import. Two invoices to the same vendor for the same amount on different dates are a different question, and the one the duplicate payment detector exists for.

What the first attempt got wrong. The first download tied out 41,030.50 short. The portal had defaulted to a September 2 start and dropped both September 1 rows, the 42,315.00 credit and the 1,284.50 debit. The running balance check passed, because a missing first row leaves nothing out of sequence; only the statement's opening balance could see it. Without the tie-out that file would have imported cleanly, reconciled short, and cost someone an afternoon in October looking for two transactions nobody knew were missing.

Two of the transactions as they came out:

<STMTTRN> <TRNTYPE>DEBIT <DTPOSTED>20260902120000[0:GMT] <TRNAMT>-18420.00 <FITID>20260902AB7815 <NAME>ACH DEBIT MIDWEST POLYMER SUPPLY <MEMO>ACH DEBIT MIDWEST POLYMER SUPPLY CO INV 44821 </STMTTRN> <STMTTRN> <TRNTYPE>CHECK <DTPOSTED>20260904120000[0:GMT] <TRNAMT>-2145.60 <FITID>20260904AB7889 <CHECKNUM>10447 <NAME>CHECK PAID <MEMO>CHECK PAID </STMTTRN>

The payee was cut at thirty-two characters and the full detail kept in the memo, so the invoice number survives for whoever reconciles it. The ampersand in JOHNSON & SONS is written as &amp;, which is the escaping that, missed, makes a converted file unreadable.

What this does not do

This tool converts a file. It does not fetch anything from your bank, categorise transactions, assign accounts, create journal entries, or reconcile anything. It cannot read PDF or scanned statements. It does not check the file against your QuickBooks, so it cannot know whether a transaction is already posted or whether the account ID matches a register you already have. The balance tie-out proves the file is complete against the balances you typed, and nothing more: a wrong balance ties out to a wrong file. If your bank offers Web Connect directly, that feed is better than any conversion, including this one.

Questions

The best conversion is
the one you stop doing.

Connect the account once and the transactions arrive with prior months already loaded, categorised with the reason shown and nothing applied until your team accepts it, reconciled to the balance your bank asserted. QuickBooks stays the system of record.