Skip to main content
BankFlow logoBankFlow

Bank statement to FreshBooks

FreshBooks takes CSV. Make it a good one.

FreshBooks has no OFX route: a manually added bank account is reconciled from CSV, with the columns mapped on upload. Convert your statement into a clean, consistent CSV and that mapping stops being a monthly chore.

50 free page credits · No card · Cancel anytime

  • Same columns every month
  • Balance-checked rows
  • One or two amount columns

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 · 10 columnsExport CSV

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]

CSV file FreshBooks imports

transactions_oct.csvCSV

date,narration,merchant,category,amount

2025-10-24,STRIPE PAYOUT 4af2c9,Stripe,Income,4820.00

2025-10-23,AWS EMEA SARL us-east-1,Amazon Web Services,Software,-1204.00

2025-10-22,WHOLE FOODS MKT #214,Whole Foods,Groceries,-112.88

2025-10-21,UBER *TRIP,Uber,Travel,-24.40

2025-10-20,GUSTO PAY 9931,Gusto,Payroll,-18440.00

UTF-8 · one row per transaction · quoted where needed
A statement PDF in, the same columns out every time: ISO dates, resolved merchants, unformatted amounts. Illustrative data.

No bank connection, no OFX, and a mapping to redo every month.

FreshBooks supports reconciling an account you added by hand, and the way transactions get into it is a CSV upload where you match each field to a column in your file. That works fine once. It stops working when the next statement comes from a different bank with different headers, splits debits and credits across two columns instead of one, and writes its dates the other way round, because now the mapping is a decision you make again, under time pressure, every month.

How it works

From statement PDF to FreshBooks, screen by screen

  1. 01

    Upload 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 a private import address, or post it 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 it parse and reconcile

    Rows are extracted and checked against the statement's printed opening and closing balances, so the CSV you upload is a complete month rather than most of one.

    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

    Tidy the descriptions

    FreshBooks matches on what the description says. Resolve merchants and fix a scan's mangled narration across a shift-clicked range 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 pass rather than a row at a time.
  5. 05

    Export the CSV

    The same column set every time, whichever bank the statement came from, so the mapping you set in FreshBooks the first time keeps working.

    Export dialog with CSV selected, the field list on the right, and a live preview of the rows.
    CSV selected, the column set and their order fixed, and the exact rows previewed before the download.

Once you have the file

Importing the CSV into FreshBooks

Reconciliation on a manually added account, from a CSV upload.

  1. 1

    Add the bank account by hand first

    A CSV cannot create the account it belongs to. Add it with a starting balance before uploading anything, or there is nothing to reconcile against.

  2. 2

    Upload the CSV to that account

    FreshBooks imports transactions in bulk from a file rather than one at a time, which is what makes a whole statement practical.

  3. 3

    Match the fields to your columns

    Point Date at the date column and so on, and choose whether the amounts are in one column or two. With a consistent export, this answer never changes.

  4. 4

    Wait for it to finish

    A CSV import can take up to fifteen minutes, and you have to stay logged in while it runs or it is interrupted.

Manual CSV reconciliation is the route when a bank connection is unavailable in your region, or when you would rather review transactions yourself than link an account.

What makes the mapping stay solved

The same columns every time

One layout regardless of which bank produced the statement, so the field matching you set up in FreshBooks on the first import keeps applying to the next one.

One amount column or two

FreshBooks asks whether your amounts are in one column or split across two. The export is consistent about it, so the answer is the same on every upload.

Balance-checked before export

Opening and closing balances are reconciled against the parsed rows, so a missing page is caught before it becomes a reconciliation that will not close.

Merchants resolved

Cryptic card descriptors are resolved to a canonical merchant, which is what FreshBooks has to match on when it places the transaction.

Scoped to one account

FreshBooks reconciles per account, so filter to that account and that period and export exactly those rows.

Scans and old statements

OCR runs before parsing, so archived paper statements convert the same way this month's download does.

Columns in the CSV export

What each one maps to when FreshBooks asks.

ColumnContents
DateTransaction date in ISO order, so there is no ambiguity to declare.
NarrationCleaned description text as printed on the statement.
MerchantCanonical merchant resolved from the narration.
CategoryAssigned category, editable before export.
AmountSigned numeric value: negative for debits, positive for credits, in a single column.
SourceThe statement and account the row was parsed from.

FAQ

Common questions

Can FreshBooks import an OFX or QBO file?

No. FreshBooks reconciles either through a bank connection or from a CSV uploaded to an account you added manually. If you are looking for an OFX route, it is not there: CSV is the file import.

How do I import bank transactions into FreshBooks?

Add the bank account by hand with a starting balance, then upload a CSV of transactions to it and match each field to a column in your file. The import runs in bulk rather than one transaction at a time.

Why does my import keep needing a different mapping?

Because bank CSVs differ from each other: different headers, different date orders, and amounts sometimes split across two columns. Converting from the statement gives you one layout instead, so the mapping stops changing.

Do I have to stay logged in while it imports?

Yes. FreshBooks notes that a CSV import can take up to fifteen minutes and that staying logged in is required, or the import is interrupted partway through.

Can I import into an account connected to my bank?

The CSV route is for accounts you added manually. It is the option when a connection is unsupported in your region, or when you would rather review transactions yourself than link the account.

Does this work with credit card statements?

Yes. Card statements convert the same way, with the merchant resolved out of the card descriptor so the rows are recognisable when FreshBooks lists them.

Converting a statement from a specific bank?

Written up for the format each of these banks prints.

Solve the mapping once.

Convert the statement, check the balances tie, and upload a CSV whose columns are the same as last month's.