Skip to main content
BankFlow logoBankFlow

Bank statement to OFX

An OFX file your ledger already reads.

Convert a PDF bank statement into a plain OFX document with no Intuit header and no partner ID: the file Xero, GnuCash, and Moneydance import directly.

50 free page credits · No card · Cancel anytime

  • OFX 1.02 SGML
  • FITIDs for de-duplication
  • No Intuit header

Export transactions

1,284 rows

Format

CSVExcelJSONOFXQuickBooks
DateDescriptionAmount
2025-10-24STRIPE PAYOUT 4af2c9+4,820.00
2025-10-23AWS EMEA SARL−1,204.00
2025-10-22WHOLE FOODS MKT−112.88
1,284 rows · 3 columnsExport OFX

PDF statement you upload

scanned_statement_047.pdfUnstructured

24/10 STRIPE PAYOUT 4af2c9........4,820.00

23-10 AWS EMEA SARL us-east-1 1,204.00-

22 OCT WHOLE FOODS MKT #214 112.88

21/10 UBER *TRIP..............24.40

20-OCT-2025 GUSTO PAY 9931 18,440.00

[illegible: scan quality]

OFX file you download

transactions_oct.ofxOFX / QBO

<STMTTRN>

<TRNTYPE>CREDIT

<DTPOSTED>20251024

<TRNAMT>4820.00

<NAME>Stripe

<MEMO>STRIPE PAYOUT 4af2c9

</STMTTRN>

<STMTTRN>

<TRNTYPE>DEBIT

<DTPOSTED>20251023

<TRNAMT>-1204.00

<NAME>Amazon Web Services

<MEMO>AWS EMEA SARL us-east-1

</STMTTRN>

… 3 more transactions

Import in Xero, GnuCash, or Moneydance as an OFX file
A statement PDF in, an OFX ledger out: one <STMTTRN> block per transaction, typed and signed. Illustrative data.

OFX and QBO are the same format wearing different badges.

A .qbo file is an OFX document with an Intuit web-connect header stapled to the front, which is why QuickBooks accepts it and other software often does not. Point that same file at Xero or GnuCash and the header is noise; point a plain OFX file at Quicken and it is rejected for the opposite reason: Quicken checks for an institution identifier that only an Intuit partner can issue. So the question is never really "OFX or QBO", it is which of the two your software was built to open.

How it works

From PDF to OFX, screen by screen

  1. 01

    Upload the PDF

    Drag in the statement: scanned, multi-page, and password-protected PDFs all work, up to 50 MB each.

    BankFlow dashboard with the empty state offering a statement upload or an email import address.
    Drop the file in, forward the bank's email to your private import address, or post it to the API.
  2. 02

    Confirm the import

    Review the queued file and set whether statements carrying warnings still count in your analytics. Nothing is read until you confirm.

    Import dialog with chase.pdf selected, the warning policy listed, and an Import button.
    The warning types that will still count toward analytics are named before anything is extracted.
  3. 03

    Let it parse and reconcile

    Transactions are extracted, the bank is detected, and the opening and closing balances are checked against the rows, because an OFX file with a missing page reconciles wrong in whatever opens it.

    Activity panel showing a Chase statement processing, with the current stage and elapsed time.
    The activity panel names the stage and the seconds elapsed as the statement moves through the queue.
  4. 04

    Fix anything before it hardens

    A description you correct here is the description the OFX carries. Edit in place or across a shift-clicked range, and turn a repeated fix into a rule so the next month arrives right.

    Three transactions selected, with the Actions menu open on the category picker.
    Three rows selected, one menu: category, tags, merchant, flag, or exclude from analytics.
  5. 05

    Export OFX

    Pick OFX rather than QuickBooks and the file comes out as plain OFX 1.02: the same reviewed rows, without the Intuit header.

    Export dialog with OFX selected, the field list on the right, and a live preview of the rows.
    OFX and QuickBooks sit side by side in the format list. Same data, different header, different software.

What ends up inside the file

OFX 1.02 SGML, not XML

The 1.02 SGML profile most desktop finance software still expects: unclosed tags, the OFX header block, and a single <STMTTRN> per transaction.

No Intuit header

The web-connect header and INTU.BID that make a file a .qbo are left off. That is the whole difference, and it is why non-Intuit software opens this one.

FITIDs on every transaction

A stable identifier per row, so re-importing an overlapping month adds what is new instead of doubling what you already had.

TRNTYPE and signs that agree

Debits negative, credits positive, and a TRNTYPE that matches the sign, so the importing ledger does not have to guess direction from the description.

Full descriptions preserved

NAME carries the resolved merchant and MEMO carries the original narration, so nothing is thrown away to fit a short field.

Export only what you scoped

Filter to one account, one month, or one category and the OFX contains those rows, not the whole database every time.

Which file does your software want?

All three are the same format underneath. What differs is the header, and which programs check for it.

SoftwareFile it accepts
XeroOFX. Xero imports OFX, QIF, and CSV, and recommends OFX where the bank offers it.
GnuCashOFX, via File → Import → Import OFX/QFX transactions.
MoneydanceOFX. It also reads QFX, OFC, and QIF.
QuickBooks Online and DesktopQBO: OFX plus the Intuit web-connect header. Use the QBO export instead.
QuickenQFX only. Quicken verifies an institution identifier issued to Intuit partners, so a plain OFX file will not import.

FAQ

Common questions

What is an OFX file?

Open Financial Exchange is the interchange format banks and finance software use for transaction data. An OFX file is a text document containing one <STMTTRN> block per transaction, each carrying a date, an amount, a type, and an identifier.

What is the difference between OFX and QBO?

A .qbo file is an OFX document with an Intuit web-connect header and a bank identifier added at the top. The transactions inside are identical. QuickBooks requires the header; most other software either ignores it or refuses the file because of it.

Can I import a plain OFX file into Quicken?

No. Quicken expects QFX, which is OFX plus an institution identifier issued to Quicken partner banks, and it verifies that identifier when the file is opened. If Quicken is the destination, the file has to come from a participating institution rather than from a converter.

Will re-importing the same month create duplicates?

Every transaction carries a FITID, the field OFX defines for exactly this. Software that honours it (Xero, GnuCash, and Moneydance among them) matches on that identifier and skips rows it already has.

Does it work with scanned statements?

Yes. Scanned PDFs go through OCR before parsing, and multi-page and password-protected files are supported up to 50 MB each.

Should I categorize before exporting?

Categories are not part of the OFX schema, so they do not travel in the file. What does travel is the description, the merchant name, and the sign, so it is worth correcting those here, where bulk editing is fast, before the file leaves.

Converting a statement from a specific bank?

Written up for the format each of these banks prints.

Take the file, not the header.

Upload a statement, check the rows, and download plain OFX for whatever you actually keep your books in.