Organizations frequently need to import thousands of records into Microsoft Dataverse for migrations, integrations, and data synchronization projects. Traditional approaches can become slow and difficult to manage when dealing with large datasets.

In this article, we'll explore a scalable Power Automate-based solution that leverages Dataverse hidden system tables ( Imports and Data Imports ) to efficiently import more than 25,000 records while maintaining traceability and performance.

Solution Architecture

The solution is designed using:

High-Level Process

  1. Parent Flow uploads file and passes parameters.

  2. Child Flow receives metadata and file content.

  3. Import record is created.

  4. Data Imports record is populated.

  5. Dataverse processes the bulk import.

  6. Import status can be tracked using Import ID.

Creating the Child Flow

The child flow uses the Manually Trigger a Flow trigger to accept information from the parent flow.

Input Parameters

The following inputs are passed from the parent flow:

Screenshot 1: Child Flow Trigger Configuration

This trigger acts as the entry point for the bulk import process.

Manual Trigger

Understanding Input Variables

TableName

Specifies the target Dataverse table where records will be imported.

Example:

  
Account
Contact
Lead
  

PrimaryKey

Defines the primary key field of the target entity.

if(equals(triggerBody()['text_1'],'NONE'), null, triggerBody()['text_1'])

GUID

Unique identifier used to track the import operation.

FileName

Name of the source file being processed.

concat(triggerBody()['text_3'],'_',formatDateTime(utcNow(),'yyyyMMddhhmm'))

File Content Byte

Contains the uploaded file content encoded in Base64 format.

base64ToString(triggerBody()['file']['contentBytes'])
inputparameter

Creating Import Records

The flow creates records in Dataverse hidden import tables.

This mechanism provides:

recordCreationdataImportScreenshot 2026-07-22 131950

Capturing the Import ID

After the import record is created, the generated Import ID is stored and reused throughout the process.

{
 "Row ID":"@outputs('Add_Data_In_Data_Imports')?['body/importid']",
 "ImportID":"@outputs('Add_Data_In_Data_Imports')?['body/importid']",
 "rowid":"@outputs('Add_Data_In_Data_Imports')?['body/importid']"
}

Import ID Output

dataActionUnboundActionperform bound

Mapping Data to Data Imports Table

The next step involves populating the Data Imports table.

FieldValue
NameFileName Output
ContentContentByte Output
Entity Key IDPrimary Key Output
Import NameGenerated FileName
SourceGUID
Target EntityTable Name

This mapping ensures all import metadata is stored and can be audited later.

FINALFLOW

Important Considerations

Before implementing this solution:

Conclusion

When importing large datasets into Dataverse, using the hidden Imports and Data Imports tables offers a highly scalable and enterprise-grade solution. Instead of relying on slow and resource-intensive loops, Power Automate can leverage Dataverse's native import engine to efficiently process 25,000+ records while maintaining security, performance, and traceability.

By combining a Parent Flow, Child Flow, and Service Account-based execution model, organizations can build a robust bulk import framework that supports large-scale migrations and ongoing data integration requirements with minimal performance impact.