All posts
Integrator8 min read

Odoo analytic accounting: cost centers, analytic plans, and cross-module allocation

Analytic accounting in Odoo assigns financial transactions to cost centers independently of the general ledger. Analytic plans add a second dimension. Understanding the allocation flow across invoices, timesheets, and manufacturing is where most implementations go wrong.

Analytic accounting adds a management reporting dimension to financial transactions that the general ledger chart of accounts does not provide. A revenue line hits account 7000 (Sales Revenue) in the P&L; the analytic line assigns the same revenue to the "North America Region" and "Project Alpha" cost centers simultaneously. This is the distinction that most finance teams ask for after go-live when they realize the standard reports cannot answer "how much did Project Alpha cost this quarter?"

Enabling analytic accounting#

Accounting → Configuration → Settings → Analytic Accounting: enable.

This activates:

  • Analytic accounts (cost centers).
  • Analytic distribution on journal entry lines.
  • Analytic plans (grouping of accounts by dimension).
  • Analytic reports.

Analytic accounts (cost centers)#

Accounting → Configuration → Analytic Accounts → New:

Name:    North America Sales
Code:    NA-SALES
Plan:    Sales Region (optional)
Group:   External Revenue

Create one account per cost center, department, project, or region you want to track separately.

Analytic groups organize accounts into a hierarchy for reporting but do not affect data entry or allocation.

Analytic plans#

Analytic plans (Accounting → Configuration → Analytic Plans) let you assign multiple analytic dimensions to a single transaction. Without plans, one transaction gets one analytic account. With plans, one transaction can carry allocations from multiple plans simultaneously.

Example plans:

  • Business Unit: Americas, EMEA, APAC.
  • Department: Sales, Engineering, Operations.
  • Project: Project Alpha, Project Beta.

When you configure three plans, every invoice line can carry:

  • 100% → Americas (Business Unit plan)
  • 70% → Engineering, 30% → Sales (Department plan)
  • 50% → Project Alpha, 50% → Project Beta (Project plan)

Percentages within a plan must sum to 100%. Across plans, each dimension is independent.

Setting analytic distribution on transactions#

On invoices:

Invoice line → Analytic Distribution column. Click to open the matrix. Select account(s) per plan and set percentage.

On vendor bills:

Same pattern. Vendor bill lines carry analytic allocation for expense tracking.

On journal entries (manual):

Journal entry line → Analytic Distribution field.

On timesheets:

Timesheets → My Timesheets → Analytic Account column. Each timesheet line assigns to one analytic account. To distribute across plans, use the Distribution field on the timesheet line (requires analytic plans enabled).

On purchase orders:

Purchase order line → Analytic Distribution. When the vendor bill is generated from the PO, the analytic distribution copies automatically.

On manufacturing orders:

Manufacturing → [Order] → Component tab → Analytic Distribution per component line.

Analytic distribution templates#

For recurring distributions (e.g., "IT expenses always split 60% North America, 40% EMEA"), create a distribution template:

Accounting → Configuration → Analytic Plans → [Plan] → Distribution Models → New.

Set:

  • Account: the G/L account the template applies to.
  • Product: optional, narrow to a specific product.
  • Partner: optional, narrow to a specific partner.
  • Distribution: the analytic accounts and percentages.

When you create an invoice line matching the conditions, Odoo auto-fills the analytic distribution from the template. Manual override is always possible.

Reporting#

Analytic → Reporting → Analytic Account Report:

ReportWhat it shows
Balance Sheet by AnalyticAssets/liabilities broken down by cost center
Profit & Loss by AnalyticRevenue and expenses by cost center
Cost Center ReportAll transactions on an analytic account across all modules
Project ProfitabilityRevenue, costs, margin by project (requires Project module)

The Cost Center Report is the most useful day-to-day tool. Filter by analytic account, date range, and transaction type to see every journal entry, timesheet, and manufacturing cost charged to a specific cost center.

Project integration#

When the Project module is installed alongside analytic accounting, each project automatically creates an analytic account. Timesheets logged on project tasks credit the project's analytic account.

View project P&L: Project → [Project] → Profitability tab.

This shows:

  • Revenue: invoiced amounts linked to the project.
  • Costs: timesheets × hourly rate + vendor bills linked to project.
  • Margin: revenue − costs.

The hourly cost for timesheets comes from the employee's hourly rate (HR → Employees → [Employee] → Private tab → Cost per Hour).

Common implementation mistakes#

1. Not setting distribution on the vendor bill template.

If 80% of vendor bills from a specific supplier always hit the same cost center, create a distribution template. Without it, accountants set the distribution manually on every bill - and often skip it when busy, creating gaps in the analytic data.

2. Using one analytic account per general ledger account.

This recreates the G/L chart of accounts in analytic form and adds zero insight. Use analytic accounts for dimensions that cross multiple G/L accounts: a project has revenue (7000), labor costs (6000), and material costs (6100) - all linked to the same analytic account.

3. Forgetting to activate analytic on existing journal entries.

Enabling analytic accounting after months of transactions means historical data has no analytic allocation. Run a one-time data correction script or accept that historical analytic reports start from the activation date.

4. Not closing analytic accounts for completed projects.

Old projects accumulate new transactions if their analytic account stays open. Set a date_stop on completed project analytic accounts. Odoo prevents new allocations after that date.

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

Get started free