Skip to main content
BankFlow logoBankFlow

Bank statement to Xero

Get the months your feed never had.

Convert statement PDFs into the OFX file Xero's Import a Statement accepts, so periods from before the feed existed arrive as reconcilable bank statement lines rather than a spreadsheet nobody can tie back.

50 free page credits · No card · Cancel anytime

  • OFX, the format Xero prefers
  • Reconcilable statement lines
  • Whole years at once

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 Xero imports

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 under Accounting › Bank accounts › Import a Statement
A statement PDF in, an OFX ledger out: one <STMTTRN> block per transaction, dated and signed. Illustrative data.

A bank feed starts the day you switch it on.

Everything before that is your problem: the months a client ran before they engaged you, the account that closed in March, the card the feed does not cover at all. Xero will happily import that history, but only as OFX, QIF, or CSV, and what you have is a PDF. So it gets typed in, or it gets left out and the reconciliation never quite closes.

How it works

From statement PDF to Xero, screen by screen

  1. 01

    Upload the statements

    A month or a year at a time: 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 files in, forward the bank's email to a private import address, or post them to the API.
  2. 02

    Confirm the import

    Review what is queued and decide 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 each one reconcile

    Transactions are extracted and checked against the statement's own opening and closing balances. A month that does not tie is flagged here rather than in Xero, where a broken reconciliation is far more expensive to unpick.

    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 each statement moves through the queue.
  4. 04

    Fix descriptions before they travel

    OFX carries the description, not your category, so the narration is what Xero's bank rules will match on. Correct it here, in bulk, where a shift-clicked range is one action.

    Three transactions selected, with the Actions menu open on the category picker.
    Select a range and fix the merchant or the description in one pass, rather than a row at a time.
  5. 05

    Export OFX

    Choose OFX rather than QuickBooks: Xero wants the plain file, without the Intuit web-connect header that makes one a .qbo.

    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. Xero takes the left one.

Once you have the file

Importing the statement into Xero

Xero calls this Import a Statement, and it lives on the bank account itself.

  1. 1

    Open Accounting, then Bank accounts

    Xero's manual import is per account, so pick the account the statement belongs to before importing anything.

  2. 2

    Use the account's menu, then Import a Statement

    The menu icon sits on the bank account's own card rather than in the page header.

  3. 3

    Upload the OFX file

    Xero accepts OFX, QIF, and CSV here, and recommends OFX where the bank offers it, which is what the export gives you.

  4. 4

    Review the lines, then complete the import

    Xero lists what it read and lets you clear anything you do not want before committing. The result is bank statement lines waiting to be reconciled.

Imported lines are statement lines, not transactions. They still need reconciling against bills, invoices, or bank rules, exactly as a feed's lines do.

What makes the import reconcile cleanly

History a feed cannot reach

Feeds begin at connection. Statement PDFs go back as far as the bank keeps them, which is how a mid-year engagement gets a full-year set of books.

The format Xero asks for

Xero imports OFX, QIF, and CSV, and recommends OFX. The export is plain OFX 1.02, no Intuit header, nothing for Xero to reject.

Balance-checked before it leaves

Opening and closing balances are reconciled against the parsed rows, so a missing page shows up as a flag rather than as a reconciliation that will not close.

FITIDs for overlap

Every transaction carries the identifier OFX defines for de-duplication, so an overlapping month adds what is new instead of doubling what is there.

Descriptions bank rules can match

The merchant is resolved out of the raw narration and both travel with the row, which gives Xero's bank rules something consistent to key on.

One account at a time, on purpose

Xero imports per bank account, so filter to one account and one period and export exactly those rows.

What Xero accepts, and what this gives it

Xero's manual import takes three formats. Only one of them is worth using.

FormatWhere it stands
OFXXero's own recommendation, and what the export produces. Dates, signed amounts, and identifiers are typed rather than guessed from columns.
CSVAccepted, with Date and Amount mandatory and a date-format prompt on upload. Workable, but the mapping is yours to get right every time.
QIFAccepted, and older than both. No identifiers, so re-imports overlap.
PDFNot accepted at all, which is the reason this page exists.

FAQ

Common questions

How do I import a bank statement PDF into Xero?

Xero cannot read a PDF. Convert the statement to OFX first, then use Accounting, Bank accounts, the account's menu, and Import a Statement. Xero reads the OFX and creates bank statement lines ready to reconcile.

Why OFX rather than CSV?

Xero accepts both and recommends OFX. In an OFX file the date, the signed amount, and the transaction identifier are typed fields, so there is no column mapping to configure and no date-format question to answer wrongly.

Can I import history from before I connected the feed?

Yes, and it is the main reason to do this. A feed only carries transactions from the point it was connected; a statement PDF carries whatever period it covers, so archived months import the same way as recent ones.

Will importing overlapping months create duplicates?

Each transaction carries a FITID, the field OFX defines for de-duplication. Software that honours it matches on the identifier rather than on the description and amount, so overlapping periods add only what is new.

Do categories come across?

No: categories are not part of the OFX schema, and Xero does its own coding through bank rules and reconciliation. What travels is the date, the amount, the resolved merchant, and the description, which is what those rules match on.

Does this work for credit cards and closed accounts?

Yes. Any account whose statements you can download as PDFs converts the same way, including cards and accounts that have since been closed and can no longer be connected.

Converting a statement from a specific bank?

Written up for the format each of these banks prints.

Give Xero the months it missed.

Upload the statements, check the balances tie, and import a year of OFX in an afternoon.