Turn a PDF or scanned bank statement into the OFX, QIF or CSV file Odoo Accounting reads, then import it into the bank journal and reconcile.
Upload your bank statement
Drop file here or click to upload
PDF, JPG, PNG, BMP, HEIC, TIFF
Uploading...
Odoo Accounting imports bank transactions from five file formats: CAMT.053, CSV, OFX, QIF and the Belgian CODA format. PDF is not among them, so a statement downloaded from online banking has to be converted first. You upload the file from the bank journal on the Accounting Dashboard using Import File, set the formatting options, map the columns to Odoo fields where the format requires it, then run Test before importing. OFX is usually the best target, because Odoo reads it natively and it carries a unique ID on every transaction that CSV and QIF do not.
Odoo is generous about formats compared to most ERPs, and still will not read the one file almost every finance team actually holds.
The supported import formats are CAMT.053, CSV, OFX, QIF and CODA. A PDF statement, whether downloaded from online banking or scanned from paper, is not one of them, and no setting in Odoo Accounting changes that.
Automatic bank synchronization does not reach every institution, and community banks and credit unions are the most common gaps. When there is no feed, importing a file is the only route into the bank journal.
A CSV import runs through a wizard where you set formatting options and map each column to an Odoo field. That is fine once, but a spreadsheet whose column order changes between months means repeating the mapping and re-checking it every time.
CODA is the Belgian statement format and CAMT.053 is the ISO 20022 format used widely in Europe. Neither is something a US bank typically hands a small or mid-sized business, which leaves OFX, QIF and CSV as the realistic options.
QIF imports into Odoo, but the format has no unique identifier per transaction. If a period is imported twice, nothing in the file tells Odoo it has seen those lines before, and the bank journal ends up with duplicates.
Most banks serve roughly the last 90 days of activity for download while keeping years of statements available as documents. Loading prior periods for a migration or a catch-up means working from statements rather than from the download screen.
The conversion closes one gap: you have a PDF, and Odoo wants OFX, QIF or a mappable CSV.
Open Financial Exchange is one of the five formats Odoo imports directly. It needs no column mapping, because the structure is already defined inside the file rather than inferred from a spreadsheet header.
OFX carries a unique identifier on every transaction. That is what gives Odoo something to recognize when statement periods overlap, which neither CSV rows nor QIF entries can offer.
QIF is also on the supported list, which matters when migrating from older finance software. Export QIF here if your Odoo workflow or a legacy dataset expects it.
Image-only PDFs, scans and photographed pages are read the same way as text PDFs, which matters most for older periods that exist on paper and nowhere else.
Up to 50 statements per upload, each up to 50MB, with an option to merge one account's monthly PDFs into a single continuous file before extraction.
Each conversion is validated against the statement balances, so a misread amount surfaces before the file reaches the Odoo import wizard rather than during reconciliation.
Convert first, then import into the bank journal the account belongs to.
Upload the PDF or scanned statement here and export OFX, or QIF, or CSV if your workflow already has a mapping you trust.
Tip: OFX is the least fragile choice, because it does not depend on matching a column layout.
On the Accounting Dashboard, find the bank journal for the account and click Import File. The same import is reachable from the ellipsis icon on the journal card.
Tip: Import into the journal that matches the statement account, not a general one, or reconciliation will have nothing to match against.
Choose the formatting options the wizard asks for, and where the format requires it, map each column in the file to its related Odoo field.
Tip: An OFX file skips most of this, since its structure is already defined.
Run the Test the wizard offers before committing, confirm the transaction count and dates look right, then import and move on to reconciliation.
Tip: Test is there precisely so a bad mapping never reaches the journal. Use it every time.
Mostly teams running Odoo Accounting on accounts or periods a bank feed does not cover.
A new Odoo implementation needs prior-period history so opening balances reconcile, and that history lives in statements rather than inside a 90 day download window.
Smaller US institutions often serve a PDF statement and nothing else, with no supported synchronization, so converting the statement is the only way into the bank journal.
Self-hosted and community deployments frequently run without an automated feed by choice, and a clean file import keeps the bank journal current without adding a connection to maintain.
Accountants asking for prior periods work from archived statements, and a converted file ties each line back to the source document.
Odoo Accounting imports bank transactions from five formats: CAMT.053, CSV, OFX, QIF and CODA. That is a wider list than most accounting systems offer, and notably it includes both of the formats a converted bank statement is most naturally exported as. PDF is not on the list, which is the one detail that catches people out, since a PDF is what online banking actually hands you.
Which of the five makes sense depends almost entirely on where you are. The table below is the short version for a US account.
| Format | Imports into Odoo | Practical for a US account | What to know |
|---|---|---|---|
| OFX | Yes | Best choice | Structured, no column mapping, and carries a unique ID on every transaction. |
| QIF | Yes | Workable | Older and simpler than OFX. No unique transaction ID, so re-imports can duplicate. |
| CSV | Yes | Fallback | Needs formatting options and column mapping in the wizard. Date ambiguity is the usual failure. |
| CAMT.053 | Yes | Rare in the US | The ISO 20022 XML format. Common in Europe, uncommon from US banks below the corporate tier. |
| CODA | Yes | No | The Belgian statement format. Not something a US bank issues. |
| No | Convert first | Not a supported import format in any Odoo edition. Convert to OFX, QIF or CSV. |
Yes. Open Financial Exchange is one of the formats Odoo Accounting reads directly, alongside CAMT.053, CSV, QIF and CODA. Because OFX describes its own structure, the import does not depend on you correctly mapping a spreadsheet column to an Odoo field, which removes the step where most CSV imports go wrong.
It also removes a subtler risk. An OFX file assigns every transaction a unique identifier, so an overlapping statement period has something in it that can be recognized as already seen. A CSV row and a QIF entry carry no such identity, which is why re-importing a spreadsheet is the classic way to end up with a bank journal holding two copies of March. There is more on that structure on the OFX file format page.
Go to the Accounting Dashboard, find the bank journal for the account the statement belongs to, and click Import File. The same import is reachable from the ellipsis icon on the journal card, and from the transaction list through the gear icon and Import records. Upload the converted file, set the formatting options the wizard asks for, and where the format needs it, map each column in the file to its related Odoo field.
Then use Test before you import. The wizard offers it specifically so a wrong mapping or a misread date format can be caught while it is still a preview rather than a set of journal entries you have to unwind. Check that the transaction count matches the statement and that the dates fall in the period you expect, and only then run the import.
CSV feels flexible and behaves like the opposite. Every import runs through formatting options and a column mapping step, and both have to be right for the file in front of you. When a bank changes its export layout, or a spreadsheet gets an extra column somewhere along the way, the mapping you saved last month no longer describes this month's file.
Dates are the specific hazard, because they fail quietly rather than loudly. A file where the day and month can be read either way will import without complaint and put transactions in the wrong period, and the only signal is that reconciliation stops tying out. OFX avoids the whole category of problem by stating its dates unambiguously inside the file. If a spreadsheet is genuinely the destination rather than a step on the way, the PDF bank statement to CSV converter covers that output directly.
This is what drives most manual imports. Bank download screens typically serve about 90 days of activity while the statement archive runs for years, so any Odoo migration, any account that was never connected, and any auditor asking about a prior period lands outside what a feed can supply. The statements are the complete record, and they are always available.
For that kind of catch-up, convert the monthly PDFs as one batch rather than one at a time. Up to 50 files go into a single upload, and when they all belong to the same account they can be merged before extraction, so twelve monthly statements come back as one continuous file and one import into the bank journal instead of twelve. The bulk bank statement converter page covers how batching and merging behave.
Two checks catch nearly everything. Compare the transaction count and the closing balance of each converted statement against the printed document, because a matching closing balance is strong evidence that every line between the opening and closing figures came through correctly. Then run the wizard's Test step and read what it is about to create before committing it.
If a period does end up imported twice, deal with it before reconciling rather than after, and prefer OFX for anything you might reload. Odoo will happily accept the same QIF or CSV file twice, because nothing in those formats says the transactions are the same ones. The same problem shows up in every accounting system that accepts spreadsheets, and it is covered in more depth for a different one on the QuickBooks bank statement import page.
Odoo Accounting imports CAMT.053, CSV, OFX, QIF and the Belgian CODA format. PDF is not a supported import format, so a statement downloaded from online banking has to be converted to one of those five before Odoo will read it. For a US account, OFX, QIF and CSV are the realistic choices.
Yes. OFX is one of the five bank statement formats Odoo Accounting reads directly. It is usually the best target for a converted statement, because it needs no column mapping and it carries a unique identifier on every transaction, which CSV rows and QIF entries do not.
No. PDF is not among the formats the Odoo bank statement import accepts, and no setting changes that. Converting the PDF to OFX, QIF or CSV first is the practical route, and scanned or photographed statements convert the same way as text PDFs.
On the Accounting Dashboard, open the bank journal for the relevant account and click Import File. Upload the converted file, set the formatting options, map the file columns to their related Odoo fields where the format requires it, then run Test and import the transactions.
The bank statement file import is part of Odoo Accounting rather than an add-on, and the supported format list is documented without an edition restriction. Automatic bank synchronization is a separate feature from importing a file, and many self-hosted deployments rely on file import by choice.
Almost always the formatting options or the column mapping. A date column that can be read two ways will import without an error and place transactions in the wrong period. Use the wizard's Test step first, and prefer OFX, which states its dates unambiguously inside the file.
OFX, in almost every case. Both import into Odoo, but OFX is the newer and more structured of the two and assigns each transaction a unique identifier. QIF has no such identifier, so re-importing an overlapping period produces duplicates that nothing in the file can prevent.
Odoo supports both formats, but neither is common on a US account. CAMT.053 is the ISO 20022 XML statement format used widely in Europe and mostly at the corporate tier elsewhere, and CODA is specific to Belgian banks. US businesses generally end up using OFX, QIF or CSV.
There is no limit imposed by the file import itself, which is what makes it useful for migrations and catch-up work. The practical limit is what your bank still provides, and download screens usually cover about 90 days while the statement archive goes back years.
Yes, by converting them as a batch first. Up to 50 statements go into a single upload here, and when they all belong to one account they can be merged before extraction, so a year of monthly PDFs becomes one continuous file and one import into the bank journal.
The QIF format Odoo also reads, field by field.
Turn a PDF statement into an OFX file, format and import steps.
What is inside an OFX file and why the transaction ID matters.
The QIF output, and where the format falls short.
The same job in QuickBooks Online and Desktop.
The same job in NetSuite, where OFX and QFX are native.
Convert up to 50 statements in one batch, with merging.
CSV output when a spreadsheet is the real destination.
Get started converting bank statements to OFX.
USD
per month
per month
$288 charged today
Choose speed vs accuracy when extracting
| Base AI Faster | 2,500 pages |
| Pro AI Best accuracy | 500 pages |
Scale statement conversion across your team with automation.
USD
per month
per month
$888 charged today
Choose speed vs accuracy when extracting
| Base AI Faster | 10,000 pages |
| Pro AI Best accuracy | 2,000 pages |
Enterprise-grade bank statement conversion and controls.
USD
per month
per month
$ charged today
Choose speed vs accuracy when extracting
| Base AI Faster | pages |
| Pro AI Best accuracy | pages |