Skip to content

Odoo Reporting Engine: Every Report Type Explained

DeployMonkey Team · March 22, 2026 12 min read

Report Types in Odoo

TypeOutputBest ForEdition
QWeb PDFPDF documentInvoices, delivery slips, labelsCE + EE
Pivot TableInteractive gridMulti-dimensional analysisCE + EE
Graph ViewChartsVisual trendsCE + EE
DashboardKPI overviewExecutive summaryEE
SpreadsheetSpreadsheetCustom analysis, formulasEE
List ExportExcel/CSVRaw data exportCE + EE
Custom SQLCustomComplex aggregationCustom dev

QWeb PDF Reports

# Standard printed documents:
# - Invoices, Credit Notes
# - Quotations, Sale Orders
# - Delivery Slips, Packing Lists
# - Purchase Orders
# - Manufacturing Orders
# - Barcodes, Labels
# - Custom reports

# Generated by: QWeb template → HTML → wkhtmltopdf → PDF
# Customize: inherit report template via XPath
# Create new: ir.actions.report + QWeb template

Pivot Tables

# Interactive multi-dimensional analysis:
# Rows: Product Category
# Columns: Month
# Values: Revenue (sum), Quantity (sum), Margin (%)

# How to use:
# Any list view → switch to Pivot view
# Drag fields to rows/columns
# Click cells to drill down
# Export to Excel for further analysis

# Example: Sales by region by quarter
# Rows: Country → State
# Columns: Quarter
# Measure: Total Amount

Graph Views

# Chart types:
# - Bar chart (comparison)
# - Line chart (trends over time)
# - Pie chart (proportions)

# Any list view → switch to Graph view
# Configure: measure, group by, chart type
# Stacked or grouped bars
# Multiple measures on same chart

# Example: Revenue trend by month
# Type: Line
# Measure: Amount Total
# Group By: Order Date (Month)

Spreadsheet (Enterprise)

# Odoo Spreadsheet = Google Sheets inside Odoo:
# - Pull live data from Odoo with formulas
# - ODOO.PIVOT() — insert pivot table data
# - ODOO.LIST() — insert list view data
# - Regular formulas: SUM, VLOOKUP, IF
# - Charts from Odoo data
# - Share with team members
# - Auto-refresh with live data

# Example formula:
# =ODOO.PIVOT(1, "amount_total", "product_id", 42)
# Returns: total amount for product ID 42 from pivot #1

Dashboard (Enterprise)

# Executive KPI overview:
# - Revenue this month vs target
# - Orders today
# - Open support tickets
# - Inventory value
# - Cash position

# Create: Dashboards → Add Block
# Block types: graph, pivot, KPI, cohort
# Real-time data from Odoo
# Role-based: different dashboards per user/team

Custom SQL Reports

# For complex aggregation beyond standard views:

# Method 1: Database view (read-only model)
class SaleReport(models.Model):
    _name = 'sale.report'
    _auto = False  # No table created

    def init(self):
        self.env.cr.execute("""
            CREATE OR REPLACE VIEW sale_report AS (
                SELECT
                    so.id,
                    so.date_order,
                    so.partner_id,
                    SUM(sol.price_subtotal) as total,
                    COUNT(sol.id) as line_count
                FROM sale_order so
                JOIN sale_order_line sol ON sol.order_id = so.id
                GROUP BY so.id, so.date_order, so.partner_id
            )
        """)

# Then create standard views (list, pivot, graph) on this model
# Users interact normally — it's just a SQL view underneath

Which Report to Use

NeedUse
Print document for customerQWeb PDF Report
Analyze data by multiple dimensionsPivot Table
Visualize trendsGraph View
Executive overviewDashboard
Custom analysis with formulasSpreadsheet
Export raw dataList → Export
Complex aggregationCustom SQL view
External BI toolConnect Power BI / Grafana

DeployMonkey

DeployMonkey's AI agent helps create reports: QWeb templates for documents, pivot configurations for analysis, and SQL views for complex metrics. Or just ask the AI — it queries your data and returns answers in plain language.