A data migration plan between systems is not about exporting tables, adapting columns, and importing records. The change affects the meaning of the information, its relationships, the permissions that allow it to be used, and the processes that depend on it. An import can finish without technical errors and still leave orders without line items, users with improper access, inconsistent amounts, or workflows blocked by statuses that the new system interprets differently.
Migration must be treated as a verifiable operational transition. The goal is not for the data to simply “be” in the target system, but for people and systems to be able to continue working with complete, consistent, traceable, and secure information. This requires defining the scope, rehearsing with controlled data, reconciling results, limiting parallel operation between platforms, and having a rollback that protects operations and the data created during the change.
Why migrations that appear correct fail

Total counts are often the first check: if there are 10,000 customers in the source and 10,000 in the target, the result appears satisfactory. But that check does not prove that each customer has the appropriate fields, that their contacts are linked, that their permissions are correct, or that their historical transactions can be viewed.
Common failures arise from semantic and operational differences:
- A free-text field in the source becomes a closed list in the target, and some values have no equivalent.
- The same status represents different stages depending on the system; for example, closed may mean completed, canceled, or archived.
- Relationships break because new identifiers are generated without maintaining a reliable mapping.
- Attachments are not transferred, are duplicated, or lose access permissions.
- The target's business rules reject valid historical data, such as incomplete dates or deactivated records.
- Users validate main screens but not the actual workflows for creation, modification, approval, billing, or support.
The quality of a migration is measured by the continuity of critical processes, not only by the successful completion of an import task.
Define scope and inventory before transforming
The first deliverable must be an explicit scope. For each entity, decide whether to migrate the entire history, only a period, active records, or a combination. Include primary and dependent entities: customers, products, orders, issues, users, documents, catalogs, configurations, and audit logs when they are necessary for operations or to meet internal obligations.
You must also declare what is not migrated. It may be more appropriate to archive very old events, exclude resolved duplicates, keep attachments in a reference repository, or leave a previous application accessible in read-only mode for a limited period. Excluding information does not mean losing it: define where it will be retained, who will be able to view it, and for how long.
Build a source and target inventory for each data set. At a minimum, it should include:
- Technical name and meaning of each field.
- Format, required status, permitted values, and validation rules.
- Business identifier and technical identifier.
- Relationships, cardinality, and required loading order.
- Data status: active, historical, canceled, blocked, or pending.
- Functional owner who decides the rules and approves exceptions.
- Planned transformation, including default values and normalizations.
A mapping matrix turns these decisions into a reviewable artifact. For example, a pendiente_revision status may become en_validacion; if there is no equivalent, it must be defined whether to create a new status, route it to a manual queue, or exclude it with justification. It is not advisable to resolve these kinds of decisions within the migration script without validation from the process owner.
Preserve traceability, relationships, and exceptions
Whenever possible, retain the stable identifiers used by other processes, reports, or integrations. If the target requires new keys, create a mapping table between the source and target identifiers. This table is essential for rebuilding relationships, investigating incidents, synchronizing temporarily, and reversing decisions.
Traceability must include an execution log with the extract version, applied rules, date, owner, and number of records read, accepted, rejected, and transformed. Rejections are not a technical detail: classify them by cause, impact, and handling. A malformed email address may require correction or exclusion; an invoice without an associated customer may prevent progress if it affects a critical financial workflow.
Also define a mechanism to avoid duplicates if the load is repeated. An idempotent operation identifies whether a record has already been processed and updates or ignores it according to a known rule, rather than creating a second copy. This is especially important in successive rehearsals and in a potential resumption after a failure.
Rehearse with representative test migrations
Before production, run test migrations on a controlled copy. Avoid using personal data in environments without appropriate controls; apply anonymization or pseudonymization where applicable and limit access. The rehearsal must use enough volume and variety to reveal problems: standard, historical, canceled, incomplete records, known duplicates, complex relationships, attachments, and cases with special permissions.
A good rehearsal follows a repeatable sequence:
- Extract an identifiable data snapshot from the source.
- Apply the documented transformations.
- Load data while respecting dependencies between entities.
- Run automated integrity checks.
- Validate functional scenarios with responsible users.
- Log defects, adjust rules, and repeat until acceptance criteria are met.
Check much more than the number of rows. Compare completeness of required fields, key uniqueness, parent-child relationships, amount totals, dates, statuses, permissions, and attachments. For financial data, reconcile totals by period and category. For operational data, select samples using reproducible criteria and walk through actual workflows: find a customer, modify authorized data, create a transaction, approve it, and retrieve it in a report.
Functional validation must answer one specific question: can the team perform its critical tasks tomorrow without using the previous system as a correction source?
Temporary parallel operation without two sources of truth
Parallel operation reduces risk, but it can create the most dangerous problem: two editable systems with divergent data. Before the change, define a source of truth for each entity and process. During the transition, a common option is to leave the previous system in view-only mode and concentrate new records and changes in the new one. If both must receive changes, establish which fields each can edit, how they are synchronized, how often, and who resolves conflicts.
Bidirectional synchronization without clear rules often multiplies duplicates, overwrites, and ambiguities. Prefer a short parallel-operation window, with explicit limits and a retirement date. If the previous system must continue generating information, identify the differences since the last snapshot and test the incremental loading mechanism before relying on it.
Plan the change and a genuinely viable rollback
The change plan must specify a selective freeze: which operations are stopped, when, who communicates them, and what temporary alternative is available. Not all processes need the same window. Editing master data can be frozen while queries or unaffected activities remain operational.
Assign owners for technical execution, functional approval, communications, incident handling, and authorization to proceed or stop. Go/no-go criteria must be observable: completed loads, approved reconciliations, passed critical tests, verified access, and no blocking incidents.
Rollback does not always mean deleting the target. Define what is undone, what new data created after the change must be preserved, and how it would be reintroduced into the previous system if necessary. Maintain a pre-change recovery point, retain load files and mapping tables, and test the rollback decision in a rehearsal. Specific thresholds must exist to trigger it, such as lost relationships in critical entities, inability to operate an essential workflow, or unexplained discrepancies in sensitive data.
Post-migration operations and checklist

After the change, maintain intensive reconciliation during the first operational cycles. Centralize incidents in a queue with priority, impact, owner, and resolution deadline. Monitor integration errors, failed jobs, denied access, response times, and abnormal volume variations. The previous system should only be retired once the consultation periods, retention obligations, and agreed closure criteria have been met.
Before, during, and after production, check that:
- The scope, exclusions, and functional owners are approved.
- A data mapping matrix and a source-to-target key table exist.
- Transformation rules, exceptions, and rejections are auditable.
- Tests include representative cases and complete critical workflows.
- Reconciliation verifies content, relationships, permissions, and business outcomes.
- Parallel operation assigns a single source of truth to each data item.
- The change has windows, communications, owners, and go/no-go criteria.
- Rollback protects data generated after the cutover and has defined authorization.
- Monitoring and the secure retirement of the previous system have an owner and a date.
A mature migration does not ask for blind trust in an import: it produces evidence to decide whether to proceed, correct, or roll back without compromising operations.
