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 rowsFormat
| Date | Description | Amount |
|---|---|---|
| 2025-10-24 | STRIPE PAYOUT 4af2c9 | +4,820.00 |
| 2025-10-23 | AWS EMEA SARL | −1,204.00 |
| 2025-10-22 | WHOLE FOODS MKT | −112.88 |
PDF statement you upload
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
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
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
- 01
Upload the statement
Scanned, multi-page, and password-protected PDFs all work, up to 50 MB each.

Drop the file in, forward the bank's email to a private import address, or post it to the API. - 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.

The warning types that will still count toward analytics are named before anything is extracted. - 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.

The activity panel names the stage and the seconds elapsed as the statement moves through the queue. - 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.

Select a range and correct the merchant or description in one pass rather than a row at a time. - 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.

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
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
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
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
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.
| Column | Contents |
|---|---|
| Date | Transaction date in ISO order, so there is no ambiguity to declare. |
| Narration | Cleaned description text as printed on the statement. |
| Merchant | Canonical merchant resolved from the narration. |
| Category | Assigned category, editable before export. |
| Amount | Signed numeric value: negative for debits, positive for credits, in a single column. |
| Source | The 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.
Keep exploring
Bank Statement → QuickBooks
Categorize first, then export an OFX/QBO QuickBooks imports.
Bank Statement → Xero
OFX for Import a Statement, including pre-feed history.
Bank Statement → GnuCash
Plain OFX for File → Import → Import OFX/QFX.
Bank Statement → Moneydance
OFX for the accounts Direct Connect cannot reach.
Bank Statement → Sage
OFX scoped to one account, the way Sage reads it.
Solve the mapping once.
Convert the statement, check the balances tie, and upload a CSV whose columns are the same as last month's.