Live training: next batches coming soon. Join the waitlist:Waitlists open:Developer Training →Developer →Copilot Studio Training →Copilot Studio →

Dataverse Dataflow: Copy a SharePoint List into Dataverse with Power Query

Six hundred twenty-three service requests sat in a SharePoint list, and the new Dataverse app couldn’t see a single one. The service desk asked me to move them without copy-paste and keep the door open for scheduled updates.

In this tutorial, we’ll build a dataverse dataflow that loads that list into a new Dataverse table: create the dataflow, connect to SharePoint, trim columns in Power Query, map the table, set the refresh, and read the refresh history.

We’ll also cover standard vs analytical dataflows, loading into an existing table with an alternate key, incremental refresh and gateways.

Here’s what we’re building: one refresh that created all 623 rows with zero failures.

Dataverse dataflow refresh details showing Rows created 623, Rows updated 0 and Failed rows 0

Before You Start

A dataflow is a saved Power Query job that runs in the cloud. Power Query is the same get-and-shape-data tool you know from Excel and Power BI. If Dataverse itself is new to you, start with what Microsoft Dataverse is.

You need maker rights in the environment and a license that includes Dataverse. Microsoft Learn notes that creating dataflows isn’t available with the Power Apps Developer Plan license. I built this in our Power Platform environment.

The source is the Service Requests list on /sites/SPGuides. It has 28 columns, but the app needs only five. Not sure the move is worth it? Our Dataverse vs SharePoint list comparison covers the trade-offs.

SharePoint columnDataverse column after mappingNotes
Titlecr85a_Title (Text)Becomes the primary name column
Statuscr85a_Status (Text)For example In Progress
Prioritycr85a_Priority (Text)For example Normal
Requestercr85a_Requester (Text)For example Adele Vance
DueDatecr85a_DueDate (Date and time)For example 01/15/2026

A sample row: “Badge access #1010”, In Progress, Normal, requested by Adele Vance, due 01/15/2026.

Standard or Analytical: Which Dataflow Do You Need?

The destination decides the type. A standard dataflow loads Dataverse tables, so Power Apps, Power Automate and model-driven apps can use the rows. An analytical dataflow stores data in Azure Data Lake storage for reporting.

StandardAnalytical
How to createPower Apps: New dataflow (default)Check Analytical entities only, or create it in Power BI
Stores data inDataverse tablesAzure Data Lake Storage
AI functions and computed tablesNoYes
Default loadIncremental (adds and updates rows)Full load
Used byAny app that reads DataverseMainly Power BI

For an app, pick standard. For reports only, analytical is usually lighter. Our Dataverse and Power BI tutorial shows the reporting side.

Step 1: Create the Dataflow

First we give the dataflow a name and keep it standard.

  1. Go to make.powerapps.com and pick your environment in the top-right environment switcher.
  2. Select Dataflows in the left pane. If you don’t see it, select More and pin it.
  3. Select + New dataflow.
  4. Type the Name Service Requests from SharePoint. Leave Analytical entities only unchecked.
  5. Select Create.
New dataflow dialog with the name Service Requests from SharePoint and the Create button

Checkpoint: Power Query opens on the Choose data source page.

Step 2: Connect to the SharePoint List

Next, point Power Query at the list.

  1. Under New sources, select the SharePoint Online list tile. Excel workbook, Text/CSV, SQL Server and Dataverse sit next to it.
  2. In Site URL, paste the site root, such as https://yourtenant.sharepoint.com/sites/SPGuides. Don’t add the list path.
  3. Under Connection credentials, pick an existing connection or sign in. Ours shows Authentication kind: Organizational account. Select Next.
Power Query Choose data source page with the SharePoint Online list tile highlighted
SharePoint Online list connection with the SPGuides site URL and an Organizational account connection

The navigator listed all 61 lists on the site. I searched for Service Requests, checked it, and the preview showed its 28 columns. Then I selected Transform data. If you only need a one-time copy, compare this with creating a Dataverse table from a SharePoint list.

Power Query navigator with the Service Requests list checked and its data preview

Checkpoint: the Power Query editor opens with the Service Requests query.

Step 3: Shape the Data in Power Query

Fewer columns means a faster refresh and a cleaner table.

  1. Select the Title column header, then Shift+click DueDate to select Title, Status, Priority, Requester and DueDate.
  2. Right-click a selected header and choose Remove other columns.
  3. Check Applied steps: Source, Navigation 1, Removed other columns.
Power Query editor right-click menu on the selected columns with Remove other columns highlighted

Power Query wrote this formula for the step. You can paste it into the formula bar to get the same result:

Table.SelectColumns(#"Navigation 1", {"Title", "Status", "Priority", "Requester", "DueDate"})
Power Query formula bar showing the Table.SelectColumns step that keeps five columns

Want to see every step as code? Open the Advanced editor on the Home tab. Select Next when you’re done.

Checkpoint: the status bar shows Columns: 5.

Step 4: Map the Query to a New Dataverse Table

Now we tell the dataflow where the rows land.

  1. Under Load settings, choose Load to new table. The other options are Load to existing table and Do not load.
  2. Rename the table to SharePoint Service Request. The default name, Service Requests, clashed with a table we already had.
  3. Under Unique primary name column, change Auto-generated to Title.
  4. Leave Alternate key columns empty for this first load, and review the column mapping.
Dataflow load settings with Load to new table and table name SharePoint Service Request

Watch the types. Title mapped to Multiline text until it became the primary name column, then it switched to Text. DueDate became Date and time. Building tables by hand instead? See how to create a table in Microsoft Dataverse.

Column mapping with Title as the unique primary name column and cr85a destination columns

Checkpoint: each source column has a cr85a_ destination column.

Step 5: Set the Refresh and Publish

The last page decides when the dataflow runs again.

  1. Choose Refresh manually for a one-time move, or Refresh automatically for a schedule.
  2. With automatic refresh, pick Frequency-based refresh (every n minutes in 30-minute steps, start time in UTC) or Refresh on specific days and times.
  3. Keep Send refresh failure notification to the dataflow owner checked.
  4. Select Publish.
Dataflow refresh settings with Refresh manually and the frequency-based refresh options

We published with Refresh manually. Publishing starts the first refresh right away. If you need logic per row, such as lookups to other tables, a flow fits better; see how to import CSV data to Dataverse with Power Automate.

Checkpoint: the dataflow list shows Publish in progress, then a Last refresh time.

Test the Dataflow

Open the row’s … menu and select Show refresh history. The same menu has Refresh, Edit refresh settings, Edit incremental refresh and Create copy.

Dataflows list row menu with Show refresh history highlighted

Our run started at 7:51:25 AM on 10/22/2026, was typed On demand, took 00:01:31 and Succeeded.

Dataflow refresh history with a Succeeded On demand refresh on 10/22/2026 lasting 00:01:31

Open the run for details: “Refresh completed successfully for all tables in the dataflow”, with Rows created 623, Rows updated 0 and Failed rows 0. Then open Tables, find SharePoint Service Request, and check the data.

New SharePoint Service Request table in Dataverse with Title, Status and Priority columns

All 623 rows were there, such as Badge access #1010. From here a canvas app can get data from Dataverse in Power Apps like any other table.

Load into an Existing Table with an Alternate Key

Here’s the catch with our first load: without a key, every refresh creates new rows. Run it again and you’d get a second set of 623. A key turns the load into an upsert: update the row if the key matches, create it if not.

  1. Create an alternate key on the Dataverse table, using a column that is unique per row, like a request ID.
  2. In the dataflow, choose Load to existing table and pick the table.
  3. Select the key in the key dropdown, then map each source column.
  4. To keep the table in sync, check Delete rows that no longer exist in the query output.

That delete option needs the key, slows the refresh, and relies on the createdon and modifiedon columns. The primary name column isn’t a key; duplicates are allowed there. If you’d rather add rows another way, see how to add data to a Dataverse table.

Other Sources: Excel, CSV and On-Premises Data

The steps don’t change for files. Pick Excel workbook or Text/CSV, point to the file in OneDrive or SharePoint, choose the sheet, and map. For a quick one-off file, creating a Dataverse table from Excel or CSV is faster.

Data that isn’t in the cloud, like an on-premises SQL Server, needs an on-premises data gateway. You pick it in the connection settings. For Power Apps dataflows, you need admin rights granted on the gateway directly, not through a group.

Make It Production-Ready

  • Set an alternate key before you turn on a schedule, or each refresh adds duplicates.
  • Remember only the creator owns and can edit a dataflow. Use a shared service account for team dataflows.
  • Incremental refresh (Store rows / Refresh rows from the past) needs a Power Apps per-app or per-user plan and a DateTime column that doesn’t change.
  • Standard dataflows are bound by Dataverse service protection limits; failed records are retried up to three times.
  • Build the table inside a solution so it moves cleanly; see our Dataverse solution guide.

Troubleshooting

Table name already exists. The default name came from the list, Service Requests, and clashed with our table. Rename it on the mapping page.

Can’t connect to the SharePoint list. Use the site root URL, with no list or folder path. A DLP policy that blocks HTTP with Microsoft Entra (preauthorized) also breaks the SharePoint connector.

“Connection to Dataverse failed”. Go to Connections, find Microsoft Dataverse (legacy), and select Fix connection.

Line breaks vanished. Dataflows strip them from multiline text. Status and Status Reason columns and polymorphic lookups can’t be mapped either.

Where to Take It Next

More step-by-step builds are on our Power Apps tutorials hub.

If you’re working with Dataverse tables every day, these are worth a look next:

Frequently Asked Questions

What is a dataflow in Dataverse?

A dataflow is a cloud Power Query job that pulls data from a source, shapes it and loads it into Dataverse tables (a standard dataflow) or Azure Data Lake storage (an analytical dataflow), on demand or on a schedule.

How do I create a dataflow in Power Apps?

In make.powerapps.com select Dataflows > New dataflow, name it, choose a source, shape the data in Power Query, map it to a table, set the refresh and select Publish. Microsoft documents it in Create and use dataflows in Power Apps.

What’s the difference between standard and analytical dataflows?

Standard dataflows load Dataverse tables that apps and flows can use. Analytical dataflows (Analytical entities only) store data in Azure Data Lake storage and add AI functions and computed tables, mainly for Power BI.

Why does my dataflow create duplicate rows on every refresh?

There’s no key. Set an alternate key in the mapping so the dataflow upserts instead of creating rows. See Field mapping considerations for standard dataflows.

How often can a Dataverse dataflow refresh?

Manually, or automatically in 30-minute increments with a frequency-based schedule, or on specific days and times. Our 623-row SharePoint load took 00:01:31.