ml-connector
OdooMicrosoft Power BI

Odoo and Microsoft Power BI integration

Odoo runs accounting, purchasing, inventory, and HR across on-premise, PaaS, and SaaS editions. Microsoft Power BI builds live dashboards and reports from business data. Connecting Odoo to Power BI lets your finance and operations teams see GL balances, AP aging, inventory levels, and purchase order status in real-time dashboards without manual exports. ml-connector handles the XML-RPC and JSON-2 APIs on Odoo's side and the push dataset REST endpoints on Power BI's side, running on a schedule you control.

How Odoo works

Odoo exposes financial, inventory, HR, and CRM records through XML-RPC (all editions) and JSON-2 (Odoo 19+) over HTTP POST. Authentication is handled via API key paired with username login; the XML-RPC flow calls authenticate() to obtain a session uid before subsequent operations. Polling with write_date filtering and high-water-mark timestamps is the recommended pattern for integrations. Odoo does not publish webhooks in production-grade form; webhooks via Automated Actions are available only in Enterprise edition with Studio. Key entities include account.move (GL and AP documents), account.move.line (journal lines and GL entries), purchase.order, account.payment, inventory movements, and hr.employee. External API access requires Custom pricing; Standard and One App Free plans do not support integrations.

How Microsoft Power BI works

Microsoft Power BI accepts data via REST API at https://api.powerbi.com/v1.0/myorg with OAuth 2.0 service principal credentials. The connector authenticates by POST to https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token with client_id, client_secret, and scope https://analysis.windows.net/powerbi/api/.default, obtaining a bearer token valid for approximately one hour. Power BI push datasets require the table schema (column names and datatypes) to be defined before rows are posted. Service principals must be members or admins on target workspaces, and developer settings must be enabled in the Power BI Admin portal to allow service principal API access. Power BI is a read-only destination; it does not push events or webhooks to external systems.

What moves between them

Odoo records move into Power BI on a schedule you define. Account movements (GL entries and AP documents) flow into a Power BI table for GL reporting, with account codes and cost centers mapped to match Odoo's chart of accounts. Purchase orders, approved and received quantities, and unit costs load into an inventory and procurement table. Inventory stock levels and movement details populate a separate table for warehouse operations dashboards. GL account master and cost center reference tables sync bidirectionally to ensure report filters match Odoo's dimensions. Every post to Power BI includes an audit timestamp and record ID for traceability.

How ml-connector handles it

ml-connector stores Odoo API credentials encrypted and connects via XML-RPC or JSON-2 depending on the Odoo version and edition. It polls account.move, purchase.order, stock.move, and hr.employee on a high-water-mark schedule using write_date filters to fetch only new and changed records since the last run. Each record is transformed to the target Power BI push dataset schema, and rows are POSTed in batches to reduce network overhead. Power BI OAuth tokens are obtained once per run and refreshed automatically when they expire. If a batch POST fails, ml-connector retries with exponential backoff and jitter, logging each attempt for audit purposes. Mapping tables (Odoo account numbers to Power BI report categories, Odoo cost centers to business unit codes) are defined once and applied to every sync run. Odoo's lack of webhooks means the integration relies on polling; the schedule can be as frequent as every 15 minutes for real-time dashboards or hourly for standard reporting cadence.

A real-world example

A mid-sized manufacturing company runs Odoo for accounting, purchasing, and inventory across three locations. The CFO and location managers want live visibility into GL balances, AP aging by vendor, open purchase orders, and inventory by warehouse without waiting for month-end close or running manual reports in Odoo. With Odoo and Power BI connected, account movements sync every hour, purchase order status updates immediately when approval dates change, and inventory drill-downs show stock levels by warehouse and part number. The finance team publishes rolling 13-week cash flow forecasts and AP aging dashboards that refresh automatically, eliminating daily emails requesting status snapshots.

What you can do

  • Sync Odoo GL entries, account balances, and AP documents into Power BI tables for financial reporting dashboards.
  • Push purchase order headers and lines from Odoo to Power BI for procurement visibility and spend analysis.
  • Map Odoo chart of accounts and cost centers to Power BI report dimensions so GL posting makes sense in dashboards.
  • Poll Odoo on a schedule using write_date high-water marks, authenticate with OAuth 2.0 service principal on the Power BI side, and retry failed uploads with backoff.
  • Define push dataset schemas once and apply them consistently across multiple scheduled syncs with full audit timestamps on every row.

Questions

Which direction does data flow between Odoo and Microsoft Power BI?
Data flows from Odoo into Microsoft Power BI. GL entries, AP documents, purchase orders, and inventory records are polled from Odoo and pushed into Power BI push datasets for visualization. Power BI is a read-only reporting destination, so ml-connector does not write records back into Odoo.
Does Odoo's lack of webhooks make the integration slower than other systems?
Odoo does not offer production-grade webhooks, so ml-connector polls on a schedule you define. For real-time dashboards, you can set the polling interval as frequently as every 15 minutes; for standard reporting, hourly or daily polling is typical. Polling is triggered on a schedule, not on record changes, but ml-connector uses write_date filters to fetch only new and changed records since the last run, keeping network overhead low.
What Odoo edition and pricing level supports this integration?
Odoo requires the Custom pricing plan to enable external API access; Standard and One App Free plans do not support integrations. Odoo Online, Odoo.sh (PaaS), and self-hosted editions all support XML-RPC and JSON-2 APIs. XML-RPC is available on all editions; JSON-2 is available on Odoo 19 and later.

Related integrations

Connect Odoo and Microsoft Power BI

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started