Convert a PDF bank statement to OFX or QIF
Personal finance and accounting apps that can't read a PDF often import OFX or QIF, the file formats banks use for downloads. Cleanrow reads a PDF statement in your browser, checks it against the statement's balances, and writes either one.
What OFX is, and who needs it
OFX (Open Financial Exchange) is a standard file format for bank and card transactions. Many banks offer it as a download, and many finance and accounting apps import it. It carries more than a spreadsheet does: the account, the statement period, the closing balance, and a transaction id for every row, which lets an app skip transactions it has already imported. You need it when an app accepts bank files but not PDFs, and your bank only gives you PDFs for the months you're missing: an old statement, a closed account, or a gap in a bank feed.
Cleanrow writes OFX 2.2, the XML version of the format.
Step by step
- Open the converter and drop the PDF on Drop statements here, or click Choose files.
- Check the banner reads Verified, or fix the rows it points at with Edit (how the check works).
- Check Type. A Bank account becomes a bank statement in the OFX file and a Credit card a card statement; it also decides which way every amount goes.
- Under Download, choose OFX in Format and click Download OFX.
- Import the
.ofxfile into your app, into the account it belongs to, and compare the first rows and the balance with the statement.
What the OFX file looks like
Part of a real export, made by the engine from a made-up test statement (the Copperfield Trust checking account ending 1544, 2025-01-01 to 2025-01-31):
<STMTRS>
<CURDEF>USD</CURDEF>
<BANKACCTFROM>
<BANKID>000000000</BANKID>
<ACCTID>XXXX1544</ACCTID>
<ACCTTYPE>CHECKING</ACCTTYPE>
</BANKACCTFROM>
<BANKTRANLIST>
<DTSTART>20250101120000</DTSTART>
<DTEND>20250131120000</DTEND>
<STMTTRN>
<TRNTYPE>DEBIT</TRNTYPE>
<DTPOSTED>20250101120000</DTPOSTED>
<TRNAMT>-1149.46</TRNAMT>
<FITID>2025010106f199c5</FITID>
<NAME>Check 1650</NAME>
</STMTTRN>
<STMTTRN>
<TRNTYPE>DEBIT</TRNTYPE>
<DTPOSTED>20250101120000</DTPOSTED>
<TRNAMT>-237.18</TRNAMT>
<FITID>2025010133686a0b</FITID>
<NAME>BRIGHTPATH ELECTRIC AUTOPAY WEB </NAME>
<MEMO>BRIGHTPATH ELECTRIC AUTOPAY WEB ID 437965622</MEMO>
</STMTTRN>
…
- Amounts are signed: money out negative, money in positive. On a card, a purchase is negative and a payment positive, which is also how OFX itself defines card amounts.
FITIDis the transaction id. It's made from the row's date, amount and description, so exporting the same statement twice gives the same ids, and an app that skips known ids won't import the rows twice.NAMEholds at most 32 characters, as the OFX specification requires; a longer description goes in full intoMEMO.- The file ends with the statement's closing balance (
LEDGERBAL). On a card statement with transaction and posting dates,DTPOSTEDis the posting date andDTUSERthe transaction date.
QIF instead
QIF (Quicken Interchange Format) is an older plain-text format that some apps still import, especially desktop finance programs. Choose QIF in Format, pick MM/DD/YYYY or DD/MM/YYYY in Date format, and click Download QIF. The first records of the same statement:
!Type:Bank
D01/01/2025
T-1149.46
PCheck 1650
^
D01/01/2025
T-237.18
PBRIGHTPATH ELECTRIC AUTOPAY WEB ID 437965622
^
D01/02/2025
T-169.22
PHEARTH GAS CO AUTOPAY WEB ID 312706058
^
…
Each transaction is a D (date), T (amount), an N (check number) when there is one, a P (payee: the statement's description) and a closing ^. The first line says !Type:Bank or !Type:CCard. QIF has no transaction ids and no account details, so importing the same file twice gives every row twice. Prefer OFX if your app takes both.
Common problems
The app asks which account the file is for
A PDF statement prints only the last digits of the account number and no routing number, so the OFX file carries placeholders: ACCTID is XXXX plus the last four digits and BANKID is zeros. If your app matches files to accounts by those numbers, pick the account by hand the first time.
A savings account shows as checking
Every bank statement is written with ACCTTYPE CHECKING, including savings and money market statements. If your app goes by the account type, choose the account by hand when you import.
"Needs OCR"
A scanned statement has no text to read, and the web converter says so instead of guessing. Cleanrow for Mac, coming to the Mac App Store, reads scans with the text recognition built into macOS.
Two accounts in one PDF
Each account gets its own statement, balance check and OFX file, so each can go into its own account in your app.
Your statement stays on your computer
The OFX or QIF file is built in the browser tab; the PDF is never uploaded, and Cleanrow doesn't connect to your bank or your finance app. The only outside address the page may contact is Polar's license check, when you enter a pass key. See the privacy policy.
Limits
- No
.qfx(Quicken) or.qbo(QuickBooks Web Connect) files: those are OFX variants with extra vendor fields, and Cleanrow doesn't write them. - The files follow the OFX 2.2 and QIF formats, but they haven't been test-imported into specific apps yet. Check your first import.
- PDFs with selectable text only; password-protected PDFs need a copy saved without the password.
- Tested on generated statements in 25 layouts and a few publicly posted sample statements, not yet on statements from customers' banks.
- Your first file downloads free, in every format. After that, a 7-day pass ($12, paid once) covers every statement for seven days.
The 7-day pass isn't on sale yet. Until it is, the free download of your first file works as described.