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 statement | In the QBO | How |
|---|---|---|
| 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 line | Nothing | It 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.43The 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 & LIGHT CO ONLINE</NAME><MEMO>MADE-UP POWER & 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.