How to Create Odoo Accounting Reports Without Code

blog-banner

Introduction

When running a business, numbers speak louder than words. But if those numbers are buried deep inside spreadsheets or reports you can’t tweak, their value gets lost. That’s why Odoo has invested heavily into its reporting framework: to give you powerful, no-code accounting reports in Odoo that adapt to your needs.

Think of it like this: instead of asking your IT team every time you need a slightly different view of your balance sheet, you can shape the reports yourself. Whether you’re a CFO fine-tuning a tax declaration, or an accountant grouping sales by team, Odoo gives you the flexibility to do it in just a few clicks.

In this blog, let’s explore how Odoo’s reporting engine works and how you can build your own reports step by step just like you’d expect from modern business software that adapts to you, not the other way around.

Core Elements and their configurations

Before jumping into building, let’s understand the building blocks. Odoo reporting is like LEGO: you get pieces (reports, lines, expressions, columns) that you can combine in different ways.

Here are the key concepts you should know:

  • Root Reports – These are the “master templates” of accounting reports. They are neutral and generic.

Imagine you run a global company. You create a Generic Tax Report as a root report. Your French and US subsidiaries will both use this same root as a base, but apply their own local tax rules as variants.

  • Variants – These are localized or customized versions of root reports.

Your Belgian company needs a VAT Report (BE) that follows Belgian tax regulations. Instead of building from scratch, you simply create a variant of the Generic Tax Report. This maintains consistency across your group but adapts to local compliance.

  • Lines – Every report is made of lines. Each line represents a value you want to display, like Revenue, Expenses, or Adjustments.

In a Profit & Loss report, you add a line called Marketing Expenses to track all advertising costs separately. This gives your CEO immediate insight into how much is being spent to acquire customers.

  • Expressions – Think of expressions as the “brains” behind each line. They tell Odoo how to calculate that number.

For the line Revenue, you add an expression that sums all journal items with the account prefix “70”. That way, any time revenue is booked, it’s automatically reflected here — no manual work needed.

Computation Engines – Odoo offers different ways to calculate numbers:

  • Odoo Domain: Pulls data straight from accounting entries.

 You want to show all sales invoices that are still unpaid → Domain engine filters move_type = 'out_invoice' and payment_state != 'paid'.

  • Tax Tags: Based on +tag and -tag logic.

For Belgian VAT, the formula 21 automatically pulls lines tagged with +21% VAT and subtracts lines tagged with -21%.

  • Aggregate Other Formulas: Lets you combine results.

 You define Gross Profit = Revenue – Cost of Goods Sold by simply referencing the two lines.

  • Prefix of Account Codes: Matches accounts by their number prefix. 

In a European chart, all asset accounts start with “1”. So, creating a Total Assets line with formula 1 instantly covers the whole group.

  • External Values: For manual or carryover adjustments.

At year-end, you need to add a Statutory Adjustment value your auditor gave you. With an editable external value, you can key it in directly.

  • Custom Python: For developers only.

Suppose your industry has a regulation requiring a custom calculation of Carbon Credits per sale. Your dev team can plug in a Python function to compute this line.

Columns – Reports can display multiple periods, comparisons, or measures by defining columns.

In a cash flow report, you create three columns: This Month, Previous Month, and Change (%). In one glance, management sees not only the totals, but also the trend.

Grouping – Instead of a flat list of numbers, you can group lines by analytic accounts, sales teams, or other fields.

 Your sales director wants to see revenue split by sales team. You add grouping on analytic_account_id, and suddenly the P&L breaks down team by team — perfect for performance reviews

For consolidating and other features of Custom Reports you can look into Odoo’s official document “https://www.odoo.com/documentation/18.0/applications/finance/accounting/reporting/customize.html”

Example Walkthrough: Building a “Departmental Expense & Income Analysis” Report

We want to track income and expenses by department (Marketing, R&D, Sales, etc.) using analytic accounts. The report will show:

  • Departmental Income

  • Departmental Expenses

  • Manual Adjustments

  • Net Profit / Loss

Step 1: Create a New Root Report

Create a new report in Accounting → Configuration → Accounting Reports, name it Departmental Expense & Income Analysis, and add it to the menu. This is the first step in building custom accounting reports in Odoo.

Step 2: Group by Department

Use the built-in field analytic_account_id so results are grouped by department.

Step 3: Add Report Lines

  • Line 1: Department Income → Uses the Odoo Domain engine to pull all journal items linked to income accounts. This ensures that any sales or revenue entries are automatically included and grouped by department.

Odoo report customization

  • Line 2: Department Expenses → Uses the Prefix of Account Codes engine (accounts starting with 961–962 expense account). These are standard expense accounts in most charts of accounts, so this line captures operating costs per department. We can use this kind of formulas for

Odoo report customization

  • Line 3: Manual Adjustments → Uses the External Value engine with editable enabled. This gives you flexibility to enter corrections or year-end adjustments directly in the report without touching journal entries.

Odoo report customization
 

  • Line 4: Net Result → Uses the Aggregate Formulas engine to calculate: Income – Expenses + Adjustments. This line provides the bottom-line profit or loss per department at a glance.

Odoo report customization

Step 4: Add Columns

Define four columns: Income, Expenses, Adjustments, Net Result (All fields monetary type) in the column section which is next to Line section

 
Final Report View

Click on the Cog menu and then go for “Create Menu Item” you will notice that in the Reporting section at the last you’ll have your customized report “Departmental Expense & Income Analysis” click on it and see the result, which would look like this,

Odoo report customization

We can see the total income with formulas as well as the four columns we added are perfectly visible in the report, from here you can download it, customize it as well as the third field of Adjustment, you can write your own values by clicking on edit icon. This is the beauty of Odoo Custom Reports.

Odoo report customization

Try It Yourself (Mini Task for Readers)

Now it’s your turn!

  • Copy the default Profit & Loss report.

  • Add one new line: Net Profit Margin.

  • Formula: (Net Profit / Revenue) * 100.

Odoo report customization

Easy-Peasy! As you can see in the image, we have used the Net profit code and the Revenue code from the above fields for creating formulas. This is how we learn- Adapt and Execute!

Conclusion

You just saw how easy it is to customize reports in Odoo. No coding, no heavy setup, just smart use of fields, a bit of math, and clear configurations. With the right approach, you can shape reports to match your business needs in minutes.

The beauty of Odoo report customization is that it transforms raw numbers into meaningful insights. At the end of the day, it’s not about how much data you have, but how clearly you can see the story it tells.

Remember: businesses are better with good technology, but they become great with smarter technology. A custom report layout in Odoo makes this transformation possible by turning complex data into clear, actionable insights.

If you’re ready to get the most out of Odoo and unlock deeper insights, connect with Surekha Technologies, we’re here to help.

Contact us

For Your Business Requirements

Text to Identify Refresh CAPTCHA