ml-connector
Microsoft Dynamics 365 Business CentralLooker

Microsoft Dynamics 365 Business Central and Looker integration

Microsoft Dynamics 365 Business Central runs finance, purchasing, sales, and inventory. Looker is the business intelligence layer where that data is modeled and explored on top of a warehouse such as BigQuery or Snowflake. Looker is not an ERP and holds no native vendor, invoice, or GL account objects, so this connection feeds the records Business Central holds into the warehouse tables your Looker model reads from, and runs Looker queries to pull finished figures back. ml-connector reads the agreed entities from the Business Central API v2.0, maps them onto your warehouse schema, and runs on a schedule you control. Because Looker emits no record-level events, the connector drives every step by reading Business Central on a schedule and calling Looker on demand.

How Microsoft Dynamics 365 Business Central works

Microsoft Dynamics 365 Business Central exposes vendors, customers, purchase invoices, sales invoices, general ledger entries, GL accounts, dimensions, items, and employees through the Business Central API v2.0, a REST surface built on OData v4. Resources nest under a company id on a tenant environment URL, and the connector authenticates with the OAuth2 client credentials grant through Microsoft Entra ID using a registered app with the API.ReadWrite.All application permission. Reads page through an @odata.nextLink continuation token, cap at 20,000 records per request, and use a lastModifiedDateTime filter for incremental pulls. Business Central can push change notifications by subscription, but those notifications carry no payload, expire every three days, and require a follow-up fetch, so most reads run by polling.

How Looker works

Looker is a Google Cloud business intelligence platform that sits over a data warehouse, exposed through the Looker API 4.0 as JSON over HTTPS on a per-customer instance URL. It is a reporting layer, not an ERP, so it has no native vendor, invoice, purchase order, or GL account objects; finance data lives in the warehouse and is modeled in LookML, and the API runs queries and saved Looks against that model to return JSON or CSV. Writable objects are limited to content, users, groups, and scheduled plans, so there is no path to post a transaction into Looker. Authentication exchanges an API3 client id and secret at the login endpoint for a bearer token that expires after one hour and is sent with the token scheme rather than Bearer. Looker has no record-level event stream; its scheduled plans can post query results to a webhook on a cron, but that is a scheduled export, not a change feed.

What moves between them

The main flow runs from Microsoft Dynamics 365 Business Central into the warehouse that backs Looker. On each scheduled run, ml-connector reads the agreed Business Central entities, such as vendors, customers, purchase and sales invoices, general ledger entries, items, and dimensions, paging through the @odata.nextLink token and filtering on lastModifiedDateTime so only new and changed records are pulled, then loads them into the warehouse tables your Looker model reads from. In the other direction, ml-connector calls the Looker API to run a query or a saved Look and read finished BI figures, such as a GL summary or a vendor spend total, for a flow that needs them. Business Central is the system of record and Looker is read-only, so the connector never posts financial entries into Looker. Cadence follows your reporting needs, from a nightly load to a refresh after month-end close.

How ml-connector handles it

ml-connector stores both credential sets encrypted. For Business Central it holds a Microsoft Entra ID client credentials token for the tenant and targets the company id on the configured environment name, since the environment is part of the URL, and refreshes the token before it expires. For Looker it accepts the per-customer instance URL, posts the API3 client id and secret to the login endpoint, and sends the returned token with the token scheme, not Bearer; because that token lasts only one hour with no refresh token, the connector re-authenticates when a call returns 401 and caches the token in between. Reads page through the @odata.nextLink token, stay under the 20,000 record limit, and use a lastModifiedDateTime filter to pull only changes since the last run, mapping each Business Central entity onto a warehouse table the Looker model reads from. To read figures back, the connector runs a Looker query or Look by its model, explore, and field names, which are instance-specific and must be supplied from the customer's LookML, and it caps a single query at the 5000-row default or uses an async query task for larger pulls. Business Central throttling returns HTTP 429 and Looker defaults to about sixty requests per minute, so both sides back off with exponential delay and jitter. Business Central change subscriptions carry no payload and expire every three days, so the connector renews them before expiry and still fetches the changed resource, and every record carries a full audit trail and can be replayed if a step fails.

A real-world example

A mid-sized distribution business with around 250 staff runs Microsoft Dynamics 365 Business Central for purchasing, sales, inventory, and finance, and its analysts explore company performance in Looker on top of a BigQuery warehouse. Before the integration, someone exported vendor spend, AP and AR invoices, and GL balances from Business Central into spreadsheets each week and hand-loaded them into the warehouse, so the Looker dashboards always trailed the books and reconciling the extracts ate hours. With Microsoft Dynamics 365 Business Central and Looker connected, vendors, invoices, general ledger entries, and items load into the warehouse tables behind the Looker model automatically on a schedule, pulled incrementally by last-modified date, and finance flows that need a modeled figure read it straight from a Looker query. The Explores refresh against current Business Central data and the manual export-and-load step is gone.

What you can do

  • Load Business Central vendors, customers, purchase and sales invoices, general ledger entries, items, and dimensions into the warehouse tables behind your Looker model.
  • Run Looker queries and saved Looks by model, explore, and field to read finished BI figures back into a flow.
  • Bridge the Business Central Microsoft Entra ID client credentials token and Looker's one-hour API3 login token, re-authenticating on a 401.
  • Read Business Central incrementally with a lastModifiedDateTime filter and @odata.nextLink paging, staying under the 20,000 record per request limit.
  • Treat Looker as a read-only reporting layer, never posting ledger entries into it, with retries and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 Business Central and Looker?
The main flow is Microsoft Dynamics 365 Business Central into the warehouse that backs Looker. Vendors, customers, purchase and sales invoices, general ledger entries, items, and dimensions are read from the Business Central API v2.0 and loaded into the warehouse tables your Looker model reads from. In the other direction ml-connector can run a Looker query or Look to read a finished figure, but Looker is read-only, so no financial entries are ever posted into it.
Can ml-connector write invoices or GL entries into Looker?
No. Looker is a business intelligence layer over a data warehouse, not an ERP, so it has no native invoice, vendor, or GL account objects, and its only writable objects are content, users, groups, and scheduled plans. ml-connector loads Business Central records into the warehouse tables behind the Looker model and uses the Looker API only to run queries and Looks for reading.
How does the integration handle changes when Looker sends no record events?
Looker has no record-level event stream; its scheduled plans only post results on a cron, and Business Central change subscriptions carry no payload and expire every three days. So ml-connector polls Business Central on a schedule, reading each entity with an OData lastModifiedDateTime filter and @odata.nextLink paging to pull only new and changed records. Because the Looker token lasts only one hour with no refresh token, the connector caches it and re-authenticates whenever a call returns 401.

Related integrations

Connect Microsoft Dynamics 365 Business Central and Looker

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

Get started