All posts
General10 min read

Odoo financial reporting: P&L, balance sheet, cash flow, and custom dashboards

A walkthrough of Odoo Accounting financial reports - generating the income statement, balance sheet, and cash flow statement, and building custom report templates.

Odoo Accounting includes a full set of standard financial reports plus a configurable report engine for custom layouts. This guide covers how to generate the standard reports, customize them, and build a CFO-ready reporting workflow.

Standard financial reports#

Navigate to Accounting → Reporting to find the built-in reports. The most commonly used:

ReportPathDescription
Profit and LossReporting → Profit and LossIncome minus expenses by account group
Balance SheetReporting → Balance SheetAssets, liabilities, and equity at a date
Cash Flow StatementReporting → Cash Flow StatementOperating, investing, financing activities
Executive SummaryReporting → Executive SummaryKPI dashboard with key ratios
Aged ReceivableReporting → Aged ReceivableCustomer balances by aging bucket
Aged PayableReporting → Aged PayableVendor balances by aging bucket
Tax ReportReporting → Tax ReportVAT/GST balances by tax code

Profit & Loss report#

Open Accounting → Reporting → Profit and Loss. The report shows revenue and expense accounts grouped into sections defined by your Account Groups configuration.

Date range and comparison#

Use the date picker at the top to set the reporting period. Click Comparison to add a prior period column:

  • Previous Period (e.g., prior month for a monthly P&L)
  • Same Period Last Year (year-over-year comparison)
  • Custom Date Range (compare any two periods)

The comparison column shows both absolute and percentage variance.

Filtering by journal#

By default, the P&L includes all posted journal entries. Use the Journals filter to restrict to specific journals (e.g., exclude the depreciation journal for a pre-depreciation view, or include only the Sales and Purchase journals for a quick trading P&L).

Drill-down#

Click any line amount to drill into the individual journal entries contributing to that balance. The drill-down view shows the move lines with document references, allowing you to investigate unexpected balances without leaving the report.

Balance Sheet#

Open Accounting → Reporting → Balance Sheet. Like the P&L, it uses account groups to organize assets, liabilities, and equity.

Key setup requirement: For the balance sheet to balance (Assets = Liabilities + Equity), your account groups must be configured correctly. The retained earnings account must be mapped in Accounting → Configuration → Settings → Default Accounts → Retained Earnings. Odoo calculates net income as a computed equity component from the P&L - it does not require a year-end close entry to post net income to retained earnings.

Multi-company consolidation#

If your database has multiple companies and you have the Consolidation feature (Enterprise), the Balance Sheet filter includes a Companies selector. Select multiple companies to see a consolidated balance sheet with intercompany elimination lines.

Cash Flow Statement#

Accounting → Reporting → Cash Flow Statement generates an indirect-method cash flow statement: starts with net income, then adjusts for non-cash items and working capital changes.

The cash flow statement requires correct Cash Flow Tags on each account. These tags classify accounts as:

  • Operating Activities (trade receivables, payables, inventory)
  • Investing Activities (fixed asset purchases and sales)
  • Financing Activities (loans, equity)

Review your account configuration under Accounting → Configuration → Chart of Accounts and verify each account has the correct cash flow tag. Accounts without a tag are excluded from the statement, which causes the statement to not reconcile to the change in cash.

Custom report configuration#

The report engine is extensible. From Accounting → Configuration → Financial Reports, you can create or modify report templates.

A custom report template defines:

  • Lines: each line has a name, expression, and grouping logic
  • Formulas: reference account balance functions (sum(account_id.balance), count_entries())
  • Domain: filter by account type, journal, or custom domain
  • Hierarchy: indent levels for summary/detail layout

This is the mechanism behind all the standard reports - they are all defined as report templates in the system, which you can inspect and copy as a starting point for custom layouts.

Common custom report use cases#

  • Department P&L using analytic account filters to show profitability by cost center
  • Project profitability combining revenue and timesheet cost by project
  • Budget vs actual by adding budget lines alongside actual balance expressions
  • Rolling 12-month view using date range formulas that reference the current date minus 12 months

Locking periods and audit trail#

After month-end review, lock the accounting period to prevent retroactive adjustments. Navigate to Accounting → Accounting → Lock Dates:

  • Lock Date for Non-Advisors - prevents regular users from posting in locked periods
  • Lock Date for Advisors - harder lock that requires the Accounting Advisor role to override

An audit trail of every journal entry modification is available in Accounting → Reporting → Audit Reports → Journal Audit. This report shows who created or modified each entry and when.

Exporting reports#

Each financial report has an Export button in the toolbar:

  • PDF - formatted report via the browser print/PDF dialog
  • XLSX - Excel file with account totals (no formulas - use for presentation, not for further calculation)

For Excel-based reporting that updates from live Odoo data, use the Spreadsheet feature (Enterprise): Accounting → Reporting → Spreadsheet to create a spreadsheet with live pivot tables connected to Odoo data.

CFO dashboard via Accounting Overview#

Accounting → Overview is the default landing page for accountants. It shows:

  • Bank and cash balances
  • Bills and invoices due today vs this week vs overdue
  • Expense reports awaiting approval
  • Recent journal entries with anomaly highlighting

For a CFO-level dashboard with revenue trends, receivable aging, and cash runway, install the Dashboards app and use the pre-built Accounting KPI tiles or build a custom layout using the available Odoo data sources.

Common reporting mistakes#

  • P&L not matching expectations: Check that all expense accounts have the correct account type (Expense, not Asset). Misclassified accounts appear in the wrong report section.
  • Balance sheet not balancing: Usually caused by a missing cash flow tag or an account incorrectly classified between balance sheet and income statement types.
  • Comparison not showing: The comparison feature requires that the prior period also has a fiscal year defined. Check Accounting → Configuration → Fiscal Years.
  • Cash flow statement showing zero: All accounts have no cash flow tag set. Add tags starting with the cash/bank accounts (mark as Operating Activities) and work outward.

Ask ERPeek to explain specific line items in your Odoo financial reports - "Why is the trade receivables balance different from the aged receivable report total?" or "Which journal entries contributed to the unexpected expense balance in account 6100?"

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

Get started free