# Power BI Dataflow Checklist

> Dataflows can be a very useful and powerful data transformation tool to centralize & govern transformation logic. In this article are some points to consider when making & deploying Power BI Dataflows in your organization.

- URL: https://data-goblins.com/dataflow-checklist
- Author: Kurt Buhler
- Published: 2022-10-18
- Topic: Tools and automation

# MAKING SUSTAINABLE & RELIABLE DATAFLOWS

*Considerations for making good **Power BIdataflows with Power Query Online***

---

***Note:** While this article is a ‘Dataflows’ checklist, many of the tips can be cross-applied to any product using Power Query, from Excel to Power BI Datasets and others.*

*Check also the *[***Power Query***](https://learn.microsoft.com/en-us/power-query/best-practices)* and *[***Dataflows***](https://learn.microsoft.com/en-us/power-bi/transform-model/dataflows/dataflows-best-practices)*** best practices** from the Microsoft documentation. *
*It’s not the purpose of the article to repeat existing docs; I will only elaborate on undocumented points.*

<img class="dg-plate" src="https://images.data-goblins.blog/2025/12/dataflow-checklist-overview.png" alt="">

---

[**PART 1:** HANDOVER OF DATASETS & REPORTS](https://data-goblins.com/handover)

CHECKLISTS
[**PART 2:** MODEL / DATASET](https://data-goblins.com/dataset-checklist)
**PART 3:** DATAFLOW
[**PART 4:** REPORT](https://data-goblins.com/report-checklist)
[**PART 5:** DASHBOARD](https://data-goblins.com/report-checklist)
[**PART 6:** POWER BI APP](https://data-goblins.com/app-checklist)

---

<figure class="dg-figure"><img class="dg-plate" src="https://images.data-goblins.blog/2025/12/dataflow-checklist-bottleneck.png" alt=" Slow or messy dataflows can become a bottleneck instead of enabling easier re-use of data &amp; transformation logic. "><figcaption>Slow or messy dataflows can become a bottleneck instead of enabling easier re-use of data &amp; transformation logic.</figcaption></figure>

## DATAFLOWS IN POWER BI

**A powerful and popular feature, Power BI dataflows enable users to centralize transformation logic with Power Query, storing shaped data in a managed, Power BI data lake.** Using the intuitive Power Query user-interface, data can be filtered, aggregated, combined and transformed. While easy to create and use, Dataflows and Power Query in general contain a lot of underlying complexity that can make or break a data solution. Neglecting certain elements when making a dataflow can result in slow refreshes and large, unmanageable transformation logic. Given how quickly and easily a Dataflow can be created, shared and used, this can rapidly get out of control, causing bottlenecks and governance threats.

**This can be easily avoided if a few key considerations are kept in mind** when designing, building and governing Dataflows in Power BI. In this article, I list out key elements to note when making or managing a Dataflow, elaborating on points not already documented, elsewhere.

---

<figure class="dg-figure"><img src="https://images.data-goblins.blog/2025/12/dataflow-checklist-full.png" alt=" Power BI Dataflows Checklist - select items. Scroll down further for the full, up-to-date checklist. "><figcaption>Power BI Dataflows Checklist - select items. Scroll down further for the full, up-to-date checklist.</figcaption></figure>

---

<img class="dg-plate" src="https://images.data-goblins.blog/2025/12/dataflow-checklist-diagram.png" alt="">

**One of the most obvious use-cases for Dataflows are centralizing transformation logic, to ensure a “central truth” and avoid redundant, parallel logic in multiple solutions which risk becoming divergent.** However, it’s important to define up-front what the final shape of the data will be. Missing columns or over-aggregated data will result in downstream consumers not being able to use the dataflow because it doesn’t fit their use-case. Thus, when designing a dataflow solution, it’s important to reflect on who the downstream consumers are and what their needs will be - “who will use this, and what will they use this for?” Try to define a common schema & detail level that fills all reasonable downstream uses of the dataflow, to best enable consumers to use it, even if they still apply slight aggregations or changes ontop. Examples are given below of situations to be avoided:

- **Dataflow misses columns needed in a downstream dataset or analysis**
*Example: Order reason field is removed from order data when it is needed for a DAX expression to calculate orders returned due to wrong size.*
- **Dataflow over-aggregates data past a detail level needed in a downstream dataset or analysis**
*Example: Customer detail is lost when sales data is aggregated to the region level, when there exists a reporting need for customer detail data.*
- **Dataflow applies a transformation that renders downstream requirements impossible**
*Example 1: Local currency transformed to EUR, when there exists a report requirement for seeing volumes in local currency or having dynamic currency conversion.*
*Example 2: Exchange rates rounded to two decimal places (Fixed Decimal) when 4-8 decimal places are needed for volatile currencies / rate types.*

It’s thus important to be keenly aware of the reporting needs and scope when designing and constructing a dataflow, to ensure it delivers maximum value to the business.

---

**Generally, a clear sign of poorly-built Power Query is a long list of applied steps running the length of the right-hand margin.** This often reflects an *ad hoc* transformation process by the creator, with redundant steps taking incremental (or even circuitous) routes to the final, desired data shape. This usually results in Power Query that is difficult to understand or maintain, and which struggles to perform with higher data volume or complexity.

To avoid or correct this situation, it’s worthwhile to plan out the Dataflow design ahead of time:

**While not always necessary for smaller transformations, it’s helpful to define the desired endpoint for your data.** Defining what you need helps you map out how to get there. Doing this mitigates that *ad hoc* transformation process, resulting in excessive or sub-optimal applied steps. It also helps you identify ahead of time specific solutions or code snippets which can be helpful to produce your desired result.

**A survey of the available data is always necessary to define your starting point.** Bridging between what you have and what you need is where the dataflow design comes in. While looking at the data, it can be difficult to see what you need in its structure, particularly if pivot and combine operations are necessary. Feel free to perform ad hoc transformations in a temporary query at this stage, but ensure to limit the data to not waste time waiting for data previews.

What can be helpful is using the [**Table.Profile**](https://learn.microsoft.com/en-us/powerquery-m/table-profile) function in Power Query to give an overview of the source.

**Simply drawing out on paper or a whiteboard the steps needed to get the data in the desired shape may be helpful.** It defines the core objectives of each group of steps. For example, you might be trying to get text data from a web source that has multiple pages. You may need to (1) Connect to the pages separately, (2) Identify the text elements, (3) Combine each page and (4) clean the result. In practice, there will be more steps than this in Power Query, but mapping out the data objectives helps keep that ‘endpoint’ clear.

**Once you know the steps you want to take, you have to translate this to steps in Power Query, itself.** Defining these steps makes it easier to search for or try existing solutions, favoring those which perform best on your data and are easiest to understand / implement.

**Finally, you can implement these steps in the Dataflow, assessing the performance and complexity of each step.** If you feel a particular set of steps take too long, or are too many, you can iteratively research and try alternative approaches.

While the number of applied steps are not directly indicative of poor performance as such, it’s important to think critically about better ways to approach a problem than a 12th “Replace Values” step.

**On the other hand, however, overly optimized, complex custom functions or authored Power Query M code can also be problematic.** Most users of Power Query likely use only the user interface, oblivious to the underlying code changes. If a solution is handed over that contains a lot of custom code copied into the Advanced Editor, it might be difficult for a future person to maintain unless it is well-documented or they have extensive knowledge of the mash-up language. Too often, I have seen users completely delete an optimized but complex code and re-do it all in the user interface when they needed to make a change. It’s thus important to be aware of the user context when a Dataflows solution is delivered or passed down, and generally to balance simplicity with the “optimal” solution.

---

<figure class="dg-figure"><img class="dg-plate" src="https://images.data-goblins.blog/2025/12/goblin-cafe-dataflow.png" alt=" Using dataflows to sail from  Bar Chart Bay to Insight Island… "><figcaption>Using dataflows to sail from  Bar Chart Bay to Insight Island…</figcaption></figure>

## TO CONCLUDE

Dataflows are a powerful tool that can sometimes feel like Pandora’s Box. It’s important to consider why the dataflow is being made and who is using it, and to follow best practices both for dataflows in general and the Power Query therein. By following a simple checklist of key considerations, we can ensure our dataflows become an important instrument to help us navigate our sea of data toward further insights, and away from governance risks & performance issues.

---

---

## POWER BI DATAFLOW

Cloud data transformation tool, typically made with Power Query Online to re-centralize data/logic and scale Power Query transformations.

### Dataflow Design

<label class="checklist-item">
<input type="checkbox" id="dataflow-design-0" class="checklist-checkbox">
Check if you need a dataflow - does it fit the use-cases of single truth, re-used transformation logic?
</label>

<label class="checklist-item">
<input type="checkbox" id="dataflow-design-1" class="checklist-checkbox">
Check if you can or should use the 'Common Data Model'
</label>

<label class="checklist-item">
<input type="checkbox" id="dataflow-design-2" class="checklist-checkbox">
Check the 'Considerations & Limitations' in the Microsoft guidance documentation
</label>

<label class="checklist-item">
<input type="checkbox" id="dataflow-design-3" class="checklist-checkbox">
Browse the starting data & define your desired 'end-point'; what transformation steps are needed?
</label>

<label class="checklist-item">
<input type="checkbox" id="dataflow-design-4" class="checklist-checkbox">
Map dependencies; define the needs for each downstream point-of-consumption to avoid over-transformation
</label>

<label class="checklist-item">
<input type="checkbox" id="dataflow-design-5" class="checklist-checkbox">
Plan where the Dataflow should live (which workspace - i.e. workspace specific for dataflows?)
</label>

### Building a Dataflow

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-0" class="checklist-checkbox">
Apply a parameterized, early filter to limit data while building
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-1" class="checklist-checkbox">
Parameterize repeated strings, filters and data source information
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-2" class="checklist-checkbox">
Push transformations to the upstream data source where feasible
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-3" class="checklist-checkbox">
Remove unnecessary data; delete unneeded columns & aggregate unneded detail
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-4" class="checklist-checkbox">
Ensure query folding is maintained as long as possible
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-5" class="checklist-checkbox">
Avoid merges & appends; save 'expensive' steps that read full data for later
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-6" class="checklist-checkbox">
Follow Power Query best practices from Microsoft
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-7" class="checklist-checkbox">
Follow Dataflows best practices from Microsoft
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-8" class="checklist-checkbox">
Check data types & decimal precision
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-9" class="checklist-checkbox">
Disable load on intermediate data sources & functions
</label>

<label class="checklist-item">
<input type="checkbox" id="building-a-dataflow-10" class="checklist-checkbox">
Design & add error handling on 'sensitive' steps where the query could fail
</label>

### Optimizing a Dataflow

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-0" class="checklist-checkbox">
Reduce steps & complexity as much as feasible; tweak steps to ensure folding
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-1" class="checklist-checkbox">
Configure incremental refresh if you are on a premium capacity
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-2" class="checklist-checkbox">
Try advanced code-authoring approaches, editing the Advanced Editor query script
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-3" class="checklist-checkbox">
If connecting to Excel files, convert to .csv instead of .xlsx if feasible
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-4" class="checklist-checkbox">
Avoid query references to optimize if not needed, as it hits the source multiple times
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-5" class="checklist-checkbox">
Carefully test Table.Buffer and List.Buffer approaches if the query is not folding
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-6" class="checklist-checkbox">
If connecting to parquet files, understand PQ will not do predicate pushdown, etc.
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-7" class="checklist-checkbox">
Experiment with different 'hot'/'cold' partition strategies if no incremental refresh
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-8" class="checklist-checkbox">
Try different approaches for multiple find & replace, i.e. add conditional column
</label>

<label class="checklist-item">
<input type="checkbox" id="optimizing-a-dataflow-9" class="checklist-checkbox">
Configure enhanced compute engine (Premium)
</label>

### Readying a Dataflow for Deployment & Handover

<label class="checklist-item">
<input type="checkbox" id="readying-a-dataflow-for-deployment-and-handover-0" class="checklist-checkbox">
Define clearly who owns & updates the dataflow
</label>

<label class="checklist-item">
<input type="checkbox" id="readying-a-dataflow-for-deployment-and-handover-1" class="checklist-checkbox">
Rename steps to concise, clear & logical names
</label>

<label class="checklist-item">
<input type="checkbox" id="readying-a-dataflow-for-deployment-and-handover-2" class="checklist-checkbox">
Add helpful, clarifying comments to each step
</label>

<label class="checklist-item">
<input type="checkbox" id="readying-a-dataflow-for-deployment-and-handover-3" class="checklist-checkbox">
Format the code in the advanced editor using VS Code's "Power Query" extension
</label>

<label class="checklist-item">
<input type="checkbox" id="readying-a-dataflow-for-deployment-and-handover-4" class="checklist-checkbox">
Add a description to the dataflow and dataflow entity (table)
</label>

<label class="checklist-item">
<input type="checkbox" id="readying-a-dataflow-for-deployment-and-handover-5" class="checklist-checkbox">
Configure scheduled refresh & endorsement
</label>

### Train Dataflow Users

<label class="checklist-item">
<input type="checkbox" id="train-dataflow-users-0" class="checklist-checkbox">
Advantages of dataflows: centralizing data/logic, scaling performance, etc.
</label>

<label class="checklist-item">
<input type="checkbox" id="train-dataflow-users-1" class="checklist-checkbox">
Connecting to dataflows from Power BI or Excel
</label>

<label class="checklist-item">
<input type="checkbox" id="train-dataflow-users-2" class="checklist-checkbox">
Which dataflow to use (i.e. certified, promoted) for what data
</label>

<label class="checklist-item">
<input type="checkbox" id="train-dataflow-users-3" class="checklist-checkbox">
What are the Power Query best practices
</label>

<label class="checklist-item">
<input type="checkbox" id="train-dataflow-users-4" class="checklist-checkbox">
What are the Dataflows best practices
</label>

<label class="checklist-item">
<input type="checkbox" id="train-dataflow-users-5" class="checklist-checkbox">
Limitations & considerations of dataflows they can use or create
</label>

### Documentation for Power BI Dataflows

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-0" class="checklist-checkbox">
Basic Info: Name, SPOC, Location, Workspaces...
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-1" class="checklist-checkbox">
Purpose: Business questions/problems the model addresses
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-2" class="checklist-checkbox">
User segments: Intended audience and tools used
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-3" class="checklist-checkbox">
Complexity: atypical properties/features
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-4" class="checklist-checkbox">
Data sources: Type, when updated...
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-5" class="checklist-checkbox">
Security and Access: Who has build permissions...
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-6" class="checklist-checkbox">
Manual interventions & justifications (if any)
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-7" class="checklist-checkbox">
Typical refresh time; how long does it take to refresh?
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-8" class="checklist-checkbox">
Refresh schedule; what frequency does the Dataflow update? When do upstream sources update?
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-9" class="checklist-checkbox">
Schema of each entity / table; what columns are in the dataflow?
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-10" class="checklist-checkbox">
Volume of each entity / table; how many rows do they have?
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-11" class="checklist-checkbox">
Custom functions; what advanced M code has been authored? Can it be re-used?
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-12" class="checklist-checkbox">
Shared expressions; which expressions have disabled load and why?
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-13" class="checklist-checkbox">
If the Dataflow uses other subscriptions - Premium or AI features, for example
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-14" class="checklist-checkbox">
'Common Data Model' mapping
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-15" class="checklist-checkbox">
Sensitivity label / DLP policies; if it contains PII or restricted information
</label>

<label class="checklist-item">
<input type="checkbox" id="documentation-for-power-bi-dataflows-16" class="checklist-checkbox">
Lineage & Dependencies; what content are consuming the dataflow?
</label>
