Why Are Dataflows So Interesting for Power BI and Business Central

In this webinar, Steven Renders (moderated by Luc van Vugt) explains why Power BI dataflows are worth the extra setup step when reporting on Business Central data. He walks through preparing custom APIs in AL, building a dataflow from those APIs, consuming that dataflow from both Power BI and Excel, and the licensing and refresh considerations that come with it.

Preparing the queries: custom APIs over web services

Steven starts from the data source. Business Central exposes a large set of out-of-the-box APIs covering most master data (customers, items, vendors, G/L accounts) and transactional data (sales and purchase documents, ledger entries). For reporting purposes, he generally prefers these APIs over the older SOAP/OData web services, because API pages return the data as-is (a customer list returns customers, not customer ledger entries) and Microsoft states APIs perform roughly 30% faster than web services.

Microsoft Learn documentation page: Welcome to the API (v2.0) for Business Central, showing the list of standard entities in the left navigation
▶ Watch this segment
📖 Docs: API (v2.0) for Dynamics 365 Business Central — the reference for the standard API endpoints shown in the demo.

When a field isn’t available on a standard API — his example is a custom “shoe size” field on the customer card — a new API needs to be developed. He builds these as AL query objects rather than API pages, because a query object can group data and return subtotals directly from the database, reducing the size of the result set before it ever reaches Power BI.

AL code for a custom query object named Items with APIGroup powerBI, APIPublisher solutize, and an Item data item exposing columns like itemNo and itemDescription
▶ Watch this segment

One property he calls out specifically: set DataAccessIntent = ReadOnly on any API used for reporting. This routes the query to the read-only replica of the production database in Business Central SaaS, which keeps report refreshes from competing with normal transactional load.

Structuring APIs around a star or snowflake schema

Steven organizes his custom APIs the way he’d organize a Power BI data model: one API per table in a star or snowflake schema, rather than one large API for everything. He treats each API as a reusable building block — a fact table for measurable amounts and quantities, surrounded by dimension tables like customer, item, or calendar. In his own project this results in a MasterData folder (customers, items, salespeople) and a Transactions folder (sales, purchases, general ledger, item ledger) of query objects.

VS Code Explorer showing an apis folder split into MasterData (Items, Salespeople queries) and Transactions (Budget, CustomerLedgers, dimensionSetEntries, generalLedger, ItemLedgers, Purchases, Sales queries), plus a dataflows folder with MasterData.json and Transactions.json
▶ Watch this segment
Hand-drawn diagram of a fact table (F) at the center connected to surrounding dimension tables, illustrating a star/snowflake schema with a salesperson dimension linked off a customer dimension
▶ Watch this segment

Creating a dataset with dataflows

The core problem dataflows solve: if you build several Power BI reports against Business Central directly, each report re-imports the same customer, item, and ledger data on its own refresh schedule. A dataflow imports that data from Business Central once, into what Steven describes as “a mini data warehouse”, and every report then consumes the dataflow instead of the source system.

A dataflow is, in his words, “Power Query online” — the same transform experience as Power Query in Power BI Desktop or Excel, running as a hosted service. Behind the scenes Power BI stores the data in an Azure Data Lake that you never have to manage directly. Creating one requires a Power BI Pro license and a workspace (dataflows aren’t available in “My Workspace”).

Power BI 'Start creating your dataflow' screen with four options: Define new tables, Link tables from other dataflows, Import Model, and Attach a Common Data Model folder
▶ Watch this segment

Connecting to Business Central and building a multi-company query

Selecting Business Central as the data source prompts for environment and company — Steven skips these fields on the first pass so he can browse all connected environments and companies instead of typing them by hand. Once inside a company, both standard and custom APIs are listed as data sources, and the Power Query editor behaves exactly as it does in Power BI Desktop: remove columns, filter rows, change data types, or add calculated columns.

Power BI dataflow 'Choose data' screen with the Business Central connection tree expanded to show multiple environments (SANDBOXPBI, PRODUCTION), companies (Cronus 2, CRONUS USA Inc.), and the Standard APIs v2.0 entity list including accounts
▶ Watch this segment

To combine data from multiple companies and environments into one dataflow, he references a base _APIs query rather than duplicating the connection per table, and adds computed keys (environment + company + record number) so rows from different companies stay unique when combined. He points out that this multi-company pattern can disable query folding on later steps — Power Query has to do the work locally instead of pushing it back to Business Central — visible via the folding indicator next to each applied step.

Power Query editor with the Applied Steps panel annotated to highlight the data folding indicator icon next to the Source step
▶ Watch this segment
📖 Docs: Understanding query evaluation and query folding in Power Query — explains when Power Query can push a transformation back to the data source versus computing it locally.

Refresh schedules and sharing

Steven splits his dataflows in two — one for master data, one for transactions — mainly so each can carry its own refresh schedule. A Power BI Pro license allows up to 8 scheduled refreshes per day per dataflow; Premium raises that to 48. There’s currently no per-dataflow share button: access is granted by sharing the Power BI workspace that contains the dataflow, with viewer, contributor, or member roles controlling what recipients can do.

📖 Docs: Introduction to dataflows and self-service data prep and Creating a dataflow — the two Microsoft Learn resources Steven points to for a deeper walkthrough of the same steps.

Consuming a dataflow in Power BI

With the dataflow in place, Power BI Desktop’s Get Data dialog gets a new Dataflows option alongside the direct Business Central connector. Reports built this way look identical to reports built straight from Business Central, but every refresh now pulls from the dataflow rather than re-querying Business Central. Because the report’s refresh schedule and the dataflow’s refresh schedule are independent, Steven notes there’s little point setting a report to refresh 48 times a day if the underlying dataflow only refreshes once.

Power BI Finance report showing a matrix of accounts (Assets, Inventory, Accounts Receivable, Cash) by month, built from data sourced through a dataflow
▶ Watch this segment

Consuming a dataflow in Excel and Excel report layouts

The same dataflow can be reached from Excel’s Data → Get Data → Power Platform → Dataflows menu, using the same Power Query engine, without opening Power BI Desktop at all. Steven connects this to Business Central’s newer Excel report layouts: an Excel layout generated by a BC report only contains the fields defined in that report’s dataset, but once the file is open, a user can pull in additional columns directly from a dataflow (for example extra general ledger detail not present in the base report) using the same Get Data flow.

He flags one operational detail from the Q&A: an Excel layout deployed as part of an AL extension does not automatically deploy or version the dataflow it depends on. There’s no built-in tooling for this — teams typically script it with PowerShell against the Power BI REST API, similar to how AL extensions are deployed via DevOps pipelines, and should deploy the dataflow before the extension to avoid a broken reference on first refresh.

📖 Docs: Creating an Excel layout report — covers the Data worksheet and metadata fields an Excel report layout depends on.

Why dataflows?

Steven closes with a summary of the advantages he sees in practice:

  • Data is read once from Business Central; every report or Excel file after that reads from the dataflow.
  • Consumers only need access to the Power BI workspace, not to Business Central itself — useful for analysts without a BC license.
  • A dataflow can source and combine data from multiple systems, not just Business Central (Dynamics 365, files on OneDrive, on-premises data via a Power BI Gateway, or another dataflow).
  • Security can be managed at the dataflow level, including row-level security in Power BI — though he warns that if the dataflow connects to Business Central using a super-user account, all dataflow consumers get that account’s visibility into the data, regardless of their own Business Central permission sets.
  • A dataflow definition can be exported as JSON and imported into another environment, which also makes it something you can version-control alongside an AL project.
Summary slide 'Why dataflows?' listing four scenarios: create reusable transformation logic, share across many datasets and reports, create a single source of truth, and prevent analysts from needing direct access to the underlying data source
▶ Watch this segment

Q&A highlights

A few points from the live Q&A worth calling out:

  • Pagination: Power Query paginates API calls to Business Central automatically, fetching data in batches — this is why a refresh can take noticeably longer with larger data volumes.
  • Cross-tenant data: a single dataflow can’t combine Business Central environments that live in different domains/tenants, and a delegated admin account cannot be used to read APIs or web services for this purpose — the connection needs a user from the target tenant.

This post was drafted with AI assistance based on the webinar transcript and video content.