How-toEpicor KineticData Migration / DMT

How to import data with Epicor DMT (Data Migration Tool)

Question
how to import data with epicor dmt

Also searched as

  • epicor data migration tool tutorial
  • epicor dmt template errors
  • epicor dmt import failed rows
  • epicor dmt part master import

Short answer

In DMT, pick the target data type (e.g. Part, Customer, PartWhse), Generate a template from the connected Epicor server so column names match your version's schema exactly, populate the spreadsheet, load it into DMT, run a Pre-Process/validate pass first to surface errors before committing, then Process to write the records.

Applies to: Epicor Kinetic and Epicor 10.x; DMT is a separate Windows client application, not a browser tool, installed from the Epicor client install media.

Run a clean DMT import

  1. 1Launch DMT and connect it to the target Epicor database/company using the same server, database, and credentials as the Epicor client.
  2. 2Select the Data Type from the tree (e.g. Part, PartPlant, Customer, ARInvoice, JobHead) - each data type maps to a specific DMT template with its own required and optional columns.
  3. 3Click Generate Template to export a fresh Excel template for your exact Epicor version and data type - never reuse an old template from a different version, since required fields can change.
  4. 4Fill in the spreadsheet; required columns are typically marked, and there is often a matching "lookup" tab showing valid values for coded fields (e.g. valid UOM codes, class IDs).
  5. 5In DMT, browse to the completed file and load it into the grid.
  6. 6Run Pre-Process (or the validate-only option depending on version) first - this checks each row against business logic without committing, surfacing errors like invalid part class or missing required field.
  7. 7Fix flagged rows in the source spreadsheet, reload, and re-validate until the error count is acceptable.
  8. 8Run Process to commit; DMT writes a results/error log file (path shown after the run) listing each row's success or failure and the exact error message - review it row by row for partial failures.
  9. 9For large imports, batch in chunks (e.g. 500-2000 rows) rather than one massive file, since a single bad row can abort or slow the whole batch depending on data type and version.

Why DMT instead of BAQ import or REST

DMT calls the same underlying business object methods the Kinetic UI uses (e.g. PartSvc.Update), which means it runs the same validations, defaulting logic, and BPM directives that would fire if you entered the record by hand. This is slower than a raw SQL insert but far safer - it is the supported path for master data loads (parts, customers, BOMs) precisely because it will not create records that violate business rules the UI would otherwise enforce.

REST API or Function-based imports are viable alternatives for scripted, repeatable, non-interactive loads, but DMT remains the standard tool for one-off or periodic migrations because of its template generation, built-in validation pass, and readable error log aimed at functional users, not just developers.

Reading and fixing common DMT errors

Errors typically echo the same BO validation message you would see in the Kinetic UI - "Part Class is required" or "Site is invalid" - because DMT is calling the same service layer. Cross-reference the error text against the relevant setup table (Part Class Maintenance, Site Maintenance) rather than guessing.

A common source of confusing failures is import order and dependency: importing PartWhse rows before the corresponding Part records exist, or ARInvoice lines before the customer or invoice header exists, produces "not found" errors that are really sequencing issues, not data quality issues.

BPM directives that fire on the same business object as the import (e.g. a Pre-Processing directive requiring a custom field to be filled) apply to DMT-driven saves too - if a BPM was written assuming manual UI entry, it can unexpectedly block or alter DMT-loaded records; test with BPM logging on for the first batch.

-- After a DMT part import, spot check counts against source file
SELECT COUNT(*) FROM Part WHERE Company = 'EPIC06' AND SysRowID IN (
  SELECT SysRowID FROM Part WHERE ChangedOn >= '2026-09-25'
);

Preparing data before it reaches DMT

Clean coded/reference fields (UOM, part class, site) against Epicor's actual master lists before building the DMT sheet - the fastest way to reduce error-log volume is to validate lookups in Excel with a VLOOKUP against an exported list of valid codes rather than discovering each bad code one failed row at a time.

For BOM, routing, or multi-level structures, load parent records first in one DMT pass, then child/detail records in a second pass, respecting the same header-then-detail order the UI enforces.

Common pitfalls

  • !Reusing a template generated against a different Epicor version or with customized required fields (added by a BPM) omitted, causing silent validation failures at process time.
  • !Skipping the Pre-Process/validate step and running straight to Process on a large file, then having to untangle a mix of successful and failed rows from the log after the fact.
  • !Importing detail records (PartWhse, BOM detail) before their parent header exists in a separate DMT pass.
  • !Ignoring BPM directives that fire during DMT saves - a required custom field enforced by BPM will fail DMT rows the same way it would block manual entry, and the error message may reference the BPM's custom text rather than an obvious standard field.
  • !Running massive single-batch imports (tens of thousands of rows) without chunking, risking long-running locks or timeouts that are hard to diagnose after the fact.
  • !Not reconciling row counts between source file and Epicor after the run - DMT's success/fail count in the log is the authoritative check, not assuming everything landed.

How an ERP-grounded AI assistant handles this

For a large migration project, an ERPray-style agent grounded in the target tenant's schema and BPM rules can pre-validate a DMT spreadsheet against live lookup tables and known BPM requirements before it is ever loaded into DMT, catching invalid UOM codes or missing BPM-required custom fields in bulk rather than one failed row at a time in the DMT error log.

Frequently asked questions

Can DMT update existing records, not just create new ones?

Yes - most DMT data types support Add/Update mode, matching on the primary key columns (e.g. PartNum) already in the spreadsheet; if a matching record exists it updates rather than errors, but check the specific data type's template notes since behavior varies.

Does DMT trigger the same BPM directives as manual entry?

Yes, because DMT calls the standard business object update methods, both Pre-Processing and Post-Processing BPM directives on that object fire during a DMT import exactly as they would for a UI save.

Why does DMT process slowly on large files?

Each row goes through full business object validation and any attached BPM logic, which is inherently row-by-row rather than a bulk SQL operation - for very large one-time loads, consider chunking the file or, for pure master data with no complex validation needs, evaluating a scripted approach via Functions or REST instead.

Where does DMT write its error log?

DMT shows a results screen after each run with a link/path to the log file (typically a text or CSV file in a local results folder); the log lists row number, key fields, and the exact validation message returned by the business object for each failed row.

Related

Error fix

Fixing Epicor BusinessObjectException: BPM Directive Errors

A BusinessObjectException that says "A Business Process Management (BPM) directive has raised the following error" means a directive on that business object stopped the transaction, either deliberately via a Raise Exception widget or accidentally via an unhandled .NET error in Custom Code. Expand the InnerException on the error dialog to see the real message and the directive name, then open BPM Designer for that object and method to find the widget that fired.

Advanced

How to create and call an Epicor Function

Open Function Studio from the main menu (Customization > Function Studio) or from inside a BPM designer's Call Context widget, define a Library and Function with typed inputs/outputs, write the logic in the C# widget, then compile and test with the built-in test harness before calling it from a BPM directive, a dashboard, or another function.

How-to

Epicor MRP Runs but Generates No Suggestions

When Epicor's MRP process completes without a job or purchase suggestion for a part you expect one for, the cause is almost always the part's own configuration (Part Class Type, Make Direct, Non-MRP flag, planning Time Fence) or the demand not being linked in a way MRP recognizes, not a defect in the MRP engine. Work through the part's Planning tab, its safety stock and lead time setup, and the demand source (sales order line status, job material requirement) before assuming the run itself failed.

How-to

How to close job costing and the accounting period in Epicor

Before closing an accounting period in Epicor, run Capture Costs (or confirm background costing is current) to post all labor, material, subcontract, and burden to jobs, review the WIP report for jobs that should be closed or investigated, close completed jobs so their costs relieve WIP, and only then close the GL period, since GL close blocks further transaction posting into it.

How-to

Fixing a Slow Epicor BAQ (Business Activity Query)

A slow BAQ in Epicor is usually caused by unindexed join columns, a subquery or calculated field forcing a table scan, or the BAQ pulling far more rows than the dashboard actually displays before filtering client-side. Fix it by reading the SQL Server execution plan Epicor generates, moving filters into the BAQ criteria instead of the dashboard filter panel, and replacing subqueries with joins where possible.

Error fix

Fixing Epicor REST v2 API 401 Unauthorized Errors

A 401 Unauthorized calling Epicor's REST v2 (api/v2/odata) endpoint almost always comes down to one of three things: a missing or wrong x-api-key header, valid credentials but an API key scoped to a different company than the one in the URL, or REST services simply not enabled for that endpoint. Confirm the API key exists and is active in Application Studio (or the classic REST API help page), matches the company segment in the URL, and that the account used for Basic auth or OAuth has the right security group.

AI for ERP

AI for Epicor Kinetic, Beyond What Prism Covers

Add AI to Epicor Kinetic beyond Prism: private LLM over BAQs, BPM data, and REST v2, on-prem or private cloud, with honest guidance on when Prism already covers you.

AI for ERP

AI for accounts payable invoice matching in your ERP

On-prem AI reads vendor invoices, runs 3-way match against your ERP PO and receipt, and routes only real exceptions to your AP team. No invoice data leaves your network.

Stuck on Epicor Kinetic?

Talk to engineers who work inside Epicor Kinetic every week, and who build private AI that answers these questions from your own ERP data.