How to import a bank statement into Odoo (CSV, OFX, QIF, CAMT.053 or PDF)
Odoo imports a bank statement as bank transactions on the bank journal, which you then reconcile with invoices, bills and payments. The import is the same idea in Odoo 17, 18 and 19, but the menus moved. This guide covers the file formats Odoo lists, the steps for each version, the CSV and Excel options, the opening balance, reconciliation, duplicates, PDF statements, and what changes on Odoo Community.
Short answer: in Odoo Accounting, open the Accounting Dashboard, click the ⋮ (ellipsis) icon on the Bank journal and select Import file (Odoo 17 and 18 also show an Import File button on the journal card). Upload a CAMT.053, CSV, OFX or QIF file; Odoo 19 also lists Excel (XLSX). For a CSV or XLSX, set the formatting options, map the columns to Odoo fields, click Test, then Import. OFX, QIF and CAMT.053 are mapped automatically. Odoo's documentation doesn't list PDF as an import format, so turn a PDF statement into OFX or CSV first.
See a PDF statement turned into a file Odoo imports
Open Utilly's fictional September 2026 checking statement (account ending 0427, 31 transactions: 11 deposits totalling 29,597.43 and 20 withdrawals totalling 28,575.27). You see every line, the balance check from 12,418.36 to 13,440.52, and the OFX, CSV and QIF downloads, all free because the data is made up.
- The ways bank data gets into Odoo
- Which file to import
- Import the file, by Odoo version
- CSV and Excel: formatting and column mapping
- Record the opening balance first
- Reconcile the imported transactions
- Group into a statement and check it
- Duplicate and missing transactions
- PDF statements
- Odoo Community
- Problems and fixes
- Convert your own statement
1. The ways bank data gets into Odoo
Odoo's Transactions page names three routes: bank synchronization, importing a file your bank delivers, and registering transactions by hand.
| Route | What Odoo's documentation says |
|---|---|
| Bank synchronization | Connects to over 26,000 institutions through third-party providers (Plaid in the United States and Canada; Yodlee, Salt Edge, Ponto, Enable Banking and Basiq elsewhere). Needs a valid Odoo Enterprise subscription. Journals sync every twelve hours by default; Fetch Transactions syncs by hand |
| Import a file | The bank journal's Import file action, for CAMT.053, CSV, OFX, QIF, CODA (Belgium) and, in Odoo 19, XLSX |
| Register by hand | Click the bank journal, then New. In Odoo 19 the Label and Date are mandatory and the Partner is optional |
A file import is how you fill the gaps a bank connection leaves. Odoo's bank synchronization page says "For some bank institutions, transactions can only be fetched up to three months in the past. If older transactions are needed, they can be imported." It also says that when a journal has no transactions, the first sync retrieves all available past transactions, and that in Odoo 18 and 19 you can limit that with a Lock Everything date (Accounting → Accounting → Lock Dates).
2. Which file to import
From the Import transactions section of Odoo's documentation:
| File | Odoo 17 / 18 | Odoo 19 |
|---|---|---|
| CAMT.053 (SEPA recommended Cash Management format) | Yes | Yes |
| CSV | Yes, with column mapping | Yes, with column mapping |
| Excel (XLSX) | Not in the list | Yes, with column mapping |
| OFX (Open Financial Exchange) | Yes | Yes, mapped automatically |
| QIF (Quicken Interchange Format) | Yes | Yes, mapped automatically |
| CODA | Belgium | Belgium |
| Not in the list | Not in the list (section 9) |
OFX is the least work: dates, signed amounts and a transaction ID are fixed fields, so there's nothing to map. These lines are from the OFX Utilly writes for the sample statement:
<BANKACCTFROM><BANKID>999999999<ACCTID>0427<ACCTTYPE>CHECKING</BANKACCTFROM>
<STMTTRN><TRNTYPE>DEBIT<DTPOSTED>20260901120000<TRNAMT>-6420.18<FITID>20260901E26D1A27070800<NAME>ACH DEBIT GUSTO PAYROLL 0912<MEMO>ACH DEBIT GUSTO PAYROLL 0912</STMTTRN>
<LEDGERBAL><BALAMT>13440.52<DTASOF>20260930</LEDGERBAL>
Each tag is explained in sample OFX file. A European bank's XML statement is usually CAMT.053; the CAMT.053 format explains its tags.
3. Import the file, by Odoo version
Odoo 19, from the 19.0 Transactions page:
- Go to the Accounting Dashboard.
- Click the ⋮ (ellipsis) icon on the Bank journal and select Import file. You can also click the journal's name and then Upload, or drag and drop the file onto the bank journal on the dashboard or onto the Bank Matching view.
- Select the file and upload it.
- For a CSV or XLSX, set the formatting options, map the file columns to their Odoo fields, click Test, then Import (section 4). OFX, QIF and CAMT.053 files are mapped automatically.
Odoo 17 and 18, from the 17.0 and 18.0 pages (the wording is the same in both):
- Go to the Accounting Dashboard and, on the Bank journal, click Import File.
- Or click the ⋮ (ellipsis) icon on the bank journal and select Import file; or select Transactions from that menu, click the gear icon and choose Import records.
- Select the file and upload it.
- Set the formatting options, map the file columns to the Odoo fields, then click Test and Import.
Pick the journal for the account the statement belongs to. In Odoo each bank account has its own journal, created with the account. A credit card statement can go in the same way, into the journal you keep for that card; Utilly's card statement converter writes the same files from card PDFs.
4. CSV and Excel: formatting and column mapping
A CSV or XLSX goes through Odoo's general import screen. From Odoo's Export and import data page:
- Separator and quotes. The preview assumes commas between fields and quotation marks around text; change the Formatting options if your file differs. A tab-separated file isn't detected, so re-save it with commas in a spreadsheet app.
- Dates. Odoo detects date columns and guesses the format, which can swap day and month in a date like 01-03-2016. Check the Date Format it found under the formatting options and change it if needed. Odoo recommends ISO 8601, written YYYY-MM-DD.
- Amounts. Odoo detects the thousands and decimal separators, and reads parentheses as negative. Examples it accepts:
32,000.00,-32000.00,(32000.00),$ 32.000,00. A currency symbol it doesn't know can stop the import. - Mapping. Odoo guesses each column's type from the first ten lines of the file and proposes matching fields. Check every File Column is mapped to the right Odoo Field; a transaction in Odoo has a date, a label, a partner (if set) and an amount.
- Test first. Test checks the data without importing it. The formatting options don't appear for Excel files.
Utilly's CSV already uses ISO dates and one signed Amount column (money out negative), so the date format and signs need no changes. The first four lines of the sample's CSV:
Date,Description,Amount,Balance
2026-09-01,ACH DEBIT GUSTO PAYROLL 0912,-6420.18,5998.18
2026-09-01,STRIPE TRANSFER ST-K2M8Q4,3184.27,9182.45
2026-09-02,CHECK 2041,-1850.00,7332.45
Map Date to the date, Description to the label and Amount to the amount. The Balance column is the running balance after each line, not a transaction field; if you'd rather not map it, delete the column before you upload. If mapping is more than you want to do, import the OFX instead: it carries the same 31 lines and Odoo maps it for you.
Want a file whose headings Odoo maps by itself? The free Odoo bank statement import template uses Date,Label,Partner,Amount, Odoo's own field labels, as CSV or XLSX, filled with this month or blank.
5. Record the opening balance first
Odoo's documentation flags this as important: to make the ending balances of your statements in Odoo match the bank's, "create an opening transaction to record the bank account balance as of the date you begin synchronizing or importing transactions". For the sample, that's one transaction dated before September 1, 2026 for 12,418.36, the statement's opening balance. Without it, the running balance in Odoo starts from zero instead of 12,418.36, so it's off by that amount even when every imported line is right.
6. Reconcile the imported transactions
Imported lines sit on the bank journal until they're reconciled. Odoo's Bank reconciliation page says each transaction's journal entry uses the journal's suspense account until it's fully reconciled, and that Odoo picks matches automatically when it can.
Odoo 19 (Bank Matching view): on the Accounting Dashboard, click the journal name (all transactions) or the x to reconcile button (only unreconciled ones). Each line offers up to two action buttons, with more under the ellipsis:
- Reconcile: pick existing invoices, bills or payments to match.
- Set Partner, Set Account (write the amount off to an account), Receivable, Payable, Batches (batch payments) and any manual reconciliation model buttons.
- With no partner set, Odoo compares the transaction's label with invoice, bill and payment numbers and references. With a partner set, it matches that partner's items by amount. The rules run in order: exact match, discounted match, then amount in the label.
Odoo 17 and 18 (bank reconciliation view): click the journal name, or Reconcile items for the transactions Odoo pre-selected. Select a transaction on the left, choose counterparts on the tabs (Match existing entries, Batch payments, Manual operations), balance the resulting entry and click Validate. To Check sets a line aside for later.
For lines that repeat every month, such as bank fees, a reconciliation model saves the clicks. In Odoo 19 you open them from the bank journal's dropdown menu, Models under Reconciliation; a model is Manual (a button when reconciling) or Automated (applied to transactions that meet its conditions).
7. Group into a statement and check it
Grouping transactions into a statement is optional in Odoo, but it gives you the check that matters. In Odoo 19's Bank Matching view, hover over the newest transaction that belongs to the statement and click the Statement button on the separator line above it; Odoo groups that transaction and every older one not yet in a statement. Fill in the Reference, check the Starting Balance and Ending Balance, attach the PDF if you like, and save. Odoo 17 and 18 do the same from the bank reconciliation (kanban) view, or from the list view's Statement column.
If the starting balance doesn't equal the previous statement's ending balance, or the ending balance doesn't equal the starting balance plus the statement's transactions, Odoo shows a warning, but still lets you save. Compare with the bank's statement before you do. For the sample:
| Check | Sample checking 0427, September 2026 | If it's off |
|---|---|---|
| Lines imported | 31 | Fewer: a line didn't import. More: the file went in twice (section 8) |
| Deposits | 11, totalling 29,597.43 | Deposits showing as money out means the amount signs are reversed |
| Withdrawals | 20, totalling 28,575.27 | A missing service fee or check is the usual gap |
| Net change | +1,022.16 | Must equal the ending minus the starting balance |
| Starting → Ending Balance | 12,418.36 → 13,440.52 | A wrong starting balance usually means the opening transaction is missing |
When the numbers won't agree, finding bank reconciliation discrepancies shows how to find the line, and the free bank statement balance checker confirms the statement itself adds up.
8. Duplicate and missing transactions
Importing a file over dates a bank connection already brought in is the usual way to get duplicates. Odoo's bank synchronization page says duplicates come from "the same online transaction identifier or the same currency, amount, account number, and date".
- Odoo 19: open the journal's Bank Matching view, open the Actions menu and click Find Duplicate Transactions. Pick a Starting Date, select the duplicates and click Delete Selected. A single line can also be removed with Delete Transaction under its ellipsis.
- Odoo 18: in the bank reconciliation view, click the gear icon and select Find Duplicate Transactions, then pick the starting date and delete the extras.
- Missing lines with bank sync: the gear icon's Find Missing Transactions lists posted transactions the connection didn't bring in; select them and click Import Transactions. Pending transactions can't be imported.
Odoo's general import page also warns that imports "are permanent and cannot be undone", so test on one month before you load a year. For a client who is months behind, catch-up bookkeeping from bank statements covers the order of work.
9. PDF statements
PDF isn't in the import formats on Odoo's Transactions page for 17, 18 or 19, which is the usual problem for older months, closed accounts and statements a client emailed. Odoo's developer documentation describes a paid Extract digitization service (one credit per document) whose document types include bank statements, but the Accounting import pages don't describe a PDF statement import, so check what your own database offers before you count on it.
The dependable route is to convert the PDF first. Utilly's PDF to OFX converter reads the statement, checks that the opening balance plus every transaction equals the closing balance, and writes an OFX with a unique transaction ID per line, plus a CSV and a QIF of the same lines. Each statement becomes one file you import with the steps above. Scanned PDFs of up to 10 pages are read with OCR; save a phone photo as a PDF first.
10. Odoo Community
Bank synchronization needs an Odoo Enterprise subscription, per Odoo's documentation. The file import also isn't built into Community: the Odoo Community Association (OCA) says the account_bank_statement_import module "was part of Odoo Community until Odoo v13 and was moved to Odoo Enterprise for Odoo v14".
The OCA's bank-statement-import repository has replacement modules for Community, including account_statement_import_file (the import framework), account_statement_import_ofx (OFX), account_statement_import_camt (CAMT) and account_statement_import_sheet_file (TXT/CSV or XLSX, with column mappings you set up first). Its import framework "only provides the technical framework", so you install it together with the module for your file format. Once installed, the import button appears on the bank journal, and the OCA says transactions already imported "will not be created a second time". Check the repository's branch for your Odoo version before installing.
11. Problems and fixes
| Problem | Likely cause | What to do |
|---|---|---|
| Dates came in with day and month swapped | Odoo guessed the wrong date format | Set the Date Format in the CSV formatting options, or use YYYY-MM-DD dates |
| The preview shows one column per row | The file uses tabs or semicolons | Change the separator in the formatting options, or re-save the file with commas |
| An amount column isn't recognised as a number | A currency symbol or text Odoo doesn't know | Remove the symbol; keep plain signed amounts |
| No Import file option on the journal | Odoo Community, where the import is an Enterprise feature | Use the OCA modules (section 10) or Enterprise |
| Ending balance warning on the statement | Missing opening transaction, missing line, or a duplicate | Add the opening transaction; compare counts and totals with the statement |
| The same lines twice | A file imported over dates the bank sync already fetched | Find Duplicate Transactions, then delete the extras |
| Bank sync only goes back three months | Some banks limit how far back the provider can fetch | Import the older months from files |
| Only a PDF statement | PDF isn't a listed import format | Convert it to OFX or CSV first (section 9) |
12. Convert your own statement
Utilly reads a bank or credit card statement PDF, checks every transaction against the opening and closing balances, and writes an OFX file that Odoo maps on its own, plus a CSV and a QIF. PDF statements get a free preview; CSV and Excel files convert to OFX free up to 100 rows. Files are read in memory and not stored.
Get your statement into Odoo
Pick what you're starting from.
Utilly isn't affiliated with Odoo S.A. or the Odoo Community Association. Menu names change between versions; the steps above are from Odoo's official documentation for versions 17.0, 18.0 and 19.0 and the OCA's module documentation, checked November 10, 2026, and weren't run in a live Odoo database. Sources: Transactions (19.0), Transactions (18.0), Transactions (17.0), Bank synchronization (19.0), Bank synchronization (18.0), Bank reconciliation (19.0), Bank reconciliation (18.0), Bank reconciliation (17.0), Reconciliation models (19.0), Bank and cash accounts (19.0), Export and import data (19.0), Extract API (19.0), OCA bank-statement-import (18.0), OCA account_statement_import_file.
FAQ
How do I import a bank statement into Odoo?
Open the Accounting Dashboard, click the ellipsis icon on the Bank journal and select Import file, then upload the file. For a CSV or XLSX, set the formatting options, map the columns to Odoo fields, click Test, then Import. OFX, QIF and CAMT.053 files are mapped automatically. Then reconcile the transactions.
What file formats can Odoo import bank statements from?
Odoo's documentation lists CAMT.053, CSV, OFX, QIF and, for Belgium, CODA in Odoo 17, 18 and 19. Odoo 19 also lists Excel (XLSX). PDF isn't in the list, so convert a PDF statement to OFX or CSV first.
How do I import a bank statement in Odoo 17 or 18?
On the Accounting Dashboard, click Import File on the Bank journal, or use the journal's ellipsis menu and select Import file. You can also open Transactions from that menu, click the gear icon and choose Import records. Set the formatting options, map the columns, click Test, then Import.
What date format does Odoo need in a bank statement CSV?
Odoo detects date columns and guesses the format, which can swap day and month. Check the Date Format in the CSV formatting options and change it if it's wrong. Odoo recommends ISO 8601 dates written YYYY-MM-DD, such as 2026-09-01.
Can I import a PDF bank statement into Odoo?
Not as a listed import format. Odoo's Transactions documentation lists CAMT.053, CSV, XLSX (Odoo 19), OFX, QIF and CODA, not PDF. Convert the PDF to OFX, which Odoo maps automatically, and import that.
Can Odoo Community import bank statements?
Not out of the box. The Odoo Community Association says the bank statement import module moved from Community to Enterprise in Odoo 14. The OCA's bank-statement-import modules add file import back for Community, with separate modules for OFX, CAMT and CSV/XLSX. Bank synchronization needs an Enterprise subscription.
How do I find and delete duplicate bank transactions in Odoo?
In Odoo 19, open the bank journal's Bank Matching view, open the Actions menu and click Find Duplicate Transactions. In Odoo 18, use the gear icon in the bank reconciliation view. Pick a starting date, select the duplicates and delete them.
Related guides
- Free Odoo bank statement import template (CSV and Excel, filled and blank)
- How to import a bank statement into Business Central (CSV format, setup wizard, PDF)
- Free sample OFX file (bank and credit card), explained
- camt.053 format explained: every XML element, with a real example
- Catch-up bookkeeping: getting 12 months of bank statements into QuickBooks or Xero and reconciled
- How to find a bank reconciliation discrepancy: 7 causes and a 15-minute method
Related tools
- Bank reconciliation checker: compare a bank statement to your books and list missing, duplicate and mismatched transactions.
- Receipt to CSV: turn PDF or photo receipts and invoices into CSV, Excel, or QuickBooks and Xero bill imports.