ml-connector
QADMicrosoft Power BI

QAD and Microsoft Power BI integration

QAD runs manufacturing, procurement, and finance. Microsoft Power BI builds the reports and dashboards on top of that data. This connection moves QAD finance and procurement records into Microsoft Power BI so analysts can chart spend, payables, and supplier activity without exporting spreadsheets. ml-connector reads the records from QAD on a schedule, maps them to Power BI table schemas, and pushes the rows into a named workspace. Power BI does not own transactional records, so the flow runs one way, from QAD into Power BI.

How QAD works

QAD Adaptive ERP exposes suppliers, purchase orders, supplier invoices, GL accounts, cost centers, items, goods receipts, and AP payments through REST business document APIs, documented in Swagger inside each customer instance. The cloud product authenticates with a JWT session or OAuth2 bearer token against a tenant-specific URL, so there is no shared hostname or public sandbox. Older on-premise sites run QAD Enterprise Edition with the QXtend SOAP framework instead. QAD cloud has no webhook system for third-party connectors, so finance records are read by polling on a schedule.

How Microsoft Power BI works

Microsoft Power BI exposes a REST API at api.powerbi.com under a named workspace, addressed by the workspace GUID. Authentication uses an OAuth 2.0 client credentials grant against a Microsoft Entra service principal, with the scope https://analysis.windows.net/powerbi/api/.default and a Bearer token that expires roughly hourly. The primary write path for an ERP feed is a push dataset: you define table schemas, then POST rows into them, and can trigger a dataset refresh. Power BI sends no outbound webhooks for connector use, so the integration is push plus scheduled refresh rather than event-driven.

What moves between them

All data moves in one direction, from QAD into Microsoft Power BI. ml-connector reads supplier invoices, purchase orders, AP payments, GL accounts, suppliers, and goods receipts from QAD, maps each entity to a Power BI table, and pushes the rows into a push dataset in the target workspace. Cost center and GL account values travel as columns on the relevant tables so reports can slice spend by dimension. Power BI owns no transactional records and the push datasets are append-only, so ml-connector never writes financial data back to QAD and instead manages the rows it has already sent.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the QAD side it accepts the full tenant URL per customer, since QAD publishes no shared base address, and uses the JWT or OAuth2 bearer token to read business documents. On the Power BI side it runs the Microsoft Entra client credentials grant, requests the analysis.windows.net Power BI scope, and refreshes the bearer token when a call returns 401. It resolves the workspace name to a GUID at configuration time, since every call is addressed by group ID rather than display name, and confirms the service principal has been added to that workspace as Member or Admin. Because Power BI has no inbound webhook, the connector polls QAD on a cron schedule, transforms each entity to the matching table schema, and POSTs rows in batches that respect the push dataset limits of 10,000 rows per request and 120 requests per minute per dataset. Push datasets are append-only with no idempotency key, so ml-connector deletes the table rows and re-posts the current set, or tracks a watermark and sends only net-new records, to avoid duplicates. After loading, it can trigger a dataset refresh. On HTTP 429 it honors the Retry-After header and backs off with jitter. Every record carries a full audit trail and can be replayed if a push fails.

A real-world example

A mid-sized contract manufacturer runs QAD Adaptive ERP for production, purchasing, and accounts payable, and the finance team builds its monthly board reports in Microsoft Power BI. Before the integration an analyst exported supplier invoice and purchase order data from QAD into spreadsheets each cycle, cleaned it by hand, and imported it into Power BI, which left the dashboards a week behind and prone to copy-paste errors. With QAD and Microsoft Power BI connected, ml-connector pushes the latest invoices, purchase orders, and payments into the reporting workspace on a daily schedule and refreshes the dataset. The spend and payables dashboards now reflect current QAD data, and the manual export and cleanup step is gone.

What you can do

  • Push QAD supplier invoices, purchase orders, payments, and GL accounts into Microsoft Power BI push dataset tables on a schedule.
  • Carry QAD cost center and GL account values as columns so Power BI reports can slice spend by dimension.
  • Authenticate QAD with its tenant-specific token and Microsoft Power BI with a Microsoft Entra service principal on the correct scope.
  • Resolve the target workspace name to its GUID and respect Power BI push limits with batched, throttle-aware row loads.
  • Avoid duplicate rows with full-replace or watermark loading, trigger dataset refreshes, and keep a full audit trail with replay.

Questions

Which direction does data move between QAD and Microsoft Power BI?
Data moves one way, from QAD into Microsoft Power BI. Power BI is a reporting layer and does not own transactional finance records, so ml-connector reads invoices, purchase orders, payments, and GL accounts from QAD and pushes them into Power BI push datasets. Nothing is written back from Power BI into QAD.
Does Microsoft Power BI send webhooks when data changes?
No. Power BI has no outbound webhook for connector use, and the email-based refresh and subscription features are not HTTP callbacks. Because of this, ml-connector polls QAD on a cron schedule, pushes rows into Power BI, and optionally triggers a dataset refresh rather than waiting for an event from Power BI.
How does ml-connector avoid duplicate rows in Microsoft Power BI?
Power BI push datasets are append-only and have no idempotency key, so every POST adds new rows. ml-connector either deletes the existing table rows and re-posts the current set, or tracks a watermark and sends only net-new records from QAD. This keeps the Power BI tables in step with QAD without piling up duplicates across runs.

Related integrations

Connect QAD and Microsoft Power BI

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

Get started