Bank reconciliation in Odoo 19 is an Enterprise feature. Statement lines arrive through online bank synchronisation or a file import. Odoo matches them to open invoices, bills and payments automatically, and reconciliation models deal with the recurring rest, such as bank charges. Odoo 19 also creates simple rules on its own when you code the same kind of transaction to the same account more than once.
What Community and Enterprise give you
The Community Invoicing app has bank journals, payments and the underlying reconciliation engine, but no bank reconciliation screen and no statement import. The reconciliation screen, the auto-matching scheduled action and the Reconcile menu (Accounting › Closing) all come from account_accountant. It installs automatically in every Enterprise database, even one that only uses Invoicing.
If your team matches its bank in Odoo every week, you need Enterprise. There is no sensible Community workaround at any real volume.
Getting bank transactions in: sync or import
Each bank journal has a Bank Feeds field. In a standard Enterprise database it takes one of three values:
| Bank Feeds value | Module | When it fits |
|---|---|---|
| Undefined Yet | Community default | Nothing configured yet |
| Manual (or import …) | account_bank_statement_import with CSV, OFX and CAMT (QIF optional) | Your bank offers downloadable statements; the fallback when there is no sync |
| Online Synchronization | account_online_synchronization | Your bank is supported by Odoo's aggregator service |
Online synchronisation starts from Connect bank on the bank journal's dashboard card and then refreshes on a schedule. Coverage depends on the institution and the country, and the bank's consent expires and has to be renewed. Check your own bank in the connection dialog before you plan around it. Don't assume it works.
For file imports, CSV is the universal fallback. Build one import mapping per bank format and save it, so the monthly import takes seconds. Enterprise can also digitise statements from PDF scans (account_bank_statement_extract), which helps with the odd bank that only sends PDFs.
How Odoo 19 matches transactions automatically
After every import or sync, and daily through a scheduled action, Odoo tries to reconcile the new statement lines on its own. The logic in the 19.0 source works roughly in this order:
- Partner mapping. If a reconciliation model maps a label pattern to a partner, that partner is set on the line first.
- Reference match. Odoo looks for open invoices, bills and payments whose reference appears in the transaction. This is why customers should pay with the invoice number as the payment reference.
- Amount match. Without a reference, it looks for a single open item for that partner with the same amount. It also accepts the early-payment discounted amount within the discount period, or a small difference.
- Tie-break. If several invoices qualify, it takes the latest one dated on or before the transaction.
Everything else waits in the reconciliation screen, which you open from the bank journal's "to reconcile" button on the dashboard. Each line can be matched to journal items, given a partner (Set Partner) or posted to an account (Set Account). Any reconciliation model buttons that apply are one click away.
Payments registered earlier sit on the outstanding receipts or payments account with the status "In Process". Matching the bank line clears that account and moves the invoice from "In Payment" to "Paid".
Reconciliation models: the rules you write
Reconciliation models are under the bank journal's dashboard menu (Reconciliation › Models). In Odoo 19 a model has:
- Trigger: Manual (shown as a button or proposal) or Automated (applied without anyone clicking).
- Conditions: which journals, an amount range (lower than, greater than, between), a label test (Contains, Not Contains, Match Regex) and specific partners.
- Counterpart lines: the account, a fixed amount, a percentage of the balance or of the statement line, or an amount read from the label with a regex. Each line can carry taxes and analytic distribution.
- An optional Next Activity, useful when a posted line still needs a document from someone.
Every chart of accounts comes with two models: Internal Transfers, and Bank Fees (label contains "Bank Fees"). Rename the Bank Fees label test to whatever your bank actually prints. In India that is often an NEFT, IMPS or SMS charge description, and GST on bank charges belongs on the counterpart line as a tax.
A model with a label condition and one line that has a partner but no account works as partner mapping. It only sets the partner, and invoice matching then does the rest. This is the tidy way to deal with payment gateways and UPI collections, which arrive with cryptic labels.
Rules Odoo 19 creates by itself
In the 19.0 code, when you use Set Account on a line and several recent lines in the same journal went to the same account, Odoo looks for the text their labels have in common. If it finds some, it creates a reconciliation model automatically, with a Match Regex condition and that account. It then offers the rule on other open lines that fit.
It also cleans up after itself. If a rule Odoo created proposes an account and you choose a different one, that rule is deleted. Review the automatically created models monthly anyway. A pattern that is too broad (a common word such as "PAYMENT") can post the wrong things quietly if someone switches it to Automated.
Aim for the reconciliation screen to hold only real exceptions. If you code the same line by hand every month, it should be a model.
A weekly routine that keeps the bank clean
- Import or sync all bank journals on the same day each week, not just at month end.
- Clear the automatic matches first, then the model proposals, then the exceptions.
- Keep the Bank Suspense account at zero by month end. Anything left there is unexplained money.
- Check that outstanding receipts and payments only hold items from the last few days.
Next in the series: GST compliance in Odoo 19. If you want your bank formats and rules set up properly the first time, talk to us.
Questions we get asked
Is bank reconciliation available in Odoo 19 Community?
No. Odoo 19 Community has bank journals and payments but no bank reconciliation screen, statement import or bank synchronisation. Those come from the Enterprise module account_accountant and its statement import and online synchronisation add-ons. That module installs automatically in Enterprise databases, including those that only use the Invoicing app.
Can Odoo 19 connect directly to Indian bank accounts?
Odoo 19 Enterprise offers online bank synchronisation through Odoo's aggregator service, but coverage depends on the institution and country. Check your bank in the Connect bank dialog before relying on it. Where no connection exists, download statements in CSV, OFX or CAMT format and import them into the bank journal, which works with practically any bank.
What is a reconciliation model in Odoo?
A reconciliation model is a rule that tells Odoo how to handle bank statement lines that match certain conditions: journal, amount range, label text or partner. It either proposes or automatically posts counterpart lines to set accounts, with taxes and analytics, or it simply sets the partner on the line. Typical uses are bank charges, internal transfers and payment gateway settlements.
Does Odoo 19 learn reconciliation rules automatically?
Yes. When you post a statement line to an account and several recent lines in the same journal went to that account, Odoo 19 Enterprise finds text their labels share and creates a reconciliation model with a regex condition for it. If you later pick a different account on a line that rule proposed, Odoo deletes the rule.