Horizontal Groups in Odoo 18 Accounting: Filter Financial Reports Like a Pro
By Braincuber Team
Published on February 26, 2026
You've got 3 companies running in one Odoo 18 instance, and your CFO wants to see the Balance Sheet for just Company B, for just fiscal year 2025. Without horizontal groups, you're exporting the entire report to Excel, deleting 47 columns you don't need, and emailing a manually trimmed spreadsheet. Every. Single. Month. Horizontal groups fix that — they let you slice financial reports by company, year, or any field domain, directly inside Odoo. No export. No VLOOKUP nightmares. No "oops, I deleted the wrong column."
What You'll Learn:
- What horizontal groups actually do inside financial reports (not the Wikipedia version)
- How to create and configure a new horizontal group from the Accounting module
- Setting up domain rules to filter by company, fiscal year, or custom criteria
- Applying horizontal groups to Balance Sheet and Profit & Loss reports
- Why this saves your finance team roughly 8.5 hours per month on report slicing
The Problem Horizontal Groups Solve
Financial reports in Odoo display account data vertically by default. Every account line stacks on top of the next — Current Assets, then Fixed Assets, then Operating Expenses, all the way down. That's fine for a single company in a single year.
But when you're running a multi-company setup? Or need to compare FY 2024 vs FY 2025 side-by-side? The default vertical layout turns your Balance Sheet into a 200-row scroll-fest where no one can spot the $14,300 variance tucked between line 87 and line 143.
Horizontal groups let you arrange comparable data side by side in columns. Instead of scrolling through one massive vertical list, related account categories sit next to each other — income streams, operating expenses, asset categories — making it possible to spot anomalies in seconds, not hours.
Report Filtering
Filter Balance Sheet and P&L data by specific domain rules. Show only Company B's assets. Show only FY 2025 expenses. No Excel required.
Side-by-Side Comparison
Comparable accounts sit next to each other horizontally. Revenue streams, cost categories, asset types — all visible in one row instead of 47 separate lines.
Anomaly Detection
Spot variances between companies, fiscal years, or budget vs. actuals by comparing columns visually. The $14,300 discrepancy jumps out when it's sitting right next to the expected figure.
Cleaner Exports
PDF and Excel exports look professional without manual formatting. The horizontal layout carries through to exported files — no more post-export cleanup.
Where to Find Horizontal Groups
Horizontal groups live inside the Accounting module's configuration. Not in Settings. Not in the chart of accounts. In the Accounting tab under Configuration.
This opens the list view of all previously configured horizontal groups. Each entry shows the group name and which reports it's assigned to. If you've never touched this before, it'll be empty. That's about to change.
Creating a New Horizontal Group
Here's the step-by-step process to create a horizontal group that filters your Balance Sheet by company. We're using "Company Wise" as the example — the most common use case we see across multi-entity D2C setups.
Navigate to Horizontal Groups
Open the Accounting module. Go to Configuration > Accounting > Horizontal Groups. You'll see the list of existing groups (or an empty list if this is your first time).
Click "New"
Hit the New button in the top-left corner. Odoo opens the configuration form for your new horizontal group.
Name the Horizontal Group
Enter a descriptive name in the Name field. Example: "Company Wise" or "FY 2025 Only". Keep it short — this name appears in the report filter dropdown.
Assign Reports
In the Reports field, select which financial reports should use this group. Choose Balance Sheet, Profit and Loss, or both. You can add multiple reports to the same group.
Add Domain Rules (Click "Add a Line")
Click Add a Line to open the rule configuration popup. Enter the field name and set the domain to filter by. For company-wise filtering, use the company_id field with the appropriate domain operator.
Save & Close the Rule
Click Save & Close in the popup. The domain rule gets added to your horizontal group. Repeat for additional rules if you need multiple filter criteria.
Save the Horizontal Group
Save the entire horizontal group record. It's now available in the assigned reports' filter options.
Domain Rule Configuration
The domain rule is where horizontal groups get their power. When you click "Add a Line," the popup asks for two things: a field name and a domain expression. The domain works exactly like Odoo's standard domain syntax — same operators, same field references.
| Use Case | Field Name | Domain Example |
|---|---|---|
| Filter by Specific Company | company_id | [('company_id', '=', 1)] |
| Filter by Fiscal Year | date | [('date', '>=', '2025-01-01'), ('date', '<=', '2025-12-31')] |
| Filter by Multiple Companies | company_id | [('company_id', 'in', [1, 3])] |
| Exclude Specific Company | company_id | [('company_id', '!=', 2)] |
| Filter by Journal Type | journal_id.type | [('journal_id.type', '=', 'sale')] |
Domain Gotcha
The domain you set here filters account.move.line records, not account types. If your domain references a field that doesn't exist on account.move.line, Odoo will throw a cryptic KeyError when you try to generate the report. Test the domain in Odoo's developer console first — before you attach it to a horizontal group your CFO uses daily.
Applying Horizontal Groups to Reports
Once you've configured the horizontal group, it shows up as a filter option inside the financial report. Here's how to apply it to your Balance Sheet.
Open the Balance Sheet Report
Navigate to Accounting > Reporting > Balance Sheet. The report loads with the default view — all companies, all periods, one vertical list.
Select the Horizontal Group
Look for the Horizontal Group dropdown in the report's filter/options area. Select your newly created group — e.g., "Company Wise".
Review the Filtered Data
The report now displays data filtered by your domain rules. If you set up a company-wise group, you'll see the Balance Sheet broken down by company — each company's data in its own column, side by side.
Horizontal Groups vs. Standard Report Filters
"But can't I just use the regular company filter in the report header?" Sure. But here's the difference that matters.
| Capability | Standard Filter | Horizontal Group |
|---|---|---|
| Company Filtering | Shows one company at a time | Shows multiple companies side-by-side in columns |
| Custom Domain Support | Limited to predefined options | Full Odoo domain syntax — filter by any field |
| Multi-Period Comparison | Requires separate report runs | FY 2024 and FY 2025 in one view |
| Export Quality | Manual post-export cleanup needed | Clean horizontal layout in PDF/Excel |
| Reusability | Reset every time you open the report | Saved configuration — select from dropdown |
Real-World Configuration Examples
Example 1: Company-Wise Balance Sheet
This is the one we configure for 7 out of 10 multi-company clients. Shows the Balance Sheet with separate columns per company.
Name = Company Wise
Reports = Balance Sheet, Profit and Loss
Rule Field = company_id
Domain = [('company_id', '=', target_company_id)]
Example 2: Fiscal Year Comparison
Compare FY 2024 and FY 2025 P&L data side by side. Great for board presentations where your investors want to see year-over-year growth without flipping between two PDF pages.
Name = FY Comparison
Reports = Profit and Loss
Rule 1 = date: [('date', '>=', '2024-01-01'), ('date', '<=', '2024-12-31')]
Rule 2 = date: [('date', '>=', '2025-01-01'), ('date', '<=', '2025-12-31')]
Common Mistakes That Break Horizontal Groups
We've debugged enough broken horizontal group setups to compile a list. If your horizontal group isn't showing data, check these first.
| Mistake | Symptom | Fix |
|---|---|---|
| Wrong field name in domain | KeyError when generating report | Verify field exists on account.move.line model |
| Report not assigned to group | Group doesn't appear in report dropdown | Edit the group and add the missing report |
| Domain filters too narrow | Report shows all zeros | Loosen the domain — check company IDs and date ranges |
| Using res.company field instead of company_id | No matching records found | Use company_id (Many2one integer), not company name string |
| No journal entries in filtered period | Empty columns in the report | Confirm posted journal entries exist within the domain's date/company range |
Enterprise-Only Feature
Horizontal groups are available in Odoo 18 Enterprise edition only. If you're running Community edition and wondering why the menu option doesn't exist — that's why. We've seen founders spend 3 hours searching for a menu that was never there.
When to Use Horizontal Groups (And When Not To)
Horizontal groups are powerful, but they're not for everything. Here's our honest take after configuring them across 40+ implementations.
Use When:
Multi-company environments needing per-entity financial reports. Year-over-year comparisons for board presentations. Budget vs. actuals analysis. Consolidated reporting for subsidiaries. Monthly close reviews across 3+ entities.
Skip When:
Single company, single fiscal year setup — regular filters work fine. Ad-hoc one-time queries — use the pivot view or export instead. Non-financial reports — horizontal groups only apply to accounting reports. Custom BI dashboards — use Odoo's spreadsheet or external tools.
Still Exporting Balance Sheets to Excel Every Month?
Our team has configured horizontal groups across 40+ Odoo 18 implementations. We handle multi-company report setups, domain rule configurations, consolidated financial statements, and cross-entity comparisons — so your finance team stops wasting 8.5 hours a month on spreadsheet surgery.
