# Tableau Extracts to Power BI Dataflows: What Maps Where, and When a Dataflow Is Worth It

> An extract maps to Import mode, not to a dataflow. When a dataflow is the right target, Gen1 versus Gen2, computed tables, and the two refresh schedules.

- Canonical: https://getantares.io/convert-tableau-extracts-to-power-bi-dataflows/
- Published: 2026-02-18
- Updated: 2026-07-28

---

The mapping most migration plans assume here is wrong. A Tableau extract is a cache belonging to one workbook, and its Power BI counterpart is Import mode inside a semantic model, not a dataflow. A dataflow is reusable preparation logic that many models can share. Its closest Tableau relatives are a published data source or a Tableau Prep flow. So the real question is not how to turn extracts into dataflows, it is which of your extracts were doing a job that deserves one.

## What each Tableau artefact actually maps to

| Tableau | Power BI | Notes |
| --- | --- | --- |
| Extract used by one workbook | Import-mode semantic model | No dataflow needed, see [Hyper files to Power BI](/convert-hyper-files-to-power-bi/) |
| The same extract logic repeated in many workbooks | Dataflow | The case dataflows exist for |
| Published data source | Shared semantic model | Reuses the model, not just the tables |
| Tableau Prep flow | Dataflow | Preparation as its own scheduled artefact |
| Extract refresh schedule | Dataflow refresh plus model refresh | Two schedules to sequence, not one |
| Extract filters and aggregation | Power Query steps in the dataflow | Written once, inherited everywhere |
| Analysts connecting straight to production | Dataflow as the only exposed layer | A documented reason to use them |

## When a dataflow earns its place

Microsoft lists the scenarios [dataflows are designed for](https://learn.microsoft.com/en-us/power-bi/transform-model/dataflows/dataflows-introduction-self-service), and they map neatly onto problems Tableau estates usually have: reusable transformation logic that many semantic models and reports share, a single curated source of truth, persistence into your own Azure Data Lake Gen2 storage, and stronger security around the underlying sources by exposing dataflows to report creators instead of database credentials.

A practical rule follows from that. If one workbook owned the extract, import into the model and move on. If the same joins, filters and cleanup were pasted into five workbooks because that was the only way to share them in Tableau, that repetition is the dataflow. Migrations that skip this step reproduce the copy-paste estate in a new tool, which is the one outcome nobody is paying for.

## Gen1 or Gen2

Power BI Dataflow Gen1 is now in a legacy state and, in Microsoft's words, "won't receive new feature investment". [Dataflow Gen2](https://learn.microsoft.com/en-us/fabric/data-factory/dataflows-gen2-overview) is the recommended path for customers with Fabric access, and it requires a Fabric capacity, a Fabric trial capacity, or a Power BI Premium capacity. Pro and PPU customers can keep using Gen1.

| Capability | Gen1 | Gen2 |
| --- | --- | --- |
| Authoring in Power Query | Yes | Yes |
| Output destinations beyond internal storage | No | Yes, including Lakehouse, Warehouse, Azure SQL and Snowflake |
| DirectQuery through the dataflow connector | Yes | No |
| Runs inside pipelines | No | Yes |
| Licensing floor | Pro | Fabric or Premium capacity |

The DirectQuery row is the one that catches migrations out. A Tableau live connection that you planned to reproduce as DirectQuery over a dataflow works on Gen1 and not on Gen2, so that pairing has to be settled before anyone starts building.

## Computed tables, and the line where Premium starts

[Computed tables](https://learn.microsoft.com/en-us/power-query/dataflows/computed-tables) perform in-storage computation: transformations run against data already sitting in dataflow storage rather than going back to the source database. That is what makes a layered design possible, where a raw table is loaded once and enriched tables are derived from it, and it is also where the licensing line sits, since in-storage computation needs a Premium subscription.

It maps onto something Tableau users already do by hand. An extract that pulls a wide table and a second extract that aggregates the same data is exactly a raw table plus a computed table, built twice because Tableau had nowhere to keep the intermediate result.

## You now have two refresh schedules

An extract had one schedule. A dataflow feeding a semantic model has two, and the model's refresh has to run after the dataflow that supplies it, or reports show yesterday's numbers while everything reports success. Gen1 leaves that sequencing to you, spaced far enough apart that the first finishes before the second starts. Gen2 runs inside pipelines, so the dependency can be expressed rather than estimated, which is the stronger reason to prefer it for anything a business actually depends on.

## Dataflow or shared semantic model?

Both are reuse, at different layers, and the choice is not either-or. A dataflow reuses *tables*: the query logic, the cleanup, the source credentials. A semantic model reuses the *model*: relationships, measures, formatting and row-level security. A Tableau published data source carried both at once, which is why it splits into two decisions during migration rather than one.

For most estates the answer is layered. Dataflows where several models share preparation, shared semantic models where several reports share business logic, and neither where a single report owns its data end to end.

## What Antares does with extracts

The Analyzer inventories every data source in every workbook and records whether each is live or extract-backed, together with what it connects to. Read across workbooks, that inventory answers the question this page opens with: which preparation logic repeats, and therefore which extracts are dataflow candidates rather than one-off imports.

Moving the rows themselves is out of scope by design. Analysis and conversion read metadata only, never business data, and the data platform decisions stay with the people who own the platform. [Run the free Analyzer](https://try.getantares.io) to see which sources repeat across your own workbooks.

Related reading: [Hyper files to Power BI](/convert-hyper-files-to-power-bi/) and [data sources to semantic models](/tableau-data-sources-to-power-bi-datasets/). Primary sources: Microsoft's [dataflow configuration guide](https://learn.microsoft.com/en-us/power-bi/transform-model/dataflows/dataflows-configure-consume) and the [Gen1 versus Gen2 comparison](https://learn.microsoft.com/en-us/fabric/data-factory/dataflows-gen2-overview).

## Related resources

- [Tableau to Power BI Migration Guide](/tableau-to-power-bi-migration/)
- [Hyper Files to Power BI](/convert-hyper-files-to-power-bi/)
- [Data Sources to Power BI Datasets](/tableau-data-sources-to-power-bi-datasets/)
- [Custom SQL to Power BI](/tableau-custom-sql-to-power-bi/)

## FAQ

### Is a Power BI dataflow the equivalent of a Tableau extract?

No. An extract is a cache belonging to one workbook, and its counterpart is Import mode inside a semantic model. A dataflow is reusable preparation logic that many models share, which puts it closer to a Tableau published data source or a Tableau Prep flow.

### When should a Tableau extract become a dataflow?

When the same joins, filters and cleanup were repeated across several workbooks because that was the only way to share them. One workbook owning an extract needs no dataflow. Microsoft also documents dataflows for exposing curated data instead of source credentials.

### Should I use Dataflow Gen1 or Gen2?

Gen2 for new work: Gen1 is in a legacy state and will not receive new feature investment. Gen2 needs a Fabric or Power BI Premium capacity, supports output destinations such as Lakehouse and Warehouse, and runs inside pipelines. One catch: DirectQuery through the dataflow connector works on Gen1 only.

### What replaces the extract refresh schedule?

Two schedules instead of one. The dataflow refreshes, then the semantic model that reads it refreshes, and the second must run after the first. Gen1 leaves the spacing to you; Gen2 can express the dependency inside a pipeline.
