If you have ever helped a small business owner or bookkeeper import bank statements into QuickBooks, you have probably run into a surprisingly stubborn wall:
- QuickBooks Online and Desktop frequently reject
.QBOor.QFXfiles withError OL-222or"Unable to verify the Financial Institution". - Native 3-column CSV imports strip out Check Numbers (
CHECKNUM), break on multi-line bank summary headers (like Chase or Wells Fargo), and reverse credit card charges on Amex/Citi exports. - Sunsetted QuickBooks Desktop editions (2018–2023) block Web Connect (
.QBO) entirely, forcing bookkeepers to use legacy double-entry.IIFfiles or pay $150–$299/year for old desktopCSV2QBOconverter tools.
While building a 100% client-side CSV to .QBO converter that runs entirely in browser memory (zero server uploads), I had to dig through the actual OFX 1.02 SGML and Intuit .IIF specifications. Here are the exact format quirks that cause QuickBooks imports to fail—and how to fix them cleanly.
1. What actually causes QuickBooks Error OL-222?
Despite the .qbo extension, a QuickBooks Web Connect file is an OFX 1.02 SGML document (not strict XML) with an Intuit-specific <INTU.BID> tag injected inside the <SONRS> sign-on block.
Three small syntax issues trigger OL-222 or OL-301 almost every time:
- Unescaped ampersands (
&) in merchant names: A raw payee likeAT&TorMARKS & SPENCERinside<NAME>or<MEMO>breaks QuickBooks' SGML parser unless escaped as&. - Missing or Quicken-only
<INTU.BID>: When you download a.QFXfile from a bank or try to convert from Quicken to QuickBooks (.QFX / .OFX to .QBO), renaming.qfxto.qbofails because QuickBooks validates the<INTU.BID>institution code against its internal whitelist (code3000is universally accepted across both QuickBooks Online and supported Desktop editions). - Field length truncation: The OFX 1.02 spec limits
<NAME>to 32 characters and<MEMO>to 255 characters. Leaving long bank descriptions inside<NAME>either truncates vendor names mid-word or trips older Desktop parsers.
OFXHEADER:100 DATA:OFXSGML VERSION:102 SECURITY:NONE ENCODING:USASCII CHARSET:1252 COMPRESSION:NONE OLDFILEUID:NONE NEWFILEUID:NONE <OFX> <SIGNONMSGSRSV1> <SONRS> <STATUS><CODE>0<SEVERITY>INFO</STATUS> <DTSERVER>20261108120000[0:GMT] <LANGUAGE>ENG <INTU.BID>3000 </SONRS> </SIGNONMSGSRSV1> 2. Preserving Check Numbers and fixing reversed Credit Card polarity
When a bookkeeper uses QuickBooks' built-in 3-column CSV upload (Date, Description, Amount), QuickBooks drops the Check Number column completely.
By converting the CSV into a structured .QBO <STMTTRN> block instead:
- Check serials map directly into
<CHECKNUM>with<TRNTYPE>CHECK. - Clean 32-character vendor names go into
<NAME>, while the full 255-character raw description stays intact inside<MEMO>. - If an Amex or Capital One CSV exports credit card purchases as positive numbers (
+42.50) and payments as negative numbers, flipping the sign polarity before emitting<CREDITCARDMSGSRSV1>prevents purchases from importing backwards as payments.
3. Bypassing the 3-year Web Connect sunset on QuickBooks Desktop with balanced .IIF
Intuit disables .QBO Web Connect Bank Feeds on QuickBooks Desktop after 3 years (affecting Desktop 2018–2023). However, File → Utilities → Import → IIF Files remains a built-in offline Desktop importer.
The catch with .IIF (Intuit Interchange Format) is that it writes directly to the register and requires strict double-entry balance (TRNS + SPL = 0.00) on every single transaction:
!TRNS\tTRNSID\tTRNSTYPE\tDATE\tACCNT\tNAME\tAMOUNT\tDOCNUM\tMEMO !SPL\tSPLID\tTRNSTYPE\tDATE\tACCNT\tNAME\tAMOUNT\tDOCNUM\tMEMO !ENDTRNS TRNS\t1\tCHECK\t10/15/2026\tChase Checking\tOffice Depot\t-142.80\t1042\tOffice supplies SPL\t2\tCHECK\t10/15/2026\tAsk My Accountant\tOffice Depot\t142.80\t1042\tOffice supplies ENDTRNS If TRNS and SPL are off by even a cent, QuickBooks throws "Transaction is not in balance". Routing the offset SPL row to Ask My Accountant (or a Suspense account) using a browser-based CSV & .QBO to .IIF converter keeps the bank register balance 100% accurate immediately while grouping uncategorized items in one place for batch reclassification.
If you need to test a messy statement without uploading client banking data to a third-party server, you can preview all parsed rows and export the first 10 transactions for free at BankFilePro.