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
| Date | Type | Payee | Amount | Transaction ID |
|---|---|---|---|---|
| 2026-09-01 | CREDIT | ACH CREDIT CASTELLAN FOODS CORP | 42,315.00 | 20260901AB7741 |
| 2026-09-01 | DEBIT | ACH DEBIT ADP PAYROLL FEES | -1,284.50 | 20260901AB7778 |
| 2026-09-02 | DEBIT | ACH DEBIT MIDWEST POLYMER SUPPLY | -18,420.00 | 20260902AB7815 |
| 2026-09-03 | CREDIT | ACH CREDIT JOHNSON & SONS DISTRI | 12,880.40 | 20260903AB7852 |
| 2026-09-04 | CHECK | CHECK PAID | -2,145.60 | 20260904AB7889 |
| 2026-09-04 | DEBIT | OUTGOING WIRE ARGENT TOOLING GMB | -31,750.00 | 20260904AB7926 |
| 2026-09-04 | DEBIT | WIRE FEE | -35.00 | 20260904AB7963 |
| 2026-09-04 | DEBIT | OUTGOING WIRE NORTHBAY FREIGHT L | -9,400.00 | 20260904AB8000 |
| 2026-09-04 | DEBIT | WIRE FEE | -35.00 | 20260904AB8037 |
| 2026-09-08 | CREDIT | WIRE IN KESTREL INDUSTRIAL HOLDI | 96,500.00 | 20260908AB8074 |
| 2026-09-09 | DEBIT | ACH DEBIT CENTERPOINT ENERGY | -6,212.33 | 20260909AB8111 |
| 2026-09-10 | CHECK | CHECK PAID | -975.00 | 20260910AB8148 |
| 2026-09-11 | DEBIT | ACH DEBIT PAYROLL MERIDIAN COMPO | -148,226.18 | 20260911AB8185 |
| 2026-09-11 | CREDIT | TRANSFER FROM SWEEP XX9902 | 120,000.00 | 20260911AB8222 |
| 2026-09-14 | CREDIT | ACH CREDIT HALVERSON MACHINE WOR | 27,604.00 | 20260914AB8259 |
| 2026-09-15 | DEBIT | ANALYSIS SERVICE CHARGE | -388.12 | 20260915AB8296 |
| 2026-09-16 | DEBIT | ACH DEBIT AMERICAN EXPRESS CORP | -22,918.47 | 20260916AB8333 |
| 2026-09-17 | CHECK | CHECK PAID | -4,410.00 | 20260917AB8370 |
| 2026-09-18 | CREDIT | ACH CREDIT CASTELLAN FOODS CORP | 38,790.25 | 20260918AB8407 |
| 2026-09-21 | DEBIT | ACH DEBIT UNITED HEALTHCARE PREM | -18,906.00 | 20260921AB8444 |
| 2026-09-22 | DEBIT | ACH DEBIT IRS USATAXPYMT EFTPS | -41,337.92 | 20260922AB8481 |
| 2026-09-23 | CREDIT | ACH CREDIT DELACROIX AUTOMATION | 15,250.00 | 20260923AB8518 |
| 2026-09-24 | DEBIT | ACH DEBIT PAYROLL MERIDIAN COMPO | -149,018.66 | 20260924AB8555 |
| 2026-09-24 | CREDIT | TRANSFER FROM SWEEP XX9902 | 135,000.00 | 20260924AB8592 |
| 2026-09-25 | DEBIT | ACH DEBIT CINTAS CORP 2 | -1,128.30 | 20260925AB8629 |
The first 25 of 28. Every one is in the file.
Download
Related reading
What happens to the transactions after they reach QuickBooks, and what it takes to stop converting files at all.
- Glossary
Bank Reconciliation
A bank reconciliation explains the difference between the cash balance in the general ledger and the balance on the bank statement at a point in time, identifying timing differences, bank-only items, and errors, and adjusting the ledger for what belongs in it.
- Glossary
General Ledger
The general ledger is the master record of an entity's accounts, holding every posted debit and credit by account and period. Subledgers feed it, the chart of accounts defines its structure, and the trial balance is its summary.
- Glossary
Audit Trail
An audit trail is the chronological record of who did what, when, to which record, and with what values before and after. It is what makes a reported balance traceable to its source and what makes any process, human or automated, reviewable after the fact.
- Integration
QuickBooks
QuickBooks is a cloud-based accounting platform that enables businesses to manage finances, track income and expenses, and gain real-time insights into their financial performance.
- Use case
Bank Reconciliation
- Guide
Account Reconciliation
- Free tool
Duplicate Payment Detector
- Free tool
B2B Invoice Generator
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 Date | Transaction Detail | Debit Amount | Credit Amount | Balance | Reference | Ck No |
|---|---|---|---|---|---|---|
| 09/01/2026 | ACH CREDIT CASTELLAN FOODS CORP REMIT 88213 | 42315.00 | 410415.00 | 20260901AB7741 | ||
| 09/01/2026 | ACH DEBIT ADP PAYROLL FEES | 1284.50 | 409130.50 | 20260901AB7778 | ||
| 09/02/2026 | ACH DEBIT MIDWEST POLYMER SUPPLY CO INV 44821 | 18420.00 | 390710.50 | 20260902AB7815 | ||
| 09/03/2026 | ACH CREDIT JOHNSON & SONS DISTRIB INV 7712 | 12880.40 | 403590.90 | 20260903AB7852 | ||
| 09/04/2026 | CHECK PAID | 2145.60 | 401445.30 | 20260904AB7889 | 10447 |
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 &, 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
Yes. No sign-up, no page or transaction limit, no watermark, and no gate on any export.
No. The conversion happens in the page you are looking at. There is no server, no account, and no analytics event that carries anything from your file. The page works offline, which is the only proof of this claim worth anything: disconnect your network and convert.
QuickBooks Desktop and Enterprise take Web Connect files through the bank feeds import. QuickBooks Online takes an uploaded .QBO on the banking screen. Older QuickBooks versions stop accepting Web Connect files once Intuit discontinues service for them, so a file that will not import into a several-year-old install is usually the install, not the file.
QuickBooks Desktop and Enterprise do not accept CSV for bank transactions. QuickBooks Online does, but only in a stripped three or four column shape, under a file size cap, and with nothing to stop a second import of the same range posting everything twice. The .QBO format carries a unique ID per transaction, which is what prevents that.
Every transaction gets a unique ID, and QuickBooks skips any ID it has already seen for that account. If your bank's export has its own reference column, map it and the IDs are the bank's own. Otherwise the tool derives one that stays the same every time you convert the same transaction, so overlapping downloads are safe.
The financial institution ID, `INTU.BID`, in the account section. It tells QuickBooks which bank the file claims to be from, and QuickBooks rejects values it does not recognise. The field is prefilled with a generic value that is widely accepted. Changing it does not alter a single transaction.
One account per file. Convert each account's export in turn, and save a mapping profile after the first one: next month, loading it maps the same bank's file in one step. Each account needs its own account ID, and that ID has to stay the same from month to month so QuickBooks puts the file in the same register.
The sign convention. Banks disagree about whether money leaving the account is a negative amount, a positive one, a separate debit column, or a `DR` in a type column. Pick the right one in step 3 and the preview will label the three largest transactions as money in or money out in words, so you can see it is right before you download.
No. This tool takes a file that already has rows and columns: CSV or TSV. For an Excel file, save it as CSV first. Reading a PDF statement is a different job that needs extraction rather than conversion.
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.