All posts
General8 min read

Odoo chart of accounts: account types, account groups, and the trial balance

The chart of accounts in Odoo determines how every accounting entry is classified and reported. This guide explains account types, account groups, the relationship between accounts and tax codes, and how to read the trial balance to verify your setup.

Every number in Odoo's financial reports - profit and loss, balance sheet, cash flow - traces back to a single source: the chart of accounts. Understanding how the chart is structured, what account types mean, and how groups control report presentation is essential before you configure a new company or troubleshoot a mis-classified entry.

What the chart of accounts is#

The chart of accounts is the complete list of accounts (account.account) that your company uses to record financial transactions. Every journal entry in Odoo must debit and credit specific accounts. The account's type and grouping determine where those entries appear in financial reports.

Navigate to Accounting → Configuration → Chart of Accounts to see all accounts. Each row shows the account code, name, type, and whether it's a reconcilable or group account.

Account types and what they control#

Every account has a Type field (account_type in the ORM). The type is not just a label - Odoo uses it to:

  • Determine whether the account appears on the balance sheet (assets, liabilities, equity) or the P&L (income, expense).
  • Control how the account behaves in bank reconciliation (Current Assets accounts can be reconciled).
  • Set the default tax behavior for transactions on that account.
  • Classify lines on cash flow reports.

The standard account types in Odoo 17:

TypeBalance sheet / P&LTypical use
ReceivableBalance sheet (Assets)Customer AR sub-ledger
PayableBalance sheet (Liabilities)Vendor AP sub-ledger
BankBalance sheet (Assets)Bank and cash accounts
Current AssetsBalance sheet (Assets)Inventory, prepaid, deposits
Non-current AssetsBalance sheet (Assets)Fixed assets, intangibles
Current LiabilitiesBalance sheet (Liabilities)VAT payable, accruals
Non-current LiabilitiesBalance sheet (Liabilities)Long-term debt
EquityBalance sheet (Equity)Share capital, retained earnings
Current Year EarningsBalance sheet (Equity)Computed: sum of P&L accounts
IncomeP&L (Revenue)Sales revenue
Other IncomeP&L (Revenue)Non-operating income
ExpenseP&L (Expense)COGS, operating expenses
DepreciationP&L (Expense)Asset depreciation
Cost of RevenueP&L (Expense)Direct cost of goods sold
Off Balance SheetNeitherCommitments, contingencies

Current Year Earnings is special: you cannot manually post to this account. Odoo computes it dynamically as the sum of all income minus expense accounts for the current fiscal year. It appears on the balance sheet so the statement balances.

Receivable and Payable accounts#

Accounts typed as Receivable or Payable are sub-ledger accounts. Every journal entry that posts to a Receivable account must include a partner (res.partner). Odoo enforces this at entry time.

This partner-linking is what makes the aged receivable/payable reports work: Odoo aggregates all open entries by partner, not by account. If you post a customer payment to a generic "Other Receivables" account without a partner, it will not appear in the aged receivable report.

In most localizations, there is one Receivable account (e.g., 1100 Accounts Receivable) and one Payable account (e.g., 2100 Accounts Payable). The partner detail lives in the partner ledger, not in separate sub-accounts per customer.

Account groups and financial report layout#

Account groups (account.group) define the hierarchy that controls how accounts aggregate in financial reports. A group has:

  • Code Prefix Start / End: Odoo automatically assigns an account to a group when the account code falls within the prefix range. No manual assignment needed.
  • Parent Group: Creates multi-level hierarchies (e.g., "Current Assets" → "Cash and Cash Equivalents" → individual bank accounts).
  • Name: The label shown in reports.

When you run the Balance Sheet or Profit & Loss report, Odoo sums accounts within each group and displays subtotals at each hierarchy level. If your account codes don't fall within any group's prefix range, those accounts appear ungrouped at the bottom of the report - a sign that your localization's account groups need updating.

To inspect groups: Accounting → Configuration → Account Groups (enable developer mode to see the menu).

The trial balance#

Accounting → Reporting → Trial Balance shows every account with its opening balance, debit/credit movements for the period, and closing balance. It is the most complete diagnostic report for verifying your chart of accounts.

Use the trial balance to:

  • Confirm account classifications: If a revenue account shows up in the Balance Sheet section, its type is wrong.
  • Find unexpected balances: An income account with a debit balance (after year-end close) means an entry was posted in the wrong direction.
  • Verify zero-balance control accounts: Your intercompany clearing account should net to zero if all intercompany entries are balanced.

Filter the trial balance by Journal to isolate specific entry types (e.g., show only stock valuation entries to audit inventory).

Default accounts on taxes and products#

Taxes use accounts to determine where the tax amount posts:

  • Tax Account (Debit/Credit): Where the tax balance goes on the vendor bill or customer invoice.
  • Tax Group → Tax Payable Account: Aggregated tax balance shown on the tax report.

Products and product categories use accounts for:

  • Income Account: Where revenue from selling this product posts.
  • Expense Account: Where the cost posts when purchasing or expensing this product.
  • COGS Account (product category): Where the cost of goods posts when the delivery is validated for a storable product.

Getting these defaults wrong is the most common source of mis-classified entries. Check them at setup time by creating a test invoice and inspecting the journal entry before posting.

Fiscal positions and account mapping#

Fiscal positions (account.fiscal.position) can remap accounts on invoices based on the customer's or vendor's country or tax registration status. A fiscal position can replace:

  • Tax: e.g., replace domestic 20% VAT with zero-rated for intra-EU customers.
  • Account: e.g., replace the domestic revenue account with an export revenue account.

Account mapping in fiscal positions means the account on an invoice line may differ from the product's income account - always check the fiscal position when debugging unexpected account usage on international transactions.

Localizations and pre-configured charts#

When you install a country localization (l10n_fr, l10n_ca, etc.), Odoo installs:

  • A pre-built chart of accounts matching local accounting standards (PCG, IFRS, etc.).
  • Account groups configured to match the local balance sheet / P&L report format.
  • Default taxes with correctly typed accounts.
  • Fiscal positions for common cross-border scenarios.

If you install the localization after creating your company (not recommended), some accounts may be missing. Run Accounting → Configuration → Chart of Accounts → Import or reinstall the localization module.

Common mistakes#

Posting to the wrong account type: Posting a prepaid expense to an Expense account (instead of Current Assets) will inflate costs immediately instead of amortizing them.

Creating custom accounts without setting account groups: New accounts with codes outside the group prefix range won't appear correctly in financial reports. Either adjust your code to fall within an existing group, or create a new group that covers the new code range.

Deleting accounts that have posted entries: Odoo prevents deletion but allows archiving. Archived accounts no longer appear in account selection dropdowns but retain their history. Never archive an account that has open (unreconciled) entries.

Using the same account for Receivable and bank: The Receivable account type creates a sub-ledger expectation (partner required). A bank account must be typed Bank. Mixing them breaks reconciliation.


For bank reconciliation setup, see the Odoo bank reconciliation guide. For tax configuration and fiscal positions, see the Odoo localization tax guide.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free