Skip to content
Try free · No sign-up

PDF bank statement to OFX converter

One reviewed statement, one OFX file, no retyping. Each row becomes a transaction record with a stable ID, and the statement’s currency and closing balance travel inside the file.

The sample is a synthetic statement — no real bank, person, or account — and the excerpt shown is taken from that exact file, byte for byte.

Sample OFXstatementstudio-sample.ofx · synthetic data · lines 36–46
<BANKTRANLIST><DTSTART>20260501<DTEND>20260531<STMTTRN><TRNTYPE>CREDIT<DTPOSTED>20260501<TRNAMT>8400.00<FITID>839271b3-41e4-5548-a7c4-30e3c8b77bef<NAME>BACS CLIENT PAYMENT HARWOOD DEVE<MEMO>BACS CLIENT PAYMENT HARWOOD DEVELOPMENTS INV 2041</STMTTRN>

Inside the sample file: the transaction list opens with the statement period, then one record per reviewed row — type, date, amount, stable ID, name, memo.

What you download

What's inside the OFX file.

OFX isn't columns — it's a structured statement document. These are the fields that matter when your accounting software reads it.

OFXHEADER · VERSION
The file declares OFX 1.02 — the plain-text form of the standard that accounting packages accept for manual statement import.
CURDEF
The statement’s currency, stated once for the whole file. If the currency can’t be determined from the statement, the export refuses to generate rather than guessing.
One record per row
Each reviewed transaction becomes one record: the type derived from the amount’s sign, the date as YYYYMMDD, the signed amount, and the reviewed description as name and memo.
FITID
A stable ID on every record. Re-exporting the same reviewed data produces the same IDs, so software that checks IDs won’t create duplicates if a file is imported twice.
LEDGERBAL
The statement’s closing balance and its as-of date — taken from the statement itself, never computed to force agreement.
Account identifiers
The account ID uses only the masked digits printed on the statement; the bank ID is a neutral placeholder. No bank-issued identifiers are invented — your software imports this as a statement file, not a live feed.
Reviewed, then exported

Convert a bank statement to OFX — with the checking done first.

Every row is extracted beside its source page and checked against the statement's balances before it becomes a record. Here is one reviewed row, written as a full OFX transaction record:

DateDescriptionAmountSource page
6 May 2026HMRC VAT REF 475992103(£4,682.10)1
<STMTTRN><TRNTYPE>DEBIT<DTPOSTED>20260506<TRNAMT>-4682.10<FITID>88e89db7-ae91-52f2-93bf-853339812fb2<NAME>HMRC VAT REF 475992103<MEMO>HMRC VAT REF 475992103</STMTTRN>
What this file is — and isn’t

A statement file — not a bank feed.

OFX is the format banks use for downloadable statements, so some software expects bank-issued identifiers inside it. This file uses a neutral placeholder instead — your accounting app imports it as a file you chose, and nothing stays linked afterwards.

Importing an OFX file

  1. Download your reviewed OFX file.
  2. In your accounting software, open the manual statement or file import — Xero, Sage, and QuickBooks Online all accept an OFX file there.
  3. Select the file. The statement currency and closing balance travel inside it, so there are no columns to map.
  4. Review the import preview. If you ever re-import the same reviewed data, the stable record IDs let ID-checking software skip what it already has.

OFX is an open standard stewarded by the FDX OFX Work Group; Xero’s import flow is documented in Xero’s OFX import guide.

Built to import cleanly

An OFX file is only useful if it’s valid.

A valid OFX file must state facts this product will not invent — so the export waits when the statement doesn’t provide them:

No determinable currency
OFX states one currency for the whole file. If the statement doesn’t establish it, or rows show a different currency, the export refuses rather than guessing.
No closing balance
A valid OFX file carries a ledger balance. If neither the statement’s closing balance nor a source-backed final running balance exists, the export refuses rather than computing one.
Duplicate row IDs
Record IDs must be unique — importing software dedupes on them, which would silently drop rows. The export refuses if IDs would collide.
Missing dates or amounts
Every record needs a date and a signed amount. If a reviewed row lacks either, this export stays unavailable until the row is resolved in review.

Review your transactions before importing, and check the import preview in your accounting software.

Other formats

Need a different shape?

QuickBooks CSV
Working in QuickBooks Online specifically? The three-column CSV maps onto its upload flow. Bank statement to QuickBooks CSV
QIF
The older cousin — simpler, no currency or balance inside. Bank statement to QIF
Everything else
The bank statement converter lists every output, including CSV and Excel with the full review trail.
Questions

About the OFX output

What can I import this OFX file into?

Xero, Sage, and QuickBooks Online all accept a manual OFX statement import, look for the manual statement or file-import option in your software.

Does OFX mean this is a bank feed?

No, it’s a file exported from your reviewed statement, not a live feed. Where OFX expects bank-issued identifiers, this file uses a neutral placeholder, so your software imports it as a statement file.

What is FITID and why does it matter?

A stable ID on each transaction record. Re-exporting the same reviewed data produces the same IDs, so software that checks IDs won’t create duplicates if a file is imported twice.

Why would this export be refused?

The file must state one currency and a closing balance, both are required for a valid OFX file. If either can’t be determined from the statement, or rows show more than one currency, the export refuses to generate rather than inventing values.

Why not QBO or QFX instead?

Both need bank-issued identifiers that a statement PDF doesn’t contain, so we don’t generate them. Plain OFX covers the same manual-import need without inventing identifiers.

Try free

Convert a bank statement to OFX — and check it first.