How to convert a CSV to QBO (step by step)

A QBO file is just an OFX document wearing a QuickBooks-specific extension. So "converting CSV to QBO" really means taking the flat rows your bank exports (date, description, amount) and re-encoding them into the OFX 1.0.2 SGML structure that QuickBooks expects, with the right headers, a transaction list, and a unique ID on every line. Get that structure right and QuickBooks imports the file cleanly through File > Utilities > Import > Web Connect; get it wrong and you see "unable to verify the Financial Institution" or a file-not-recognized error.

This guide walks through the whole process: how to clean and map your CSV columns, what a valid QBO file actually contains, how to generate one (by hand or with a converter), and how to import it into QuickBooks Desktop or QuickBooks Online without creating duplicates. You can do every step manually, but if you would rather skip the SGML, you can drop your CSV into the LedgerBridge converter, map your columns, and download a ready-to-import QBO file in your browser. Either way, the goal is the same: a file QuickBooks recognizes on the first try.

Step 1: Clean and prepare your CSV

Before any conversion, open your exported CSV and make sure it contains three things QuickBooks cares about: a transaction date, a description (payee or memo), and a signed amount. Most banks already export these, but the column names and formats vary wildly, so a little cleanup prevents most downstream errors.

Watch the amount column especially. Some banks use a single signed column where debits are negative and credits positive; others split money into separate Debit and Credit columns. QuickBooks needs one signed number per transaction, where money leaving the account is negative. If your bank uses two columns, you will combine them in the mapping step. Also confirm dates are unambiguous: 03/04/2026 is read differently in MM/DD/YYYY vs DD/MM/YYYY, so know your bank's locale or convert dates to an ISO-style format first.

Finally, strip anything that is not a transaction: running-balance rows, summary lines, blank rows, and currency symbols or thousands separators inside the amount field. A clean CSV with consistent columns is the single biggest factor in a successful import.

  • Keep one row per transaction (no balance or summary rows)
  • Have a clear date column with a known format (MM/DD/YYYY vs DD/MM/YYYY)
  • Use one signed amount, or a separate Debit and Credit pair you can merge
  • Remove currency symbols, commas inside numbers, and trailing blank lines
  • Note your account number and bank name for the file headers

Step 2: Map CSV columns to OFX fields

A QBO file is structured data, so every CSV column has to map to a specific OFX field. At minimum you map your date column to DTPOSTED, your amount to TRNAMT, and your description to NAME and/or MEMO. You also decide a transaction type (TRNTYPE) such as DEBIT or CREDIT, which a converter can infer automatically from the sign of the amount.

The field that trips people up is FITID, the Financial Institution Transaction ID. Every transaction in a QBO file needs a FITID that is unique within the account, because QuickBooks uses it to prevent duplicate imports. If your bank CSV includes a transaction reference or check number, that makes an ideal FITID. If it does not, you must generate stable, deterministic IDs (for example a hash of date + amount + description) so re-importing the same period does not create duplicates and does not collide.

In LedgerBridge you do this visually: drop your CSV in, and it auto-detects the date, amount, and description columns, lets you confirm or remap them, and generates consistent FITIDs for you. Doing it by hand is fine too, as long as you keep the mapping consistent every time you export from the same account.

  • DTPOSTED - the posting date (format YYYYMMDD, optionally with time)
  • TRNAMT - the signed amount (negative for money out)
  • TRNTYPE - DEBIT or CREDIT, usually derived from the amount sign
  • NAME / MEMO - the payee and any extra description text
  • FITID - a unique, stable per-transaction ID for dedup

Step 3: Generate the QBO (OFX 1.0.2 SGML) file

QBO files are not XML. They use OFX version 1.0.2, which is SGML-based, so leaf tags like <FITID>12345 do not need closing tags, while container tags such as <BANKTRANLIST>...</BANKTRANLIST> do. The file starts with a plain-text SGML header block, then an OFX body containing your bank account details and the transaction list.

The header block looks like the lines below, followed by a <SIGNONMSGSRSV1> sign-on section and a <BANKMSGSRSV1> section with your account number, account type, date range, and the transactions. Inside the sign-on, QuickBooks expects an <INTU.BID> tag (the Intuit Bank ID) identifying the financial institution; if it is missing or does not match a known institution, QuickBooks Desktop can reject the file with 'unable to verify the Financial Institution.' A generic but accepted INTU.BID, plus a matching <FI> block, is what lets a converted file import as a Web Connect file.

Each transaction sits in its own <STMTTRN>...</STMTTRN> block with TRNTYPE, DTPOSTED, TRNAMT, FITID, NAME, and optionally MEMO. Writing this by hand is doable for a few rows but error-prone at scale, which is exactly what a converter automates. LedgerBridge builds the full OFX 1.0.2 structure, sets a working INTU.BID, and writes one STMTTRN per row, then hands you the .qbo file to download. Everything runs in your browser, so the CSV never leaves your machine.

  • OFXHEADER:100 / DATA:OFXSGML / VERSION:102
  • SECURITY:NONE / ENCODING:USASCII / CHARSET:1252
  • SIGNONMSGSRSV1 with FI and INTU.BID identifying the institution
  • BANKMSGSRSV1 > STMTRS with BANKACCTFROM (account number + ACCTTYPE)
  • BANKTRANLIST with one STMTTRN per transaction (FITID required)

Step 4: Import the QBO file into QuickBooks

For QuickBooks Desktop, use the Web Connect importer: open your company file, then go to File > Utilities > Import > Web Connect Files, browse to your .qbo, and select it. QuickBooks will ask you to link the file to an existing bank account or create a new one. On a successful import, transactions land in the bank feed (or register, depending on your bank-feed mode) ready to review and match.

For QuickBooks Online, go to Transactions (or Banking) > the relevant account > Link account / Upload from file, and choose your .qbo (Web Connect) file. QBO will map it to an account and import the transactions for review. Note that QuickBooks Online enforces practical limits: bank-feed style imports generally bring in about 90 days of history, and the manual upload path caps each file at roughly 1,000 transactions, so split long histories into multiple files by date range.

After import, review the transactions in the For Review tab, accept or categorize them, and reconcile as usual. If anything looks off, the cause is almost always the file structure or the FITID handling, which the next section covers.

  • Desktop: File > Utilities > Import > Web Connect Files, then link to an account
  • Online: Transactions/Banking > account > Upload from file, choose the .qbo
  • QBO Online: ~1,000 transactions per upload, ~90 days for connected feeds
  • Split large date ranges into multiple files to stay under limits
  • Review and categorize in For Review before reconciling

Step 5: Avoid duplicates and re-import safely

Duplicate transactions are the most common complaint after a CSV-to-QBO import, and they almost always come down to FITID. QuickBooks treats FITID as the unique key per account: if you re-import a file and a transaction carries a FITID it has already seen, QuickBooks skips it. If your converter regenerates different FITIDs each run, the same transactions reappear as duplicates.

The fix is deterministic FITIDs. Whatever method you use, the same source row must always produce the same FITID. Using the bank's own transaction reference is best; when that is unavailable, a stable hash of date, amount, and description works well and survives re-exports. LedgerBridge generates consistent FITIDs from your rows for this reason, so importing an overlapping date range twice will not double up matched transactions.

If you do end up with duplicates, the safest cleanup is to undo or delete the imported batch from the bank feed before re-importing a corrected file, rather than deleting individual register entries that may already be reconciled.

  • Keep FITIDs deterministic so re-imports dedup correctly
  • Prefer the bank's reference/check number as the FITID source
  • If unavailable, hash date + amount + description for stability
  • To redo an import, undo the batch in the bank feed first
  • Avoid overlapping date ranges unless your FITIDs are stable

Convert your CSV now →

Frequently asked questions

Can I just rename a CSV to .qbo and import it?

No. A QBO file is an OFX 1.0.2 SGML document with required headers, a sign-on block, an INTU.BID, and structured transaction tags. A CSV is plain comma-separated rows. Renaming the extension does not add that structure, so QuickBooks will reject it or show a file-not-recognized error. You have to actually convert the data into the OFX format.

What is INTU.BID and why does QuickBooks need it?

INTU.BID is the Intuit Bank ID, a number inside the QBO file that identifies the financial institution to QuickBooks. QuickBooks Desktop's Web Connect importer checks it; if it is missing or unrecognized you get 'unable to verify the Financial Institution.' A converter includes a working INTU.BID and a matching FI block so the file imports as a valid Web Connect file.

How does FITID prevent duplicate transactions?

FITID is a unique ID on each transaction. QuickBooks remembers the FITIDs it has imported per account, so when you import a file again it skips any transaction whose FITID it has already seen. The catch is that FITIDs must be deterministic: the same source row should always produce the same FITID, otherwise re-imports create duplicates.

Are there limits on how many transactions I can import?

QuickBooks Online's manual file upload generally caps each file at about 1,000 transactions, and connected bank feeds typically pull around 90 days of history. For long histories, split your CSV into multiple QBO files by date range. QuickBooks Desktop is more forgiving on file size but still benefits from reasonable batches.

Is it safe to convert bank data online?

It depends on the tool. Many web converters upload your file to a server. LedgerBridge runs entirely in your browser, so your CSV is parsed and converted locally on your machine and never uploaded, which keeps the bank data private while still giving you a downloadable QBO file.

Related guides

Not affiliated with Intuit/QuickBooks/Quicken/Xero. LedgerBridge is a file-conversion utility, not financial advice.