To import a bank statement into Odoo, go to the Accounting Dashboard, open the menu on your Bank journal and choose Import file. Odoo reads CAMT.053, OFX and QIF files directly. CSV and XLSX files need their columns mapped and a test run first. Afterwards, compare the ending balance with the bank's statement.
Which bank statement files can Odoo import?
The bank statement files Odoo can import are CAMT.053, CSV, XLSX, OFX and QIF, plus CODA for Belgian banks. That list comes from Odoo 19's documentation on bank transactions. The Odoo 18 version of the page lists the same formats except XLSX, so older databases may not take spreadsheets directly.
| Format | Where it usually comes from | Column mapping needed? |
|---|---|---|
| CAMT.053 | European business banking, the SEPA cash management format | No |
| OFX | "Money" or "Quicken" style downloads from many banks | No |
| QIF | Older personal finance exports | No |
| CSV | Online banking export, a spreadsheet, a converter | Yes |
| XLSX | An Excel workbook, in versions that accept it | Yes |
| CODA | Belgian banks only | No |
If your bank offers CAMT.053 or OFX, take that. Both carry the account details and need no mapping, so the import is a file pick and a review. CSV is the fallback for banks that offer nothing else, and the only practical format when you start from a PDF statement.
The same documentation gives two other ways in: click the Bank journal's name and then Upload, or drag the file onto the bank journal card on the dashboard or onto the Bank Matching view.
Mapping CSV columns on the Odoo import screen
Mapping CSV columns on the Odoo import screen means setting the file's formatting options, then pairing each column with an Odoo field such as date, label and amount. Odoo's documentation says CSV and XLSX files need this step, and that you should run Test before Import. Other formats are mapped for you.
What to set
The documentation does not walk through each field, so treat the list below as a practical guide to a typical bank CSV:
- Separator and encoding. Comma or semicolon, and UTF-8 for accented names.
- Date format. Match the file exactly. A day-first file read as month-first moves lines into the wrong month without any error.
- Decimal and thousands separators. A European file that writes 1.250,00 needs both set the other way round.
- Columns. Map the date, the description or label, and the amount. If the bank uses separate debit and credit columns, merge them into one signed column first, which is simpler than mapping two.
An example file
These rows are made up for illustration:
Date,Label,Amount
2026-03-02,Customer payment INV/2026/0041,1800.00
2026-03-05,Office rent March,-950.00
2026-03-12,Card fee,-4.50
Run Test on a file like this and read any messages before pressing Import. A test that passes with every row accounted for is the signal to continue.
Does Odoo check the statement's ending balance?
Odoo does check the statement's ending balance when you use statements. Odoo 18's page on bank transactions says a warning appears if the starting balance differs from the previous statement's ending balance, or if the ending balance differs from the running balance. You can still save, so the warning is yours to act on.
Do not save past that warning without knowing the cause. A gap between the ending balances is almost always one of three things: a line missing from the file, a line imported twice, or an opening balance that was never entered.
The last one catches new users. The documentation recommends creating an opening transaction, so that the balance in Odoo starts from the same figure as the bank. Without it, every later statement is off by the same amount, and the warning never goes away.
A quick worked check, with example figures: the bank's statement opens at 12,400.00 and closes at 13,245.50. Add the imported lines to the opening balance in Odoo. If you reach 13,250.00, the difference of 4.50 matches the card fee in the example file above, so look for that line first.
Finding duplicate lines after an Odoo statement import
Duplicate lines after an Odoo statement import are found with the Find Duplicate Transactions action. Open the bank journal's Bank Matching view, choose Actions, then Find Duplicate Transactions, set a starting date, select the lines to remove and click Delete Selected. Odoo 19's documentation says it flags lines by amount, date and account number.
Duplicates usually come from importing the same file twice, or from a statement file that overlaps dates a bank sync already brought in. The documentation adds that bank-synced lines are compared by their transaction ID, and that a Provider Duplicates tab appears when the sync provider has flagged some itself.
Check the flagged pairs against the statement before deleting. Two equal charges on one day can be genuine, and Odoo's flag is a suggestion, not proof.
When an Odoo statement import is the wrong tool
An Odoo statement import is the wrong tool when the bank can sync directly, when the data is not bank lines at all, or when the books live in other software. In each case, a different route saves time and avoids the duplicate clean-up above.
Bank sync, where available, brings lines in daily without files. Use statement imports for history before the sync started, or for banks Odoo cannot reach.
Readers arriving from Quicken often expect the same file habits to work everywhere. They do not. Quicken's own download methods are compared in Quicken Web Connect versus Express Web Connect, and the errors a Quicken file can raise are covered in fixing a Quicken QFX import error. A QFX file built for Quicken may still go into Odoo through its OFX import, but test it on a copy of the journal first.
If your books are in QuickBooks Online instead, the upload works differently again, as uploading bank statements to QuickBooks Online explains. For a PDF statement, SimpleBankConvert is being built to produce a CSV with a single signed amount column for QuickBooks and Xero. Odoo is not one of its targets, so map one month's file with Test before importing a whole year.