Spreadsheets have always been the unofficial control room of every business. People export data from their ERP, paste it into a sheet, build formulas around it, and then spend the next three months wondering whether the numbers are still current. Odoo’s spreadsheet module has offered embedded pivot tables and charts that pull live data, but plain lists of records — the most common use case — have been a static export-and-paste affair. Until now.
Static Versus Dynamic: A Meaningful Distinction
When you insert a list from the Odoo database into a spreadsheet, you now choose between two modes. A static listis a snapshot frozen at the moment of insertion. The data sits in plain cells — you can edit it, reformat it, add formulas that reference it, and nothing will overwrite your changes. It’s the digital equivalent of printing a report and writing notes in the margins.
A dynamic liststays connected to the database. Add a product to your inventory, and it appears in the spreadsheet on the next refresh. Update a customer’s address, and the spreadsheet reflects it. Delete a record, and the row disappears. The list is a live window into the database, not a copy of it.
The 80-Record Ceiling You Need to Know About
Here’s the detail that will trip people up: dynamic lists default to 80 records. The underlying formula,=ODOO.LIST(1, 80), caps the fetch at 80 rows. If your list has 200 products, the spreadsheet will show the first 80 and silently omit the rest. No warning, no truncation indicator, no “showing 80 of 200” message.
This is a deliberate performance trade-off. Fetching thousands of records into a browser-based spreadsheet would grind the interface to a halt. But the default being silent about it is a footgun for anyone who doesn’t read the documentation. If your sales report looks suspiciously low, check the record limit before questioning the sales team. You can increase the parameter to any value, but you’ll pay for it in load time.
Hierarchical Sorting Gets Proper Documentation
Dynamic lists support multi-column sorting, and the sorting is hierarchical. The first sorting column determines the primary grouping. Subsequent columns sort within those groups. If you sort by “Category” first and “Revenue” second, you get categories in alphabetical order with products ranked by revenue within each category.
This sounds obvious, but the previous documentation didn’t make it clear which column took priority. “The first sorting column” is now explicitly identified as the hierarchy root, which saves users from the trial-and-error process of figuring out why their data isn’t ordered the way they expected.
When to Use Each Mode
The choice between static and dynamic depends on what you plan to do with the data. Board presentations, financial snapshots, and compliance reports need static lists — you want the numbers locked to a specific moment in time. Operational dashboards, inventory tracking sheets, and pipeline reviews need dynamic lists — you want current data without re-exporting.
The important constraint with dynamic lists: you cannot manually edit the cells that contain list data. The formula controls those cells. You can add your own columns alongside the list for notes or derived calculations, but the list data itself is read-only. If you need to annotate individual rows, a static list gives you that freedom at the cost of freshness.
The Spreadsheet as a Live Dashboard
This feature closes a gap that has pushed users toward third-party BI tools. When the only way to get a live list of records into a visual format was to build a custom report or use an external connector, the spreadsheet couldn’t serve as the single pane of glass that operations managers want. Dynamic lists change that equation. A spreadsheet with a few dynamic lists, some conditional formatting, and a chart or two becomes a lightweight dashboard that stays current without anyone maintaining it.
The 80-record default is the main gotcha. Everything else about this feature is straightforward and well-designed. Raise the limit for large datasets, understand the static-versus-dynamic trade-off, and the spreadsheet becomes meaningfully more useful than it was a version ago.