Skip to content
Back to blog
4 min read

Odoo already has plenty of reports. Why we write more

The pivot view answers new questions. Dashboards freeze a view. Neither one stores the criteria, and the criteria is what gets argued about every Monday.

ReportsOdooAnalytics

Odoo ships with more reports than most companies ever use. Sales by rep, margin by product, aged balances, inventory valuation. On top of that it hands you the views to build your own without writing a line of code. Starting from scratch would be absurd.

We still write new reports anyway. Not because data is missing — it is all there — but because of what happens between the data and the decision.

Odoo reports are made for asking, not for answering

A typical Odoo report isn't a document: it's a view. You open a model, filter, group, switch to pivot, jump to a chart, export. It's an exploration tool, and as such it's among the best on the market. It lets you ask questions nobody anticipated, the moment they occur to you.

The price of that flexibility is that the question gets rebuilt every time. Filters and groupings live in the session of whoever set them up. Next Monday someone else walks in, picks a slightly different date range, forgets to exclude returns, and the number doesn't match last week's. The report isn't wrong. There was no report — there was a query.

For a question you ask once, that's perfect. For one you ask every week, it's an endless source of meetings about where each figure came from.

Dashboards freeze the view, not the criteria

Odoo answered this with the Dashboards app, built on Odoo Spreadsheet. You pin a view, drop it into a sheet with formulas that read live data, and stop depending on everyone rebuilding the filters. For a tracking panel — monthly sales, pipeline, collections — it works well, and it's what we recommend before proposing anything custom.

It gets steep when the report stops being a sum and starts being a judgement. A real example, from an inventory turnover analysis:

  • A product's average stock isn't today's on-hand: it's inventory as of the start date and as of the end date, averaged.
  • An outgoing move counts if it goes to a customer, to production or to an adjustment — but not if it's a transfer between your own warehouses.
  • Purchases are measured net: minus supplier returns, plus whatever showed up in a physical count.
  • A product that arrived three weeks ago can't be judged as dead stock, so it drops out of the scoring and gets reported separately.
  • Below 25% turnover is an alert. Between 25% and 100%, acceptable. Above 100%, the inventory turned over completely during the period.

None of that is impossible in a spreadsheet. But every rule becomes another helper column, another nested conditional, another cell someone can overwrite without noticing. The business logic ends up spread across fifty formulas, and the day the threshold moves from 25% to 30% you have to find them all.

What a written report adds

A report in code stores the three things a sheet leaves loose: what goes in, where the thresholds are, and how the result is presented.

The first two are obvious. The third is the one people underestimate. An inventory report returning eight hundred rows sorted by product code is technically correct and useless in practice: nobody reads it. The same report sorted with the alerts on top, low and no-movement products already expanded and the rest collapsed, gets reviewed in two minutes.

That decision — what deserves the attention of whoever opens the report — is part of the report. It isn't decoration.

Which one, and when

Neither replaces the others. The rule we work by:

  1. Pivot, list or graph view — for new, exploratory questions. Zero cost, available right now. If the question won't repeat, stop here.
  2. An Odoo Spreadsheet dashboard — for tracking the same numbers on a recurring basis, when the calculation is a sum, an average or a direct comparison.
  3. A custom report — when the number depends on criteria that need to be written down: exclusions, thresholds, classifications, time windows.

There's a reliable signal that you've crossed into the third case: if you're explaining over the phone how the report gets assembled, or you've saved a how-to about which filters to apply in which order, the criteria isn't in Odoo. It's in your head, and it disappears the week you take holiday.

A note on where these run

It usually surprises people: several of these reports aren't installed modules but server actions built with Odoo Studio. That means they also work on Odoo Online, where custom code can't be installed. Same logic, same output, a different delivery path depending on where your database lives.

It's the difference between "your Odoo can't do that" and "your Odoo gets that delivered differently".


The catalog lists the reports we've already written, with the detail of what each one calculates and what it needs to run. If yours isn't there, booking hours usually costs less than the third meeting about where the number came from.

Keep reading