Dataverse data import templates
How to bulk-import data into Dataverse using import templates — the wizard, CSV/Excel formats, lookups by name, duplicate detection, and the gotchas of large imports.
Bulk-loading data into Dataverse — a list of contacts from a marketing event, the customer master from a legacy system, a one-off catalog refresh — is a common need. The data import wizard in model-driven apps and the Excel templates generated per table are the built-in answer. They're underused, often because users default to ad-hoc connector-based loads or scripts when the built-in tooling is simpler.
The starting point: import template. From any table's view in the model-driven app:
- Open the table view.
- Click
Export Template for Import(orExcel Templates → Download a Template). - An Excel file is generated with all importable columns as headers.
- Optional rows include sample data and lookups guidance.
The template ensures column names match Dataverse's logical names — much harder to get wrong than freehand.
Filling the template. Users populate rows with data. Notes:
- Text columns — plain text.
- Number columns — numeric values, no formatting.
- Date columns — ISO format (
yyyy-MM-dd) or local format consistent with the user's regional settings. - Choice columns — the choice label (e.g., "Active"), not the numeric value.
- Lookup columns — match by display name of the related record; system finds the record.
- Boolean —
Yes/No,True/False.
Import wizard.
- From the table view,
Import from Excel. - Pick the populated template.
- Wizard previews mapping.
- Adjust mappings if needed (custom columns may need explicit mapping).
- Configure duplicate detection and owner.
- Submit.
The import runs as a background system job. Progress and errors are visible in the Imports view.
Lookup resolution. When importing a sales order with customerLookup = "Acme Corp":
- The system searches the related table (Account, typically) for a row named "Acme Corp".
- If exactly one match, the lookup is set.
- If zero matches, the row fails with "Lookup not found."
- If multiple matches, the row fails with "Ambiguous lookup."
For unambiguous lookups, use a unique identifier (alternate key) in the lookup column rather than display name.
Alternate keys. A table can have one or more alternate keys — column combinations marked unique. Imports can reference rows by alternate key, removing display-name ambiguity. Common alternate keys:
- Account:
accountnumber. - Contact:
emailaddress1(sometimes). - Product:
productnumber.
Setting up alternate keys for import-prone tables is a small investment that pays off forever.
Duplicate detection. During import, the system runs configured duplicate detection rules. Options:
- Allow duplicates — bypass; risk of dirty data.
- Block duplicates — fail rows that match existing records.
- Update on match — modern option; update the existing record instead of inserting.
For master data imports, the "update on match" pattern is the right answer — load the file as the source of truth, system reconciles.
Performance. Imports are batched but not super fast:
- Hundreds to a few thousand rows per minute for moderate-complexity tables.
- Plugins and workflows fire per row — heavy custom logic dramatically slows the import.
- Async plugin executions queue up — can affect responsiveness during large imports.
For very large imports (100K+ rows), use Dataverse's batch APIs or Azure Data Factory rather than the import wizard.
Multi-table imports. Importing related records (orders with order lines):
- Import the parent first (orders).
- Import the children second (order lines), referencing the parents by alternate key or display name.
A single ZIP package with multiple Excel sheets, each mapped to a table, can be imported as a coordinated job.
Error handling. Failed rows show in the Failures view of the import job. Each error includes:
- The row number in the source.
- The column that failed.
- A description (lookup not found, validation error, plugin exception).
Iterate: fix the source file, re-import only the failed rows. Don't re-import the whole file unless you also want to update already-successful rows.
Re-importing for updates. Imports can update existing records:
- Map a unique column (primary ID or alternate key) to the row identifier.
- Configure "update on match."
- Subsequent imports update fields the file specifies.
Useful for incremental refreshes — load a delta file each day.
Common pitfalls.
- Wrong locale for dates. Mixed
MM/dd/yyyyanddd/MM/yyyyrows; some import wrong without erroring. - Lookup by name fails on whitespace differences. "Acme Corp." vs "Acme Corp"; alternate keys help.
- Choice value mismatch. Importing "Acitve" vs "Active"; fail.
- Owners not set. Default owner is the importing user; mass imports leave one user owning thousands of records.
- Plugins crashing the import. Heavy synchronous plugin on Create slows imports to a crawl; consider temporarily disabling, importing, re-enabling.
- No backup before import. Botched import overwrites data; no recovery. Always backup or trial in a sandbox.
Bulk delete after a botched import. Bulk delete jobs can remove a recent import's rows; track each import's job ID for clean rollback.
Operational rule. For occasional master data refreshes and one-off loads, the import wizard with Excel templates is the right tool. For ongoing high-volume integrations, dedicated ETL (Dataverse data flows, Azure Data Factory, custom code via Web API) outperforms. Pick the tool that matches the cadence — wizard for ad-hoc, automated pipeline for recurring.
Related guides
- Dataverse data model fundamentalsThe Dataverse data model — tables, columns, relationships, choices, security roles, and how it sits under Dynamics 365 and the Power Platform.
- Async jobs in DataverseHow Dataverse runs background work — system jobs, async plug-ins, workflow runs, and how to monitor, troubleshoot, and prevent the async backlog from getting out of hand.
- Bulk delete jobs in DataverseHow Dataverse's bulk delete handles mass record cleanup — scheduling, filters, retention policies, and the operational discipline around storage management.
- Business rules in DataverseHow business rules let you add field-level logic to forms without code — set value, lock field, show error, recommendation, and the limits of the engine.
- Business units and teams in Dataverse — a deep diveHow business units, owner teams, access teams, and Microsoft 365 group teams compose the security model in Dataverse — what each is for, how they interact, and the common design mistakes.