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:
Parent Flow
Child Flow
Hidden Dataverse Import Tables
Service Account Execution Model
High-Level Process
Parent Flow uploads file and passes parameters.
Child Flow receives metadata and file content.
Import record is created.
Data Imports record is populated.
Dataverse processes the bulk import.
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:
TableName
PrimaryKey
GUID
FileName
File Content Byte
Screenshot 1: Child Flow Trigger Configuration
This trigger acts as the entry point for the bulk import process.

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'])
Creating Import Records
The flow creates records in Dataverse hidden import tables.
This mechanism provides:
Better tracking
Improved scalability
Import status management
Auditability



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



Mapping Data to Data Imports Table
The next step involves populating the Data Imports table.
| Field | Value |
|---|---|
| Name | FileName Output |
| Content | ContentByte Output |
| Entity Key ID | Primary Key Output |
| Import Name | Generated FileName |
| Source | GUID |
| Target Entity | Table Name |
This mapping ensures all import metadata is stored and can be audited later.

Important Considerations
Before implementing this solution:
Use a Child Flow for import logic.
Invoke it from a Parent Flow.
Execute the Parent Flow using a Service Account.
Regular users typically cannot access hidden Import tables.
Follow the principle of least privilege when assigning permissions.
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.

Join the conversation! Your thoughts help the community grow.