Skip to main content
BankFlow logoBankFlow

Bank statement to GnuCash

A statement GnuCash can actually import.

Convert statement PDFs into plain OFX and bring them in through File → Import → Import OFX/QFX, where GnuCash maps them to an account and runs its own matcher before anything is posted.

50 free page credits · No card · Cancel anytime

  • Plain OFX, no partner ID
  • Account mapping remembered
  • Matcher-friendly rows

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 GnuCash 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 File › Import › Import OFX/QFX transactions
A statement PDF in, an OFX ledger out: one <STMTTRN> block per transaction, typed and signed. Illustrative data.

GnuCash reads OFX. Your bank sends a PDF.

Most banks will not hand a GnuCash user a machine-readable file at all: the download menu offers a statement PDF and, if you are lucky, a CSV whose columns change between accounts. Direct Connect exists but few institutions still support it for personal use. So the ledger gets typed by hand, or built from a CSV that has to be re-mapped every quarter, when the format GnuCash was built to import is one conversion away.

How it works

From statement PDF to GnuCash, screen by screen

  1. 01

    Upload the statement

    Scanned, multi-page, and password-protected PDFs all work, up to 50 MB each. Several months can go in at once.

    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 a private import address, or post it to the API.
  2. 02

    Confirm the import

    Check what is queued and decide whether statements carrying warnings still count. 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

    Every line is extracted and checked against the statement's printed opening and closing balances: the check GnuCash cannot do for you, because it never sees the statement.

    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

    Clean the descriptions

    GnuCash's matcher learns from the description, so a consistent narration today is an automatic match next month. Fix them in bulk before the file exists.

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

    Export OFX

    Choose OFX, not QuickBooks. GnuCash reads both .ofx and .qfx, but the plain file is the one with nothing Intuit-specific in it.

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

Once you have the file

Importing the OFX into GnuCash

Three dialogs, and the second one only appears the first time.

  1. 1

    File → Import → Import OFX/QFX transactions

    GnuCash opens a file chooser. Pick the exported .ofx file and press Import.

  2. 2

    Map the file's account to one in your tree

    The Account Selection dialog asks which GnuCash account this statement belongs to. On later imports from the same source, GnuCash remembers the mapping and skips the question.

  3. 3

    Work the import matcher

    The generic transaction matcher opens next, proposing matches against transactions you already have and letting you confirm, edit, or add each row before it is posted.

  4. 4

    Post, then reconcile against the statement

    With the rows in, reconcile the account to the statement's closing balance, which the export has already verified, so it should agree first time.

OFX import requires GnuCash to have been built with libofx. Official builds for Linux, macOS, and Windows include it; if the menu entry is missing, that is why.

What survives the trip into your ledger

OFX 1.02, the profile libofx expects

SGML rather than XML, with the OFX header block and one <STMTTRN> per transaction: the shape GnuCash's importer was written against.

One account per file

Filter to a single account before exporting and the Account Selection dialog has one obvious answer, which is the mapping GnuCash will reuse from then on.

Rows the matcher can match

Consistent, resolved descriptions give the import matcher something stable to compare against, so repeat merchants stop arriving as unmatched every month.

FITIDs on every transaction

The identifier OFX defines for de-duplication, so an overlapping import adds what is new rather than doubling a month you already posted.

Scanned statements included

A statement that only exists as a scan or a photograph goes through OCR before parsing, so paper archives convert like anything else.

Cards and closed accounts too

Anything you can download as a PDF converts, including credit cards and accounts that no longer exist to connect to.

OFX, QFX, and QBO in GnuCash

GnuCash reads more than one of these. They are not equally worth using.

FileWhere it stands
.ofxPlain Open Financial Exchange, and what this export produces. Imported through File → Import → Import OFX/QFX.
.qfxIntuit's Quicken variant of OFX. GnuCash's importer accepts it, but the file must come from a bank in Intuit's programme.
.qboOFX with an Intuit web-connect header. Meant for QuickBooks; there is no reason to hand it to GnuCash when plain OFX is available.
CSVGnuCash imports CSV too, but every file needs its columns mapped and carries no transaction identifiers.

FAQ

Common questions

How do I import a bank statement into GnuCash?

Convert the statement PDF to OFX, then use File, Import, Import OFX/QFX transactions. GnuCash asks which account the file belongs to, then opens its import matcher so you can confirm each row before it is posted.

Does GnuCash import PDF statements directly?

No. GnuCash imports OFX, QFX, and CSV. A PDF has to be converted first, which is what this does, into the OFX profile its importer was written against.

Why not just use CSV?

CSV works, but every file needs its columns mapped, the date format is ambiguous, and there are no transaction identifiers, so re-importing an overlapping period duplicates rows the matcher has to catch by hand.

Will GnuCash remember which account the file belongs to?

Yes. The Account Selection dialog appears on the first import from a given source account, and the mapping is reused on later imports from the same source.

The Import OFX/QFX menu entry is missing. Why?

OFX support is provided by libofx, and a build compiled without it has no such menu entry. The official GnuCash builds include it; distribution packages occasionally split it into a separate package.

Will re-importing the same month duplicate transactions?

Each row carries a FITID, and the import matcher compares incoming transactions against what is already in the account, so an overlapping import is proposed as matches rather than as new rows.

Converting a statement from a specific bank?

Written up for the format each of these banks prints.

Stop typing statements into GnuCash.

Convert the PDF, check the balance ties, and import the OFX the way GnuCash expects it.