D365Forge

Templates › Data migration mapping workbook

Data migration mapping workbook

Format
Excel (xlsx)
Owning skill
integration-and-data:data-mapping-and-cleansing
Tailored from
organisation, estate, modules_in_scope, roles, generated_on
Status
draft

How to use this template

The data migration lead ({{roles.data-migration-lead}}) owns this workbook. Start the entity list in Initiate once the data model is drafted, complete field and value mapping during Implement, and use the cleansing and reconciliation sheets in every mock migration through to cutover. Process owners ({{roles.process-owner}}) sign off what is migrated and the value mappings for their area, because those are business decisions, not technical ones.

Sources recorded in the profile: current CRM {{estate.current_crm}}, legacy systems {{estate.legacy_systems}}, other data sources {{estate.data_sources}}.

Guidance: Migrate the least data that lets users do their job on day one. Each extra year of history adds mapping, cleansing and reconciliation effort and rarely gets used. Retention and deletion of personal data in source systems should be agreed with the DPO or legal adviser.

SMB: One mock migration plus a full rehearsal is the minimum. Keep reconciliation even for small volumes; it is the evidence that the go-live data is complete.

Enterprise only: Run several mock migrations with timed loads, keep the mapping under version control, and have reconciliation checked by someone other than the person who loaded the data.

Sheet: Read me

ItemDetail
Organisation{{organisation.name}}
Modules in scope{{modules_in_scope}}
Generated on{{generated_on}}
Target column namesUse logical names from the target environment, checked against the latest solution
Mapping status valuesDraft, Agreed with process owner, Built, Tested in mock, Signed off
Reconciliation ruleEvery record in scope is either loaded or excluded by a documented rule

Sheet: Entity list and load order

Load sequenceSource objectSource systemTarget tableMigrate (yes, no, archive only)Selection or cut-off ruleDepends onLoad methodOwnerStatus
1Users and teamsNot migratedUser, teamNo: created from Microsoft Entra IDNot applicableNoneSet up, not loaded{{roles.platform-administrator}}
2Reference data (currencies, territories, subjects){{estate.current_crm}}VariousYesAll activeNoneConfiguration data package{{roles.data-migration-lead}}
3Products and price lists{{estate.erp}}Product, price list, price list itemYesActive products onlyReference dataIntegration initial load{{roles.integration-lead}}
4Accounts{{estate.current_crm}}AccountYesActive customers plus recent prospectsUsers, reference dataMigration tool{{roles.data-migration-lead}}
5Contacts{{estate.current_crm}}ContactYesLinked to migrated accountsAccountsMigration tool{{roles.data-migration-lead}}
6Open opportunities{{estate.current_crm}}OpportunityYesOpen onlyAccounts, contacts, productsMigration tool{{roles.data-migration-lead}}
7Cases{{estate.current_crm}}CaseYesOpen plus agreed history periodAccounts, contactsMigration tool{{roles.data-migration-lead}}
8Activities, notes and attachments{{estate.current_crm}}Activity tables, noteArchive onlyAgree with process ownerParent recordsArchive or migration tool{{roles.data-migration-lead}}

Guidance: Add consent records (Marketing), customer assets and agreements (Field Service) where those modules are in scope. Parents load before children; self-referencing lookups such as parent account need a second pass.

Sheet: Field mapping

Source objectSource fieldSource typeTarget tableTarget column (logical name)Target typeRequired in targetTransformation ruleDefault if blankNotesStatus
CompanyCompanyNameTextaccountnameSingle line of textYesTrim spaces; title case not appliedReject recordDraft
CompanyLegacyIdTextaccount(custom legacy ID column)Single line of textNoCopy as isNoneKeeps traceability for reconciliation and integrationDraft
CompanyOwnerLoginTextaccountowneridLookup (user or team)YesMap via user mapping tableDefault owner teamInactive owners go to the default teamDraft
CompanyIndustryPicklistaccountindustrycodeChoiceNoValue mapping set VM01BlankDraft
PersonEmailTextcontactemailaddress1Single line of textNoLower case; validate formatBlankInvalid addresses flagged in cleansingDraft
TicketPriorityPicklistincidentprioritycodeChoiceYesValue mapping set VM02NormalDraft

Guidance: Example source fields are illustrative; replace them with the actual names from your source extract. Confirm every target logical name in the target environment rather than from memory.

Sheet: Value mapping

Mapping setSource fieldSource valueTarget columnTarget labelTarget value (from target environment)Agreed by
VM01IndustryRetail and wholesaleindustrycodeRetail{{roles.process-owner}}
VM01IndustryUnknownindustrycode(blank){{roles.process-owner}}
VM02PriorityP1prioritycodeHigh{{roles.process-owner}}
VM02PriorityP3prioritycodeNormal{{roles.process-owner}}
VM03Case statusWaiting on customerstatuscodeWaiting for details{{roles.process-owner}}

Sheet: Cleansing rules

Rule IDObjectProblemHow detectedFix (in source, in transformation, manual)OwnerAcceptance threshold for go-liveStatus
CL01AccountsDuplicate companiesMatch on name, postcode and VAT or company numberMerge in source before final extract{{roles.process-owner}}Agree with process owner
CL02ContactsInvalid or missing emailFormat checkFlag; fix in source where possible{{roles.process-owner}}Agree with process owner
CL03AccountsMissing country or postcodeNull checkDefault where safe; otherwise manual fix{{roles.data-migration-lead}}Agree with process owner
CL04AllRecords owned by leaversOwner not in user mappingReassign to owner team{{roles.data-migration-lead}}None remaining
CL05ContactsMarketing consent unclearNo consent source or dateDo not migrate as consented; refer to DPO{{roles.data-protection-officer}}None remaining

Sheet: Reconciliation

ObjectMock or cutover runSource countExcluded by ruleExpected in targetLoaded in targetDifferenceExplanationSample check done (fields compared)Checked by
AccountsMock 1
ContactsMock 1
Open opportunitiesMock 1
CasesMock 1

Guidance: Expected equals source minus excluded; any difference needs an explanation before the next run. The person in "Checked by" should not be the person who ran the load ({{roles.test-manager}} or a nominated process owner).

Sheet: Mock migration log

RunDateTarget environmentScopeElapsed load timeErrorsLessons and changesReady for next run (yes or no)
Mock 1Test or SITCore entities
Mock 2Test or SITAll entities
Cutover rehearsalPre-production or UATFull, timed

Credit: Template from D365Forge by Simon Foote and Robert Peledie (https://github.com/SimonFoote-greensparx/D365Forge), licensed under CC BY 4.0. Keep this credit when you share or adapt the template; in your own completed document you may keep it as a footer or remove it.