How the Odoo → Fabric integration works
The Microsoft Fabric Connector for Odoo 17 takes a pull-based approach: Odoo exposes token-protected REST endpoints, and Microsoft Fabric pulls data using a REST source in a Copy Job or Data Pipeline Copy Activity, then loads rows into a Lakehouse or Warehouse.
Fabric never sees database credentials — only a revocable bearer token. No Entra ID app registration, no Azure-side secret. Once data is in a Lakehouse, all Fabric workloads can use it: Data Factory, notebooks, SQL endpoints, and Power BI including Direct Lake semantic models on Lakehouse tables.
What you need before you start
Odoo 17 instance
Public HTTPS URL reachable by Fabric. Admin access to install the module and configure settings.
Microsoft Fabric workspace
A workspace for Copy Jobs or Data Pipelines, plus a Lakehouse or Warehouse as the destination.
Bearer token from Odoo
Generated in Microsoft Fabric → Connector Settings. Copy the "Fabric Authorization Header". No Entra ID needed.
Microsoft Fabric Connector module
KSROlabs Microsoft Fabric Connector for Odoo 17, available on the Odoo App Store.
Step-by-step: connecting Odoo 17 to Microsoft Fabric
Install the module and generate a bearer token
Install the Microsoft Fabric Connector for Odoo 17. Open Microsoft Fabric menu → Connector Settings, confirm your public Odoo URL, and generate the bearer token. Copy the "Fabric Authorization Header" — revocable at any time. No database credentials or Entra ID app registration needed.
Create an export profile
Create one Export Profile per Odoo model (e.g. sale.order). Choose fields to export, optionally add a domain filter (e.g. [["state","in",["sale","done"]]]), pick full or incremental sync mode, set page size (50,000 rows default), and choose manual, daily, or weekly schedule.
Run or schedule the export — Odoo builds compressed pages
Trigger the export manually or let the schedule run it. Odoo streams records into compressed NDJSON page files using keyset pagination by id, with checkpointed progress and retention cleanup. When the job reaches Ready state, it exposes a First Page URL.
Configure a Fabric Copy Activity with a REST source
In Microsoft Fabric, create a Copy Job or Data Pipeline Copy Activity with a REST source pointing at the First Page URL (GET /fabric/v2/jobs/<job_token>/pages/1, Authorization: Bearer <token>). Set row path $.data and pagination rule AbsoluteUrl = $.next. Fabric stops when next is null / has_more is false. This pagination config is required.
Load into a Lakehouse or Warehouse
Point the Copy Activity sink at a Fabric Lakehouse or Warehouse table. For full exports use overwrite or staging + merge with key column id. For incremental loads, upsert by id. Data in a Lakehouse is available to Power BI (including Direct Lake on Lakehouse tables), notebooks, and SQL endpoints.
Monitor in the Job Dashboard and schedule recurring loads
The Job Dashboard shows status, row counts, page counts, duration, errors, and logs. Failed jobs can be retried. Schedule Odoo exports off-hours and the Fabric pipeline after the export window. Incremental runs use updated_after watermarks based on write_date.
The REST endpoints Fabric reads
Full export — Fabric starts at the First Page URL and follows $.next:
GET /fabric/v2/jobs/<job_token>/pages/1
Authorization: Bearer <token>Incremental sync — returns rows where write_date is newer; Fabric upserts by id:
GET /fabric/v2/live/<model_slug>?updated_after=<timestamp>&cursor=0&limit=50000
Authorization: Bearer <token>Response envelope — set row path $.data, pagination rule AbsoluteUrl = $.next:
{
"data": [{"id": 1, "name": "Example"}],
"has_more": true,
"next": "https://odoo.example.com/fabric/v2/jobs/<token>/pages/2"
}HTTP codes: 401 invalid token · 404 missing job/page · 503 concurrency limit reached.
Sizing and scheduling for large tables
Validated with a 1.2 million row export benchmark; designed for multi-million-row tables with proper sizing. Performance depends on table width, fields, indexes, and server.
Page size: 50,000 rows for normal tables; 20,000–50,000 for wide; up to 100,000 for narrow.
Retention: 48–72 hours for page files so Fabric has time to read them.
Concurrency: 3–5 concurrent Fabric requests; 503 is returned beyond the limit.
Scheduling: Odoo exports off-hours; Fabric pipeline after the export window. Incremental: key id, watermark write_date.
Incremental syncs do not emit delete events — schedule a periodic full refresh to pick up deletions.
Frequently asked questions
Is this an official Microsoft connector?
No. It is a third-party Odoo module built by KSROlabs. It works with standard Microsoft Fabric REST source capabilities — no special Fabric-side software required.
Does Fabric get direct access to my Odoo database?
No. Fabric authenticates with a bearer token generated in Odoo Connector Settings. Database credentials stay inside Odoo. A 401 is returned for requests with an invalid token.
Which Odoo versions are supported?
Odoo 17 only. The module is built specifically for Odoo 17.
Does it support full and incremental syncs?
Yes. Full exports build paginated NDJSON page files Fabric reads sequentially. Incremental syncs use GET /fabric/v2/live/<model_slug>?updated_after=<timestamp> returning rows where write_date is newer; Fabric upserts by id and stores max_write_date as the next watermark.
How are deleted records handled?
Delete events are not emitted. To pick up deletions, schedule a periodic full refresh so the Lakehouse or Warehouse table is rebuilt from a complete export.
Can it handle very large tables?
Yes — validated with a 1.2 million row export benchmark. Keyset pagination by id, compressed page files, checkpointed progress, and concurrency limits (503 when exceeded) keep exports stable. Actual performance depends on table width, fields, indexes, and server sizing.
What pagination settings does the Fabric REST source need?
Row path $.data and pagination rule AbsoluteUrl = $.next. Fabric follows the next URL until it is null / has_more is false. Without this config, Fabric reads only the first page.
What happens when an export job fails?
The job moves to Error state in the Job Dashboard with logs, row counts, page counts, and duration. You can retry directly from the dashboard.