Parte da nossa série Data Analytics & BI
Leia o guia completoOdoo + Power BI: Guia completo de integração analítica
O Odoo 19 Enterprise inclui relatórios integrados sólidos, mas para organizações que precisam de análise de autoatendimento, modelagem de dados entre sistemas e visualização de nível empresarial, o Power BI é o complemento natural. Conectar os dados operacionais do Odoo ao mecanismo analítico do Power BI desbloqueia insights que os relatórios nativos do Odoo não podem fornecer.
Este guia cobre todos os aspectos da integração Odoo-Power BI: arquitetura de conexão, práticas recomendadas de modelagem de dados, construção de painéis de negócios importantes, criação de medidas DAX, configuração de atualização incremental e implantação no Microsoft Fabric para escala empresarial.
Principais conclusões
- Três métodos de conexão: PostgreSQL direto, API REST Odoo e ODBC via exportação do Odoo
- O modo DirectQuery fornece dados em tempo real; O modo de importação oferece melhor desempenho para grandes conjuntos de dados
- O esquema PostgreSQL do Odoo requer desnormalização para modelos de dados eficientes do Power BI
- A atualização incremental reduz o tempo de carregamento para tabelas grandes (account.move, stock.move)
- A segurança em nível de linha no Power BI reflete o controle de acesso em nível de empresa do Odoo
- Implantação de gateway necessária para Odoo local; nuvem Odoo se conecta diretamente
- Microsoft Fabric (Power BI Premium) permite dados Odoo em empresas lakehouse
- Principais medidas: receita, margem bruta, giro de estoque, vencimento de contas a receber, OEE
Opções de arquitetura de integração
Escolha a arquitetura de conexão correta com base nas necessidades de implantação e geração de relatórios do Odoo.
Opção 1: conexão direta com PostgreSQL (recomendado)
Conecte o Power BI diretamente ao banco de dados PostgreSQL do Odoo usando o conector PostgreSQL:
Prós:
- Acesso total a todas as tabelas Odoo e dados brutos
- Melhor desempenho para junções complexas
- Suporta os modos Importação e DirectQuery
Contras:
- Requer acesso de rede do Power BI Gateway ao PostgreSQL
- Mudanças no modelo de dados do Odoo exigem atualização de consultas do Power BI
- O acesso direto ao banco de dados ignora o controle de acesso do Odoo
Opção 2: API REST Odoo
Conecte-se por meio do conector Web do Power BI usando a API REST do Odoo:
Prós:
- Funciona sem acesso de rede ao PostgreSQL
- Respeita os direitos de acesso do Odoo por usuário
- Não são necessárias credenciais de banco de dados
Contras:
- Mais lento que o PostgreSQL direto (uma chamada de API por tabela)
- A limitação de taxa afeta grandes extrações de dados
- Difícil paginar com eficiência para grandes conjuntos de dados
Opção 3: Exportar para Data Warehouse
Dados ETL Odoo em um data warehouse dedicado (Azure Synapse, Snowflake, BigQuery):
Prós:
- Desempenho máximo em escala
- Desacopla BI do ERP
- Pode integrar vários sistemas de origem
Contras:
- Maior custo e complexidade de infraestrutura
- A latência dos dados depende da programação ETL (normalmente de 1 hora a 24 horas)
- Requer manutenção de pipeline ETL
Arquitetura recomendada para a maioria das organizações: PostgreSQL direto com Power BI Gateway (local) ou conexão direta (nuvem Odoo), modo de importação com atualização incremental, atualização agendada a cada 1-4 horas.
Configurando a conexão PostgreSQL
Etapa 1: acesso à rede
Para Odoo local:
- Instale o On-Premises Data Gateway em um servidor com acesso de rede ao PostgreSQL
- Configure o gateway com suas credenciais do Microsoft 365
- Abra a porta PostgreSQL (5432 ou 5433) do servidor gateway para o servidor Odoo DB
Para nuvem Odoo (AWS, Azure, GCP):
- Configurar grupo de segurança/firewall para permitir entrada de intervalos de IP do Power BI
- Ou: use o gateway local em uma VM na nuvem na mesma VPC
Etapa 2: Crie um usuário de banco de dados somente leitura
Nunca conecte o Power BI ao seu usuário principal do banco de dados Odoo. Crie um usuário somente leitura dedicado:
-- Create read-only user for Power BI
CREATE USER powerbi_reader WITH PASSWORD 'strong_password_here';
-- Grant connection to database
GRANT CONNECT ON DATABASE your_odoo_db TO powerbi_reader;
-- Grant schema usage
GRANT USAGE ON SCHEMA public TO powerbi_reader;
-- Grant SELECT on all current and future tables
GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO powerbi_reader;
Etapa 3: Configurar no Power BI Desktop
- Abra Power BI Desktop → Obter dados → Banco de dados PostgreSQL
- Digite:
- Servidor: seu host PostgreSQL (e porta, se não for 5432)
- Banco de dados: o nome do seu banco de dados Odoo
- Nome de usuário: powerbi_reader
- Senha: a senha do usuário somente leitura
- Selecione o modo de conexão: Importar (recomendado) ou DirectQuery
Principais tabelas Odoo para Power BI
Compreender o esquema PostgreSQL do Odoo é essencial para construir modelos de dados precisos.
Tabelas financeiras:
| Tabela | Descrição | Campos-chave |
|---|---|---|
| CÓDIGO0 | Faturas, contas, lançamentos contábeis manuais | tipo_movimento, estado, data_da fatura, valor_total, id_moeda |
| CÓDIGO0 | Itens de linha em lançamentos contábeis manuais | move_id, account_id, débito, crédito, quantidade, price_subtotal |
| CÓDIGO0 | Plano de contas | código, nome, tipo_de_conta |
| CÓDIGO0 | Pagamentos de clientes/fornecedores | valor, data_de_pagamento, estado, id_do_parceiro |
Tabelas de vendas:
| Tabela | Descrição | Campos-chave |
|---|---|---|
| CÓDIGO0 | Pedidos de vendas | nome, estado, pedido_data, valor_total, id_parceiro, id_usuário |
| CÓDIGO0 | Linhas de ordem de venda | id_pedido, id_produto, quantidade_uom_produto, preço_subtotal |
| CÓDIGO0 | Oportunidades de CRM | nome, stage_id, receita_esperada, probabilidade, user_id |
Tabelas de inventário:
| Tabela | Descrição | Campos-chave |
|---|---|---|
| CÓDIGO0 | Níveis atuais de estoque | id_do_produto, id_do_local, quantidade |
| CÓDIGO0 | Todos os movimentos de inventário | product_id, estado, data, quantidade_concluído |
| CÓDIGO0 | Documentos de entrega/recebimento | picking_type_id, estado, data_programada |
| CÓDIGO0 | Dados mestre do produto | nome, preço_lista, id_categ, tipo |
RH e folha de pagamento:
| Tabela | Descrição | Campos-chave |
|---|---|---|
| CÓDIGO0 | Funcionários | nome, ID_do_departamento, ID_do_trabalho, ID_da_empresa |
| CÓDIGO0 | Horário e presença | ID_do_funcionário, check_in, check_out |
| CÓDIGO0 | Recibos de vencimento | ID_do_funcionário, data_de, data_até, estado |
Design do modelo de dados do Power BI
Design de esquema em estrela para dados Odoo:
Converta o esquema normalizado do Odoo em um esquema em estrela para obter desempenho ideal do Power BI:
[Date Table] (dimension)
↓
[Sales Fact Table]
↓
[Product Dimension] ← [Product Category Dimension]
↓
[Customer Dimension] ← [Country Dimension]
↓
[Salesperson Dimension]
↓
[Company Dimension]
Código M do Power Query – Tabela de fatos de vendas:
let
Source = PostgreSQL.Database("your-odoo-server:5433", "your_db"),
SaleOrderLine = Source{[Schema="public", Item="sale_order_line"]}[Data],
SaleOrder = Source{[Schema="public", Item="sale_order"]}[Data],
ProductTemplate = Source{[Schema="public", Item="product_template"]}[Data],
ProductProduct = Source{[Schema="public", Item="product_product"]}[Data],
// Join order lines with orders
JoinWithOrder = Table.NestedJoin(
SaleOrderLine, {"order_id"},
SaleOrder, {"id"},
"Order", JoinKind.Inner
),
// Expand order columns needed
ExpandOrder = Table.ExpandTableColumn(
JoinWithOrder, "Order",
{"name", "state", "date_order", "partner_id", "user_id", "company_id"},
{"order_name", "order_state", "date_order", "partner_id", "user_id", "company_id"}
),
// Filter: confirmed and done orders only
FilterState = Table.SelectRows(
ExpandOrder,
each [order_state] = "sale" or [order_state] = "done"
),
// Select and rename final columns
SelectColumns = Table.SelectColumns(FilterState, {
"id", "order_id", "product_id", "date_order", "partner_id",
"user_id", "company_id", "product_uom_qty", "price_unit",
"price_subtotal", "price_tax", "price_total"
}),
// Change types
ChangedTypes = Table.TransformColumnTypes(SelectColumns, {
{"date_order", type datetime},
{"price_subtotal", type number},
{"product_uom_qty", type number}
})
in
ChangedTypes
Medidas essenciais do DAX
Receita e margem:
// Total Revenue (Net)
Revenue = SUMX(SalesFact, SalesFact[price_subtotal])
// Revenue MTD
Revenue MTD =
CALCULATE([Revenue], DATESMTD(DateTable[Date]))
// Revenue YTD
Revenue YTD =
CALCULATE([Revenue], DATESYTD(DateTable[Date]))
// Revenue vs Prior Period
Revenue vs PY =
VAR CurrentRevenue = [Revenue]
VAR PriorYearRevenue =
CALCULATE([Revenue], SAMEPERIODLASTYEAR(DateTable[Date]))
RETURN
DIVIDE(CurrentRevenue - PriorYearRevenue, PriorYearRevenue, 0)
// Gross Margin
Gross Margin =
SUMX(SalesFact,
SalesFact[price_subtotal] -
(RELATED(ProductDim[standard_price]) * SalesFact[product_uom_qty])
)
// Gross Margin %
Gross Margin % =
DIVIDE([Gross Margin], [Revenue], 0)
Medidas de estoque:
// Current Stock Value
Stock Value =
SUMX(
StockQuant,
StockQuant[quantity] * RELATED(ProductDim[standard_price])
)
// Inventory Turnover (annualized)
Inventory Turnover =
DIVIDE(
[COGS Annualized],
[Average Inventory Value],
0
)
// Days of Inventory Outstanding
DIO =
DIVIDE(365, [Inventory Turnover], 0)
// Stockout % (products with zero stock)
Stockout Rate =
DIVIDE(
COUNTROWS(FILTER(StockQuant, StockQuant[quantity] <= 0)),
COUNTROWS(StockQuant),
0
)
Vencimento de contas a receber:
// Current (0-30 days)
AR Current =
CALCULATE(
SUM(ARFact[amount_residual]),
ARFact[days_overdue] <= 0
)
// 1-30 days overdue
AR 1-30 Days =
CALCULATE(
SUM(ARFact[amount_residual]),
ARFact[days_overdue] >= 1 && ARFact[days_overdue] <= 30
)
// Days Sales Outstanding
DSO =
DIVIDE(
SUM(ARFact[amount_residual]),
[Revenue] / 365,
0
)
Principais páginas do painel
1. Painel Executivo
- Receita vs orçamento (gráfico de medidor)
- Tendência da receita (gráfico de linhas, 13 meses consecutivos)
- % de margem bruta (cartão KPI com tendência)
- 10 principais clientes por receita (gráfico de barras)
- Os 10 principais produtos por receita (barra horizontal)
- Receita por região (mapa preenchido)
2. Pipeline de vendas (CRM)
- Pipeline por estágio (gráfico de funil)
- Valor ponderado do pipeline (KPI)
- Taxa de vitórias/perdas (gráfico de rosca)
- Tendência do tamanho médio do negócio
- Desempenho do representante de vendas (tabela matriz)
- Previsão vs real (combinação linha + barra)
3. Visão Geral Financeira
- Resumo de P&L (tabela com YTD, YoY)
- Posição de caixa (KPI)
- Vencimento de recebíveis (barra empilhada)
- Vencimento de contas a pagar (barra empilhada)
- Tendência DSO (gráfico de linhas)
4. Painel de inventário
- Valor do estoque por categoria (treemap)
- Giro de estoque por armazém (bar)
- Estoque lento (tabela: estoque > 90 dias)
- Itens de risco de ruptura de estoque (tabela: dias de cobertura < 7)
- Alertas de ponto de reordenamento (cartões)
**5. Painel de RH **
- Headcount por departamento (bar)
- Presença vs. horas agendadas (medidor)
- Deixar utilização do saldo (matriz)
- Tendência da taxa de rotatividade (linha)
Atualização incremental para tabelas grandes
As tabelas account_move_line, stock_move e mail_message do Odoo crescem para milhões de linhas. A atualização incremental evita recarregamentos de tabela completa em cada atualização.
Configurar atualização incremental:
- No Power Query, adicione os parâmetros
RangeStarteRangeEnd(tipo DateTime) - Filtre sua coluna de data:
Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd) - Clique com o botão direito na tabela no painel Campos → Atualização Incremental
- Definir: armazenar nos últimos 12 meses, atualizar nos últimos 3 dias
Tabelas Odoo que mais se beneficiam da atualização incremental:
account_move_line: filtrar pordatestock_move: filtrar pordatesale_order: filtrar pordate_ordermail_message: filtrar pordate
Segurança em nível de linha
Implemente a segurança em nível de linha (RLS) no Power BI para espelhar o controle de acesso em nível de empresa do Odoo.
// RLS filter: user sees only their assigned companies
[company_id] IN
CALCULATETABLE(
VALUES(UserCompanyMapping[company_id]),
UserCompanyMapping[user_email] = USERPRINCIPALNAME()
)
Crie uma tabela UserCompanyMapping (mantida no Power BI ou sincronizada no Odoo) mapeando endereços de e-mail para IDs de empresas autorizadas.
Perguntas frequentes
Posso usar o DirectQuery com o banco de dados PostgreSQL do Odoo para dados em tempo real?
Sim, mas com ressalvas. DirectQuery no PostgreSQL do Odoo é viável para painéis com consultas simples. Painéis complexos com muitas medidas serão lentos porque cada visual aciona novas consultas SQL no seu banco de dados de produção. Para a maioria dos casos de uso, o modo Importação com atualização de 1 hora é a melhor relação entre atualização e desempenho.
Como posso lidar com dados multimoedas do Odoo no Power BI?
Odoo armazena valores na moeda da transação e na moeda da empresa. Use o campo amount_currency para a moeda original e debit/credit (ou price_subtotal) para o equivalente na moeda da empresa. Para consolidação em nível de grupo no Power BI, use os valores monetários da empresa Odoo e aplique uma tabela de dimensão de conversão de moeda separada para relatórios consistentes.
Qual é o impacto no desempenho do banco de dados PostgreSQL do Odoo quando o Power BI é atualizado?
Uma atualização completa do conjunto de dados do Power BI executa várias consultas analíticas simultaneamente no PostgreSQL. Para bancos de dados Odoo grandes (>50 GB), isso pode consumir E/S e CPU significativos durante a janela de atualização. Práticas recomendadas: agende atualizações fora dos horários de pico (por exemplo, das 2h às 4h), use uma réplica de leitura do PostgreSQL para consultas do Power BI e implemente a atualização incremental para minimizar o escopo da consulta.
Posso conectar o Power BI à comunidade Odoo (versão gratuita) via PostgreSQL?
Sim. O Power BI se conecta a qualquer banco de dados PostgreSQL, independentemente de qual aplicativo o gerencia. O esquema PostgreSQL da Comunidade Odoo é quase idêntico ao Enterprise (menos algumas tabelas somente Enterprise). O método de conexão é o mesmo; apenas garanta que o usuário do banco de dados somente leitura tenha acesso ao banco de dados comunitário.
Como mantenho meu modelo de dados do Power BI sincronizado quando o Odoo é atualizado para uma nova versão?
As atualizações de versão do Odoo podem renomear ou reestruturar tabelas de banco de dados, especialmente para módulos que passaram por refatoração significativa. Após qualquer atualização do Odoo: execute uma comparação de esquemas de tabela entre versões antigas e novas, atualize as consultas do Power Query para fazer referência a colunas renomeadas e valide todas as medidas DAX em relação ao novo esquema. Crie uma verificação de alteração de esquema no seu runbook de migração.
Próximas etapas
Construir uma integração Odoo + Power BI de nível de produção requer experiência em modelagem de dados, conhecimento de PostgreSQL e compreensão profunda do esquema do Odoo. Feito corretamente, ele oferece uma plataforma analítica unificada que transforma a forma como sua equipe de liderança toma decisões.
ECOSIRE oferece soluções analíticas Odoo + Power BI de ponta a ponta - desde arquitetura de banco de dados e modelagem de dados até design de painel, desenvolvimento e implantação de DAX. Nossa equipe une a experiência em Odoo e a especialização em Power BI.
Fale com ECOSIRE sobre sua integração Odoo Analytics →
Explore os serviços Power BI da ECOSIRE →
Compartilhe seus requisitos de relatórios e projetaremos uma arquitetura do Power BI que dê à sua equipe de liderança visibilidade em tempo real de todas as dimensões de suas operações Odoo.
Escrito por
ECOSIRE Research and Development Team
Construindo produtos digitais de nível empresarial na ECOSIRE. Compartilhando insights sobre integrações Odoo, automação de e-commerce e soluções de negócios com IA.
Artigos Relacionados
Odoo Accounting vs QuickBooks: Detailed Comparison 2026
In-depth 2026 comparison of Odoo Accounting vs QuickBooks covering features, pricing, integrations, scalability, and which platform fits your business needs.
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
AI + ERP Integration: How AI is Transforming Enterprise Resource Planning
Learn how AI is transforming ERP systems in 2026—from intelligent automation and predictive analytics to natural language interfaces and autonomous operations.
Mais de Data Analytics & BI
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
Case Study: Power BI Analytics for Multi-Location Retail
How a 14-location retail chain unified their reporting in Power BI connected to Odoo, replacing 40 spreadsheets with one dashboard and cutting reporting time by 78%.
GoHighLevel + Power BI: Advanced Reporting and Analytics
Connect GoHighLevel to Power BI for advanced marketing analytics. Build executive dashboards, track multi-channel ROI, and create automated reports that go beyond GHL's native reporting.
GoHighLevel Reporting and Analytics: Measuring What Matters
Master GoHighLevel reporting and analytics. Learn to build custom dashboards, track ROI across channels, measure funnel conversion, and make data-driven marketing decisions.
Odoo Events Module: Planning, Registration, and Analytics
Complete guide to Odoo 19 Events: create events, manage registrations, sell tickets, track attendance, and analyze event ROI with native ERP integration.
Using OpenClaw AI Agents to Automate Power BI Reports
How OpenClaw AI agents automate Power BI report generation, distribution, and data preparation — delivering analytics at scale without manual BI developer intervention.