3.1 Bank, cash & reconciliation

Key Takeaways

  • In Odoo 19, each bank account is a journal of type Bank and each cash box a journal of type Cash, both linked to a general-ledger account of type Bank and Cash.
  • Registering a payment on a customer invoice posts to the Outstanding Receipts account first; reconciling the matching bank statement line later clears that account into the real bank account.
  • Bank transactions enter Odoo through live bank synchronization, file import (CAMT.053, OFX, QIF, CSV/XLSX), or manual statement entry.
  • Reconciliation models come in three types — button to generate a counterpart, rule to match invoices/bills, and rule to suggest counterpart values — and trusted rules can reconcile lines automatically.
  • Internal transfers between two bank accounts route money through the internal transfer account, which returns to zero once both banks' statement lines are reconciled.
Last updated: July 2026

Bank and cash journals

Odoo 19 represents every bank account and cash box as a journal. A bank account uses a journal of type Bank; petty cash uses a journal of type Cash. When you add a bank account under Accounting ▸ Configuration ▸ Journals, or through the setup banner on the Accounting dashboard, Odoo creates the journal, links it to a general-ledger account of type Bank and Cash, and assigns a short code that prefixes every entry number (for example BNK1). A cash journal behaves the same way but is normally reconciled against a physical cash count rather than an imported statement.

Two behind-the-scenes accounts make the workflow work. The suspense account temporarily holds statement lines that have not yet been reconciled, so the bank journal's balance always ties to the real bank balance even before matching is finished. The outstanding receipts and outstanding payments accounts hold payments that have been registered against invoices or bills but that have not yet appeared on a statement. Each journal stores its own default outstanding accounts, which you can override in the journal's Incoming/Outgoing Payments settings, and understanding these intermediary accounts is essential for the exam.

Importing and synchronizing statements

You get transactions into Odoo in three ways:

  • Bank synchronization — connect a live feed through one of Odoo's providers (Ponto, Salt Edge, Yodlee, and others); new transactions download automatically, usually once a day.
  • File import — upload a statement file. Odoo reads CAMT.053, OFX, QIF, and CSV/XLSX; the CSV path includes a column-mapping step so Odoo knows which fields are the date, label, and amount.
  • Manual entry — type statement lines directly onto the journal when you have only a handful of transactions.

Every imported line becomes a bank statement line waiting to be reconciled, Odoo flags likely duplicate imports, and the bank journal card on the dashboard shows how many items are still open. Cash journals follow the same idea, except you open the cash register, record the day's receipts and expenses, and reconcile against the counted balance rather than a file.

The reconciliation workflow

Reconciliation is where a statement line is matched to what it represents in the ledger. Click Reconcile on the bank journal card to open the reconciliation widget. For each line Odoo suggests likely matches, and you settle it in one of three ways:

  1. Match an existing entry — the line pays a specific customer invoice or vendor bill, or clears a payment already sitting in an outstanding account.
  2. Create a counterpart — no invoice exists, so you post the line straight to an account (bank charges to a fee expense, interest received to income, and so on).
  3. Write-off or partial — absorb rounding, fees, or a partial settlement in the same screen.

When you validate the line, Odoo posts a journal entry that debits or credits the real bank account and clears the counterpart, moving the amount out of the suspense account. You can also record a statement's ending balance; if the reconciled total does not match it, Odoo flags the difference so you can find missing lines before closing the period.

How outstanding accounts are cleared

The two-step payment model is a frequent exam point. Registering a payment on a customer invoice posts Debit Outstanding Receipts / Credit Accounts Receivable — the invoice is now marked Paid, but the cash has not physically landed yet. When the matching statement line is later reconciled, Odoo posts Debit Bank / Credit Outstanding Receipts, so the outstanding account nets to zero and the balance moves into the real bank account. Vendor payments mirror this through the Outstanding Payments account. If instead you reconcile a statement line directly against the invoice without registering a payment first, Odoo simply generates both legs in a single entry.

Reconciliation models

Reconciliation models (Accounting ▸ Configuration ▸ Reconciliation Models) automate repetitive matching. Odoo offers three types:

TypeWhat it does
Button to generate counterpart entryAdds a one-click button in the widget (e.g., "Bank Fees") that fills a preset account and amount
Rule to match invoices/billsAuto-matches a line to open invoices or bills using partner, amount, and label
Rule to suggest counterpart valuesProposes an account, partner, or taxes for recurring lines such as monthly rent

Matching conditions can restrict a rule by journal, partner, amount range, and text found in the label or reference. A trusted rule can be set to reconcile automatically, so recognized transactions clear with no clicks at all — a major time-saver for high-volume accounts.

Internal transfers

Moving money between two of your own bank accounts uses an internal transfer. Register a payment with the Internal Transfer option, choosing a source and a destination journal. Odoo routes the movement through the internal transfer account so both journals stay balanced: the money leaves the first bank, sits momentarily in the transfer account, and is cleared when the corresponding line on the second bank's statement is reconciled. Because each statement is reconciled independently, the transfer account naturally returns to zero once both sides have cleared. The same logic lets you deposit cash from a cash journal into a bank account.

Test Your Knowledge

You click Register Payment on a customer invoice, but the bank statement for that deposit has not been imported yet. Which account does Odoo debit at this stage?

A
B
C
D
Test Your Knowledge

What does a reconciliation model of type 'Rule to match invoices/bills' do?

A
B
C
D
Test Your Knowledge

When you move money between two of your own company bank accounts in Odoo, the amount is held in which account until the statement line on the receiving bank is reconciled?

A
B
C
D