Microsoft Dynamics 365 Business Central and Tableau integration
Microsoft Dynamics 365 Business Central runs finance, purchasing, sales, and inventory. Tableau runs the dashboards leadership and finance teams watch. Connecting the two means ledger activity, invoices, and master data from Business Central reach Tableau and the extracts behind each report refresh on a set cadence, so a dashboard is never stale against the books. Because Tableau is an analytics platform with no vendor, invoice, or GL account of its own, the flow runs one direction: Business Central is the source and Tableau is the reporting layer. ml-connector handles the very different APIs on each side and keeps the refresh tied to when the data actually changes.
What moves between them
The flow runs one direction, from Microsoft Dynamics 365 Business Central into Tableau. ml-connector reads general ledger entries, purchase and sales invoices, vendors, customers, GL accounts, and dimensions from Business Central and lands them in the store the Tableau data source is built on. It then triggers an extract refresh on the matching Tableau data source so workbooks and views show current figures. Master data such as vendors, customers, and the chart of accounts is read on a slower cadence, while ledger entries and invoices are read more often, near the close of each period. Tableau holds no finance records to send back, so ml-connector never writes vendors, invoices, or ledger entries into Tableau.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the Business Central side it requests an OAuth 2.0 client-credentials token against Microsoft Entra ID with the configured tenant, client, secret, and the .default scope, and it builds every URL from the stored environment name and company. On the Tableau side it signs in with the Personal Access Token, captures the session token and the site LUID, and re-authenticates when a call returns 401, since the session token expires after 240 minutes. Reads are incremental: ml-connector filters Business Central on lastModifiedDateTime greater than the last run so only changed records move, and it follows the OData nextLink to page through large result sets. Business Central webhook notifications carry no payload, so they are used only as a trigger to fetch, never as the data itself, and polling remains the backbone because purchase orders are not webhook-eligible. After landing data, ml-connector calls the Tableau data source refresh, captures the returned job ID, and polls the jobs endpoint until the status is Success or Failed rather than assuming the extract finished. Neither system offers an idempotency key, so ml-connector dedupes Business Central reads on the entity number and a BullMQ jobId, and uses overwrite on Tableau publishes so a re-run does not create duplicate data sources. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A mid-sized professional services firm with about three hundred staff runs Microsoft Dynamics 365 Business Central for billing, vendor payments, and the general ledger, and the leadership team reviews margin and cash dashboards in Tableau every Monday. Before the integration, an analyst exported trial balances and AR aging from Business Central to spreadsheets, reshaped them, and republished the Tableau data sources by hand, so the dashboards lagged the books by days and the numbers were argued over more than acted on. With Microsoft Dynamics 365 Business Central and Tableau connected, ledger entries and invoices flow into the reporting store and the Tableau extracts refresh automatically after each posting window. The Monday review opens on current figures, and the manual export-and-republish step is gone.
What you can do
- Read Microsoft Dynamics 365 Business Central general ledger entries and invoices and land them where Tableau data sources read.
- Trigger a Tableau extract refresh after each load and poll the job until it succeeds or fails.
- Keep vendor, customer, and chart-of-accounts reference data current in the reporting layer on a slower cadence.
- Bridge Business Central OAuth 2.0 client credentials with the Tableau Personal Access Token session and site LUID.
- Read incrementally with a lastModifiedDateTime filter, dedupe by number and jobId, and keep a full audit trail on every record.
Questions
- Which direction does data move between Microsoft Dynamics 365 Business Central and Tableau?
- It moves one direction, from Business Central into Tableau. Tableau is a business intelligence platform with no vendor, invoice, purchase order, or GL account resource of its own, so it consumes finance data rather than originating it. ml-connector reads ledger entries, invoices, and master data from Business Central, lands them for the Tableau data source, and refreshes the extract, but never writes finance records back into Tableau.
- Does Business Central push data, or does ml-connector poll for it?
- Polling is the backbone. Business Central supports webhook subscriptions, but a notification only states what changed and when and carries no payload, so the record still has to be fetched, and purchase orders are not webhook-eligible at all. ml-connector reads incrementally with an OData filter on lastModifiedDateTime, and where a webhook is enabled it uses the notification only as a trigger to fetch sooner.
- How does the integration know a Tableau dashboard has actually refreshed?
- A Tableau extract refresh runs asynchronously and returns a job ID rather than finishing inline. After loading data, ml-connector calls the data source refresh endpoint, captures that job ID, and polls the jobs endpoint until the status is Success or Failed. That way a refresh failure is caught and can be retried instead of leaving a dashboard silently stale.
Related integrations
More Microsoft Dynamics 365 Business Central integrations
Other systems that connect to Tableau
Connect Microsoft Dynamics 365 Business Central and Tableau
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started