Bank Statement PDF to QBO — QuickBooks Web Connect

QuickBooks will not import a PDF. It imports Web Connect files, and this produces one from your statement — with the sign-on block QuickBooks expects and a unique identifier on every transaction.

A QuickBooks Web Connect file, with a unique FITID on every transaction.

Every FITID is unique

QuickBooks discards a repeated FITID without saying so, which turns two identical amounts on the same day into one. Each identifier here is derived from the date, narration, amount and position, so duplicates cannot collide.

Dates in the only shape it reads

DTPOSTED as YYYYMMDD. A date QuickBooks cannot parse does not raise an error — the transaction simply is not there afterwards.

Signs from the bank's own columns

Whether an amount is a debit or a credit comes from the column the bank put it in, confirmed against the running balance.

What the QBO file contains

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

On the statementIn the QBOHow
Date<DTPOSTED>Written YYYYMMDD. Whether 04/05 is April or May is read off the whole column: a date such as 04/13 settles it.
Withdrawals, Deposits<TRNAMT>One signed figure, money out negative, by the column the bank printed it in and the running balance beside it.
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 printed on the latest-dated row, dated that day.
Currency symbol or code<CURDEF>The currency the statement prints. USD when it prints none.
Opening balance lineNothingIt moves no money, so it is not a transaction.
Not on a statement<FITID>24 characters made from each row's date, description, amount and position: the same every time, and different for two identical rows.
Not on a statement<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. QuickBooks refuses a Web Connect file with none.

Sample output

Made by this converter's own code from a made-up statement table like the one the PDF reader produces. The output is the file it writes, not retyped.

The input: Statement table

A made-up US statement table, as the PDF reader hands it to the file writer. Reading the PDF itself is not part of this sample.

Date        Description                          Withdrawals  Deposits  Balance
03/01/2026  Beginning Balance                                           1,204.33
03/02/2026  EXAMPLE CO PAYROLL DIRECT DEP                     2,500.00  3,704.33
03/09/2026  SAMPLE COFFEE ROASTERS               4.75                   3,699.58
03/09/2026  SAMPLE COFFEE ROASTERS               4.75                   3,694.83
03/16/2026  MADE-UP POWER & LIGHT CO ONLINE PMT  126.40                 3,568.43

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>CREDIT</TRNTYPE><DTPOSTED>20260302</DTPOSTED><TRNAMT>2500.00</TRNAMT><FITID>C1312B05E2C445B335B4E5EE</FITID><NAME>EXAMPLE CO PAYROLL DIRECT DEP</NAME></STMTTRN>
<STMTTRN><TRNTYPE>DEBIT</TRNTYPE><DTPOSTED>20260309</DTPOSTED><TRNAMT>-4.75</TRNAMT><FITID>E2B2CC1AF95CFE7B3F5CE78F</FITID><NAME>SAMPLE COFFEE ROASTERS</NAME></STMTTRN>
<STMTTRN><TRNTYPE>DEBIT</TRNTYPE><DTPOSTED>20260309</DTPOSTED><TRNAMT>-4.75</TRNAMT><FITID>63902FAED21809670045EE82</FITID><NAME>SAMPLE COFFEE ROASTERS</NAME></STMTTRN>
<STMTTRN><TRNTYPE>DEBIT</TRNTYPE><DTPOSTED>20260316</DTPOSTED><TRNAMT>-126.40</TRNAMT><FITID>0DEFDDFCD2E026AB99D1FC17</FITID><NAME>MADE-UP POWER &amp; LIGHT CO ONLINE</NAME><MEMO>MADE-UP POWER &amp; LIGHT CO ONLINE PMT</MEMO></STMTTRN>
</BANKTRANLIST><LEDGERBAL><BALAMT>3568.43</BALAMT><DTASOF>20260316</DTASOF></LEDGERBAL>
</STMTRS></STMTTRNRS></BANKMSGSRSV1></OFX>

Questions about converting a statement to QBO

Why convert to QBO instead of uploading the PDF to QuickBooks?

QuickBooks Desktop does not read PDF statements. QuickBooks Online can read one with its own AI extraction, which you then check line by line. A QBO carries the figures as the statement printed them, checked here against its running balance first, with an id on every transaction so a repeated import is recognised.

How do I import the QBO file into QuickBooks?

In QuickBooks Online, choose Upload from file on the bank transactions screen, pick the file, then the account. In QuickBooks Desktop, use File, Utilities, Import, Web Connect Files. Both show the transactions for review before anything is added.

Will two identical transactions on the same day both import?

Yes. Each one gets its own FITID, made partly from its position on the statement, so two coffees for the same amount on the same day stay two. QuickBooks drops a repeated FITID without saying so.

What if the statement does not reconcile?

Press Verify transactions under the preview and it names the rows whose figures do not explain the movement in the printed balance, before you download. The QBO carries the figures as printed; nothing is changed to make it balance.

Related guides