Last updated: August 2026
What Goes Wrong in Legacy Migrations?
Most legacy migrations fail because of undocumented business logic hidden inside the old system, not because of the new technology chosen. Data migration issues, underestimated integration complexity, and cutting over too much functionality at once are the next most common failure modes. The pattern across nearly all failed migrations is underestimating how much implicit knowledge lives in a system nobody has fully documented, sometimes accumulated over 15-20 years.
Why is undocumented business logic the single biggest risk?
Legacy systems accumulate edge-case handling over years — a special discount rule added for one client in 2015, a workaround for a data quality issue from an old integration, a compliance rule bolted on after a specific incident. None of this is typically documented anywhere except the code itself, and often not even clearly there. When a team rebuilds "the same functionality" in a new system based on requirements gathering and stakeholder interviews, these undocumented rules get missed, because nobody currently at the company remembers they exist until the new system goes live and something breaks that used to work. Reading and reverse-engineering the actual legacy codebase, not just interviewing stakeholders about what it's "supposed to do," is the only reliable way to surface this.
Why does data migration go wrong so often?
Legacy databases accumulate years of inconsistent data — records created under old validation rules that no longer apply, duplicate entries from past data-entry errors nobody cleaned up, fields repurposed for different meanings at different points in the system's history. A migration script written against the assumption that data is clean fails silently or produces subtly corrupted records in the new system, which is often worse than an obvious failure because it's not caught immediately. Budgeting real time for data profiling and cleansing before migration — not just writing the migration script — is what separates migrations that work from ones that quietly corrupt data for months before anyone notices.
Why does a big-bang cutover fail more often than incremental migration?
A single cutover event concentrates every migration risk — data issues, missed business logic, integration failures, and performance problems — into one moment where the old system is off and the new one must immediately handle full production load correctly. If anything is wrong, the business is already committed and rollback is often more disruptive than pushing through broken functionality. The strangler fig pattern — migrating one component or workflow at a time while the legacy system stays live for everything else — surfaces problems incrementally, in a lower-stakes context, rather than all at once under maximum pressure.
Common failure modes ranked
| Failure mode | Root cause |
|---|---|
| Missed business logic | Requirements gathered from stakeholders, not from reading the actual legacy code |
| Data corruption post-migration | No data profiling/cleansing phase before writing migration scripts |
| Big-bang cutover failure | All migration risk concentrated into one high-stakes event |
| Underestimated integrations | Third-party or internal system dependencies discovered mid-project |
What Code Ninety does
Code Ninety runs a legacy-code discovery phase that includes reading the actual codebase, not just stakeholder interviews, specifically to surface undocumented business logic before migration begins. Code Ninety defaults to strangler-fig incremental migration for production systems, keeping the legacy system live throughout rather than requiring a single high-risk cutover. Browse Code Ninety's client project case studies across regulated industries. See the enterprise ERP modernization case study for a completed migration of this type.
