A business decides to replace its old CRM. The plan looks simple: export the customers, import them into the new system, switch over.
Then the team looks at the data. The same company appears more than once under slightly different names. Accounts are still assigned to people who no longer work there. Pipeline stages were typed as free text, so “Qualified,” “qualified – hot” and “Q2” all exist. Custom fields hold values nobody can explain. Contacts are linked to duplicate accounts. Attachments live in a separate file store. And an internal billing system still looks customers up by their legacy CRM IDs.
Now the problem isn’t “how do we import a CSV?” It’s: what does each record mean in the new system, which version should survive, which relationships must stay intact, and how do we prove the result is correct?
That’s the real work of data migration from a legacy system. Moving data is only one part of the migration. Preserving business records so they still mean what they’re supposed to mean takes deliberate decisions, and most of them need to be made before anything is loaded.
This guide follows that CRM replacement through a planning lifecycle:
Inventory → Decide → Clean → Map → Transform → Stage → Load → Validate → Rehearse → Cut over → Reconcile → Retain or retire
Not every migration needs every stage at the same depth. A small, clean dataset needs far less ceremony than a core operational system. But every stage represents a question someone should answer deliberately.
What Is Legacy System Data Migration?
Legacy system data migration is the controlled process of moving useful business data from an existing system into a new or modernized system while preserving the meaning, relationships and usability of that data.
It’s often confused with neighboring activities:
| Activity | What it does | In the CRM example |
|---|---|---|
| Data migration | Moves existing data to a new destination, usually once or in a few planned loads | Customer, contact and opportunity records move to the new system |
| Data integration | Keeps systems exchanging information over time | The new system sends account updates to billing every day |
| Application modernization | Changes or improves the application itself | Deciding whether to rebuild, replace or improve the CRM |
| Backup or archive | Preserves data without necessarily making it operational | Closed historical records kept for reference, outside the new system |
Swipe the table to see more →
These often happen together, but they answer different questions. Whether to replace the CRM at all is covered in NogaTech’s legacy software modernization guide, and ongoing data exchange in the system integration guide. This article starts once the decision is made and existing data has to move.
Do Not Start by Migrating Everything
The instinct to move everything “just in case” feels safe. In practice, it carries old problems into the new system: duplicates, obsolete statuses, test records and history nobody uses, all now mixed with live data.Microsoft’s CRM data migration guidance recommends identifying and excluding nonessential data early, and allowing time for mapping, transformation and validation. Every record you keep adds to that work.
A better data migration strategy starts by giving each dataset or record group one of four treatments:
| Treatment | When it fits | CRM example |
|---|---|---|
| Move | Still useful, and fits the target model with little or no conceptual change | Active customer accounts and their current contacts |
| Transform | Still useful, but values or structure must change | Free-text pipeline stages that need to become controlled statuses |
| Archive | May need to stay accessible, but doesn't belong in the active system | Closed opportunities from discontinued product lines |
| Exclude | No justified need to bring it into the target | Test records created during the old system's setup |
Swipe the table to see more →
Notice that the fourth option is exclude, not delete. Leaving data out of the new system is a different decision from destroying it. How long records must be kept depends on your organization, the data type, contracts, policies and the jurisdictions you operate in. That decision belongs with whoever owns retention in your business, not with the migration script.
Move
Active customer accounts
Still useful and fits the new operational model.
Transform
Old pipeline values that do not match the target status model
Useful data remains, but its representation must change.
Archive
Closed historical records no longer needed operationally
Evaluate whether they need accessible historical retention outside the active target system.
Exclude
Temporary test records with no valid business purpose
Keep them out of the target where appropriate. Excluding a record is not the same as deleting it.
Migration scope is a business decision, not an export filter. Each record group needs a deliberate treatment before anyone designs the load.
Inventory the Legacy Data Before Designing the Migration
You can’t decide what to move until you know what exists. A source inventory records each dataset in business terms, not just as a list of tables:
| Inventory item | What to record |
|---|---|
| Dataset, object or table | What the data represents, such as accounts, contacts or activities |
| Business purpose | Why the business uses it |
| Business owner | Who understands what the data means |
| Key fields | Important identifiers and values |
| Relationships | Which records depend on it, and which it depends on |
| Files and attachments | Whether related files exist, and where they're stored |
| Downstream consumers | Other systems, reports or exports that use it |
| Known quality issues | Duplicates, missing values, inconsistent formats |
| Target destination | Where it should live after migration |
| Migration treatment | Move, transform, archive or exclude |
Swipe the table to see more →
The “downstream consumers” row is easy to skip and expensive to miss. In the CRM example, the billing system that looks up legacy customer IDs is a downstream consumer. If nobody records that dependency, it breaks at cutover.
Technical ownership isn’t business ownership
A developer can see that a record has status_code = 7. Only the business can say whether 7 means Active, Qualified, Closed, Former Customer or something else entirely. The value may even have meant different things at different times.
That’s why the business owner column matters. Technical teams can extract and move data, but someone who understands the business has to confirm what each value means before it can be mapped. Unresolved meaning doesn’t disappear during migration; it gets copied into the new system with a cleaner-looking label.
Clean the Data Before Mapping It
Legacy data carries years of shortcuts. In the CRM, typical problems include:
- • Duplicate companies and duplicate contacts
- • Misspelled or inconsistent company names
- • Missing owners, or owners who won’t exist in the new system
- • Invalid email addresses and inconsistent phone formats
- • Obsolete pipeline stages and free-text values that should be controlled choices
- • Empty fields the new system will require
- • Inconsistent date formats
- • Test data mixed in with real records
- • Attachments in file types the target doesn’t support
Microsoft’s guidance names incomplete, inconsistent and duplicate data as a common migration challenge and recommends building validation and cleansing into the workflow. Cleaning before mapping matters because a mapping rule built on dirty data has to account for every inconsistency, while one built on clean data can be simple.
Cleaning and transformation are different jobs
Data cleaning corrects or resolves quality problems in the existing business data. If “Acme Inc.” and “ACME Incorporated” are the same customer, deciding which record survives, and what happens to each one’s contacts and history, is cleaning.
Data transformation intentionally changes structure or representation so valid source information fits the target system. A source field full_name = “Jordan Lee” becoming first_name = “Jordan” and last_name = “Lee” is transformation. Real names don’t always split cleanly, so a rule like this needs a review path for the ones that don’t.
The distinction matters for ownership. Cleaning decisions usually need business judgment: which duplicate is right? Transformation rules can often be automated once the business has agreed what they should be.
One trap is worth naming: don’t satisfy a required target field with meaningless placeholder data. Filling a mandatory field with “Unknown” or a dummy value gets the record loaded, but it creates a business record that looks complete and isn’t.
Map the Old Data Model to the New One
Source and target schemas often differ. The new system has different required fields, controlled status values, its own user IDs and a different relationship structure. A migration mapping specification records exactly how each piece of source data becomes target data, and who agreed to it:
| Source | Target | Rule | Business owner | Exception | Validation |
|---|---|---|---|---|---|
| company_name | account.name | Direct mapping | Sales operations | Blank name → review queue | Sample matches source |
| Legacy customer status | Account status | Approved value translation table | Sales leadership | Unmapped value → hold record | Every value has a target |
| Legacy owner ID | New user ID | Lookup via user cross-reference | Sales operations | Former employee → reassignment rule | No orphaned owners |
| One source field | Two target fields | Explicit split rule | Data owner | Ambiguous value → manual review | Spot-check split results |
| Two source fields | One target field | Explicit merge rule | Data owner | Conflicting values → precedence rule | Merged values reviewed |
| Field with no target | — | Archive, exclude or alternate destination | Data owner | — | Decision recorded |
Swipe the table to see more →
The columns that matter most are the ones teams tend to leave blank: business owner, exception and validation. Without them, a mapping is just a guess with arrows.
Labels aren’t meaning
Mapping field names is the easy part. Preserving business meaning is the job. In the CRM example, a legacy opportunity stage of “Won” might seem to map naturally to an account status of “Active Customer.” But a won deal might not be a live customer yet. The contract might not have started, or the customer might have churned since. That translation is valid only if the business confirms it.
Direct map
Rename
Value translation
Split
Not automatically safe — each split needs its own validated rule.
Merge
Not automatically safe — conflicting values need a precedence rule.
No direct destination
Field names matter less than meaning. Every mapping has to preserve what the data represents to the business, not just where it lands.
Preserve IDs, Relationships, Ownership and Attachments
A CRM isn’t a set of separate tables. It’s a hierarchy: accounts have contacts, opportunities belong to accounts, activities attach to contacts or opportunities, and files hang off almost everything. Migrate each table on its own and the records arrive, but the business history falls apart.
Several things need explicit handling:
- Load order can matter. Parent records may need to exist before child records can be linked to them. Salesforce’s data migration best practices describe migrating objects in dependency order, such as users before accounts and accounts before opportunities.
- Keep the legacy ID. New systems generate their own IDs. Storing each record’s legacy ID as a cross-reference preserves the ability to trace back, resolve child relationships and validate results. Salesforce recommends storing legacy IDs in custom fields to help maintain relationships and support validation reporting.
- Map ownership deliberately. Legacy owner IDs need a rule to become target user IDs. Former employees need a decision: reassign to a manager, a team queue or a named successor. Silently assigning everything to the migration account hides the problem.
- Give files their own path. Attachments often live in separate storage in both systems, so they need their own extraction, linking and validation.
- Check external dependencies. If the billing system still looks customers up by legacy ID, the new system must keep that ID available, or the billing integration needs updating before cutover.
There’s no single correct technical implementation. What matters is that identity, relationships and ownership are designed, not left to chance.
Account
- Contacts
- Opportunities
- Activities
- Attachments
Each child record resolves through the parent mapping above.
Ownership mapping
Rule resolves
Valid target owner
Rule doesn’t resolve
Exception review
Moving each table independently isn't enough. Relationships, identities and ownership all have to survive the transition.
Why a Staging Layer Can Matter
Not every migration needs a staging database. A small, clean dataset can often go straight from export to import. But for more complex migrations, an intermediate staging layer can make extraction, transformation, validation and retries much easier to control.
In a staging layer, the team can:
- • Hold a snapshot of what the source contained
- • Normalize values and apply transformation rules
- • Keep the legacy-to-new ID mappings
- • Record the migration status of each record
- • Isolate failed records and review exceptions
- • Validate before anything reaches the target
- • Rerun failed segments without starting over
The most useful thing a staging layer does is separate two questions: what did the source contain? and what are we trying to load into the target? When something looks wrong after loading, you can tell whether the problem was in the source data or in a rule.
Microsoft’s staging database reference architecture describes this pattern for large or complex migrations. It notes benefits including validation before data reaches production, error isolation without affecting the source or target, and traceable transformation history. It positions staging for scenarios such as complex relational structures, data quality problems or migrations that need to be repeatable.
Migration staging
Useful when a migration needs controlled transformation, validation and retries — not every migration needs this layer.
Exception branch
A staging layer helps when a migration needs controlled transformation, validation and retries. Simpler migrations may not need this architecture at all.
Validation Is More Than Comparing Record Counts
A migration job can finish without a single error while the business migration is still wrong. Data migration testing has to check more than whether records arrived. Five layers build on each other:
1. Presence and count validation
Did the expected population arrive? Comparing counts between source and target is a sensible first check. Salesforce’s migration guidance suggests count-comparison reports, alongside spot checks of individual records and review of error logs for records that failed. But matching counts don’t prove the data is right; wrong records count just as well as right ones.
2. Field validation
Are important values correct after transformation? Check account names, owners, customer statuses and contact details against the source, especially fields that went through a translation or split rule.
Google Cloud’s database migration documentation makes the same underlying distinction for databases: confirming that tables exist is the minimum, while checking row counts or exact contents goes further.
3. Relationship validation
Do contacts still belong to the right accounts? Do activities still point to the right customer and opportunity? A contact attached to the wrong one of two merged duplicates passes every count check and still misleads the next salesperson who calls.
4. Business-rule validation
Does the migrated record behave correctly in the target? Statuses should be valid values, every owner should be an active user, required relationships should exist, and workflows should be able to act on the record.
5. Business acceptance
Can representative users do real work with migrated data? Ask them to find a specific customer, review its history, open an attachment, move an opportunity forward and run the reports they rely on. This layer catches problems no automated check was written for.
Records present?
Did expected records arrive?
Fields correct?
Did values transform correctly?
Relationships preserved?
Are parent/child links intact?
Business rules valid?
Does the target interpret records correctly?
Business acceptance?
Can users complete representative work?
Each layer builds on the one before it — increasing depth, not five unrelated checks.
Counts are an important first check, but a usable migration also has to preserve values, relationships, business meaning and real user workflows.
Rehearse the Migration Before Production Cutover
A migration that hasn’t been rehearsed against realistic data carries more uncertainty into production. Rehearsing it in an environment that isn’t production turns more of the cutover into a repeatable procedure. Even at the smallest scale the principle holds: Salesforce suggests loading one record first and checking it before loading the rest.
A rehearsal should answer:
- • Can the extraction be reproduced?
- • Which records fail transformation, and why?
- • Are the mapping rules stable, or still changing?
- • Do relationships resolve correctly?
- • Is the owner mapping complete, including former employees?
- • Are attachments included and linked?
- • Can failed records be identified and retried?
- • Does validation catch the problems you already know about?
- • Can the procedure run without hidden manual steps that live in one person’s head?
- • Is the planned cutover sequence realistic?
There’s no universal number of rehearsals. A simple migration may need one dry run; a complex operational system may need several, with each round fixing what the last one revealed. The goal is a procedure that behaves predictably, so production cutover holds no surprises the team could have found earlier.
Plan the Cutover: Final Changes, Validation and Fallback
Cutover is the controlled transition point or period in which operational reliance shifts from the old system to the new one. How it works depends on the source system, business operations, the migration method, whether old and new systems coexist for a period, and whether incremental or delta changes can be migrated.
Microsoft’s cutover planning guidance highlights timing, communication, validation, rollback strategy and post-go-live monitoring. For large migrations, it describes running a full migration ahead of go-live, then migrating only changes (delta loads), which also gives business users time to compare source and target. In its example, the final delta load runs after changes are frozen, so the switch happens from a consistent snapshot.
A controlled sequence might look like this:
- 1. Communicate the cutover plan to everyone affected.
- 2. Restrict or control changes to the old system where appropriate.
- 3. Capture final or delta changes.
- 4. Run the final migration.
- 5. Run the agreed validation.
- 6. Confirm the release and business acceptance criteria.
- 7. Direct users to the new system.
- 8. Monitor closely.
- 9. If release criteria aren't met, follow the predetermined fallback or rollback procedure.
Not every migration needs full downtime, and there’s no standard freeze duration. But for a cutover where failure could materially disrupt operations, define the fallback or rollback path before the production transition rather than improvising it during an incident. A simple file import may need far less. Deciding what “go back” means in the middle of a failed cutover is how small problems become large ones.
Yes
- • New system operational
- • Post-launch monitoring
No
Follow the predetermined fallback / rollback procedure.
Cutover planning defines how the business changes systems and what happens if release criteria aren't met. It doesn't assume every migration needs the same downtime or rollback mechanism.
Migration Completion vs Business Acceptance
“Import completed” is not the same as “migration accepted.” The two describe different things, and confusing them is how a technically successful migration becomes a business problem soon after launch.
| Technical completion may mean | Business acceptance may mean |
|---|---|
| The migration job finished | The right owners are assigned |
| Expected files and processes completed | Relationships make sense to the people who use them |
| No unresolved technical errors remain | Historical information is usable, not just present |
| The expected record population loaded | Important attachments open from the right records |
| Migration logs are complete | Statuses mean what the business thinks they mean |
| — | Reports and filters interpret the data correctly |
| — | Workflows operate on migrated records |
| — | Representative users confirm important scenarios |
Swipe the table to see more →
Technical completion should be confirmed against agreed technical migration and validation criteria, typically by the delivery, migration or QA team. Business acceptance should be confirmed by designated business owners or representative users who understand how the data must work in practice. The same stakeholders may take part in both.
Decide in advance who signs off on each, and what they need to see before they do. That doesn’t need to be a formal certification. It needs to be clear enough that “done” means the same thing to everyone.
What Happens to the Legacy System After Cutover?
The old CRM doesn’t disappear when the new one goes live. Common options include temporary read-only access, archiving, limited access for historical lookups, and controlled decommissioning, with data retained according to organizational and legal requirements.
The right choice depends on your situation, but these questions apply to almost every migration:
- Which system is authoritative now? Everyone, including integrations, should know where the current truth lives.
- Can users still edit the legacy system? If so, changes made there after cutover won’t reach the new system.
- Are any integrations still reading from the old system? The billing lookup in the CRM example is the kind of connection that quietly keeps a legacy system alive.
- Does anyone still depend on legacy IDs? If yes, the cross-reference needs to stay available.
- Has the required historical data been preserved? Archive decisions made in planning should be confirmed, not assumed.
- When can the old system safely be retired? Usually after reconciliation is complete, dependencies are removed and retention needs are met.
One principle is worth holding firmly: don’t leave both systems casually editable after cutover. Two editable copies of the same customer will drift apart unless the architecture deliberately supports synchronization and conflict handling, which is an integration project in its own right.
How long legacy data must be kept isn’t something a migration plan can answer on its own. Confirm it with whoever owns retention policy and any legal or regulatory requirements in your organization.
Common Legacy Data Migration Failures
- 1. Migrating everything because it exists. Obsolete and duplicate data moves into the new system and makes it harder to trust from day one.
- 2. Cleaning data after migration instead of before. Problems become harder to fix once they’re mixed with new activity and linked to new records.
- 3. No business owner for mapping decisions. Technical teams end up guessing what values mean, and the guesses become permanent.
- 4. Mapping field labels instead of business meaning. "Won" becomes "Active Customer" without anyone confirming that’s true.
- 5. Losing parent/child relationships. Records arrive, but contacts, opportunities and history no longer connect to the right customer.
- 6. Ignoring attachments and files. Contracts and correspondence that users rely on go missing, often discovered only when someone needs them.
- 7. Replacing legacy IDs without a usable cross-reference. Tracing records back, fixing errors and supporting dependent systems all become guesswork.
- 8. Testing only record counts. Matching totals hide wrong values, broken links and invalid statuses. Owner mapping is a common casualty: every record loads, assigned to the wrong person.
- 9. No realistic migration rehearsal. The first full run happens in production, with unknown failure modes and no tested way to retry.
- 10. No controlled cutover or fallback plan. When release criteria aren't met, the team improvises under pressure instead of following an agreed procedure.
How to Plan a Legacy Data Migration
A practical data migration plan follows the lifecycle, with decisions made before anything is loaded:
- 1. Inventory the source.
- 2. Define scope.
- 3. Assign business owners.
- 4. Decide move, transform, archive or exclude for each dataset.
- 5. Resolve critical source-data quality problems.
- 6. Define source-to-target mappings.
- 7. Define relationship and ID handling.
- 8. Define ownership and user mapping.
- 9. Define attachment and file handling.
- 10. Define the transformation and staging approach.
- 11. Define validation criteria.
- 12. Rehearse the migration.
- 13. Prepare cutover and fallback.
- 14. Execute the controlled production migration.
- 15. Reconcile, then decide what happens to the legacy system.
15 Questions Before Migrating Legacy Data
Use this as a data migration checklist before committing to a cutover date.
| Question | What a good answer looks like |
|---|---|
| 1. Which datasets are in scope? | A named list, agreed with business owners |
| 2. Who owns the meaning of each dataset? | A named business owner, not just a technical contact |
| 3. Which records should actually move? | Defined by business criteria, not "everything" |
| 4. Which records should be transformed? | Each transformation tied to a documented rule |
| 5. Which records should be archived or excluded? | A decision per record group, checked against retention requirements |
| 6. What quality problems exist? | Known issues listed, with owners and resolution status |
| 7. How do source fields map to target fields? | A mapping specification with rules, exceptions and validation |
| 8. Which values need translation? | Approved translation tables for statuses and codes |
| 9. Which relationships must be preserved? | Parent/child dependencies and load order documented |
| 10. How will legacy IDs map to new IDs? | A retained cross-reference that systems and people can use |
| 11. How will files and attachments move? | A defined path, linked to parent records and validated |
| 12. How will migration be validated? | Criteria for all five layers, including business acceptance |
| 13. How will production migration be rehearsed? | Realistic dry runs repeated until results are stable |
| 14. What is the cutover and fallback plan? | A written sequence, release criteria and predetermined fallback |
| 15. When does the new system become authoritative? | A defined moment, communicated to users and integrations |
Swipe the table to see more →
When Professional Data Migration Help Makes Sense
A team can often manage a migration internally when there’s one well-understood source, a straightforward target, reasonably clean data, simple relationships, clear field meanings and limited operational risk.
Outside help becomes more useful when:
- • Multiple source systems are involved, or data quality is uncertain
- • Transformations are complex or relationships are extensive
- • Ownership and user mapping is difficult, or there are many attachments
- • A CRM, ERP or custom system is being replaced, or the target is a custom application
- • Cutover risk is operationally significant, or old and new systems must coexist for a while
- • Modernization, integration and migration are happening together
NogaTech’s role is narrower than an enterprise migration platform. We help businesses understand the existing application, its data, integrations, business rules and transition needs when modernization work requires database changes or migration.
That might be part of legacy application modernization, a new system built through custom applications and modernization, or a replacement CRM planned with the custom CRM development guide in mind. Mapping the workflows first, as described in our guide to business process mapping, often clarifies which data matters. After launch, a software maintenance plan keeps the new system and its data dependable. Where the target is an internal workspace, see business portals and internal systems.
Plan the Data Before You Move It
A reliable migration starts by deciding what data still matters, how the old model translates into the new one, how relationships and ownership will be preserved, and how the result will be validated before the business changes systems. Once those decisions are clear, the migration method and cutover plan become much easier to define.
Frequently Asked Questions
What is legacy system data migration?
It’s the controlled process of moving useful business data from an existing system into a new or modernized one while preserving what the data means, how records relate and whether people can actually use it.
What data should be migrated from a legacy system?
Data that’s still useful and that someone in the business can vouch for. Classify each dataset as move, transform, archive or exclude, rather than migrating everything by default.
Should all historical data be moved to the new system?
Not necessarily. Some history belongs in the active system, while other data is better archived where it stays accessible. The decision should weigh current operational usefulness, historical access needs, your organization’s retention policy and any applicable contractual, legal or regulatory requirements.
What is data mapping in a migration?
It’s the specification of how each source field and value becomes target data, including the rule, the business owner who approved it, how exceptions are handled and how the result will be validated.
What is the difference between data cleaning and data transformation?
Cleaning fixes quality problems in the source data, such as duplicates or invalid values. Transformation changes the structure or format of valid data so it fits the target system.
How do you preserve relationships between records during migration?
Load records in dependency order where needed, keep legacy IDs as a cross-reference, and resolve child records through their parent’s mapping. Then validate that the links are correct, not just present.
How do you validate migrated data?
In layers: confirm the expected records arrived, check that key values are correct, verify relationships, test business rules, and have representative users complete real tasks with migrated data.
What is a data migration rehearsal?
A full practice run against realistic data outside production. It shows which records fail, whether rules are stable and whether the procedure can be repeated reliably before the real cutover.
What is the difference between data migration and data integration?
Migration moves existing data to a new destination, usually once or in a few planned loads. Integration keeps systems exchanging information on an ongoing basis.
When should the legacy system be retired?
After migrated data has been reconciled and accepted, no users or integrations still depend on the old system, and required historical data has been preserved according to your retention policies.
