ml-connector
Microsoft Dynamics 365 F&OTableau

Microsoft Dynamics 365 F&O and Tableau integration

Microsoft Dynamics 365 F&O holds the financial and supply chain records. Tableau presents them as dashboards. Connecting the two keeps the dashboards in step with the ledger without manual exports. ml-connector reads finance data from D365 F&O through its OData service and orchestrates the Tableau extract refresh so a report shows current vendor, invoice, purchase order, and GL figures rather than yesterday's snapshot. It handles the different authentication on each side and runs the refresh on a cadence you set.

How Microsoft Dynamics 365 F&O works

Microsoft Dynamics 365 F&O exposes all public data entities through an OData v4 REST/JSON service at a tenant-specific host such as contoso.operations.dynamics.com/data/. Key finance entities include VendorsV2, PurchaseOrderHeadersV2, VendorInvoiceHeaders, MainAccounts, and GeneralJournalAccountEntries, with posted ledger entries read-only. Authentication is OAuth 2.0 client credentials via Microsoft Entra ID, returning a one-hour bearer token. OData uses server-driven paging up to 10,000 records with an @odata.nextLink to follow. D365 can push Business Events when documents post, but those payloads carry only identifiers, so the integration reads finance records by polling OData.

How Tableau works

Tableau is a BI and visualization platform with no native vendors, invoices, purchase orders, or GL accounts. The Tableau Server REST API, version 3.29, manages data sources, workbooks, views, extract refresh tasks, and async jobs at https://{pod}.online.tableau.com/api/{version}/. The finance-relevant operations are publishing and updating a data source, triggering an extract refresh with POST datasources/{id}/refresh, and polling the returned job until status is Success or Failed. Authentication is a Personal Access Token sign-in that returns a 240-minute session token and the site LUID required in every URL. Tableau also sends webhooks for datasource-refresh-succeeded and datasource-refresh-failed.

What moves between them

The flow runs from Microsoft Dynamics 365 F&O toward Tableau. ml-connector reads finance entities from D365 OData, vendors, purchase orders, vendor invoices, main accounts, and posted general journal entries, then lands them where the published Tableau data source reads from. It then calls the Tableau refresh endpoint so the extract reloads and dashboards reflect the latest figures. Nothing financial flows back into D365, because Tableau has no AP invoice, GL, or vendor write path. The cadence is a schedule you control, typically aligned to the close calendar or to the D365 Business Event that fires when a journal posts.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the D365 side it requests a Microsoft Entra ID client-credentials token scoped to the environment host and refreshes it on expiry or on a 401, and it accepts the tenant-specific host as a credential field because D365 publishes no shared base URL. On the Tableau side it signs in with the Personal Access Token, stores the returned session token and site LUID, and re-signs in when a call returns 401. Reads honor D365 server-driven paging by following @odata.nextLink and respect HTTP 429 with Retry-After. After the data lands, ml-connector triggers the Tableau extract refresh, captures the returned job id, and polls GET jobs/{id} until it reports Success or Failed rather than assuming completion. Multi-entity D365 customers need cross-company=true, so the connector passes the legal entity per data area. Tableau does not sign its webhooks, so the connector validates the inbound refresh-succeeded and refresh-failed events with a secret in the destination URL. A failed refresh or a failed OData read is retried with backoff and replayed from a full audit trail.

A real-world example

A mid-sized distribution company, roughly 400 employees across three warehouses, runs Microsoft Dynamics 365 F&O for procurement and finance and publishes spend and payables dashboards in Tableau Cloud for its controllers. Before the integration, an analyst exported vendor invoice and GL extracts from D365 each morning, reshaped them in a spreadsheet, and republished the data source by hand, so the dashboards were a day behind and broke whenever the export changed. With Microsoft Dynamics 365 F&O and Tableau connected, ml-connector reads the finance entities on schedule, lands them for the published data source, and triggers the extract refresh, so the payables and spend views are current each morning without the manual export-and-republish step.

What you can do

  • Read vendor, purchase order, invoice, and GL data from Microsoft Dynamics 365 F&O through its OData v4 service.
  • Trigger a Tableau extract refresh after the finance data lands so dashboards show current ledger figures.
  • Bridge Microsoft Entra ID client-credentials tokens on D365 with Tableau Personal Access Token session auth.
  • Poll Tableau async jobs to confirm each refresh finished before treating the dashboard as current.
  • Run on a schedule aligned to your close calendar, with retries and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 F&O and Tableau?
Data moves from Microsoft Dynamics 365 F&O toward Tableau only. ml-connector reads finance entities from the D365 OData service and lands them for a published Tableau data source, then triggers the extract refresh. Tableau has no native invoice, GL, or vendor records, so nothing financial is written back into D365.
Does the integration use Tableau webhooks or polling?
It uses both. D365 finance records are read by polling OData on a schedule, because Tableau cannot push records into D365 and the D365 Business Event payload carries only identifiers. ml-connector also listens for Tableau datasource-refresh-succeeded and datasource-refresh-failed webhooks so a stale or broken refresh is caught quickly.
How are the two different authentication methods handled?
D365 uses OAuth 2.0 client credentials through Microsoft Entra ID, returning a one-hour bearer token that ml-connector refreshes automatically. Tableau uses a Personal Access Token sign-in that returns a 240-minute session token plus the site LUID needed in every URL. ml-connector stores both credential sets encrypted and re-authenticates on a 401 from either side.

Related integrations

Connect Microsoft Dynamics 365 F&O and Tableau

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

Get started