Core guide

Legacy Systems

Use this section as a decision map. Start with the business risk, verify the live system and its dependencies, secure operational control, then plan data movement and supplier exit before committing to a modernisation route.

Reviewed 22 July 20264 direct guides and sections

Use this hub to

  • Understand the decision before choosing technology
  • Find related cost, risk and ownership guidance
  • Move from planning to acceptance and operation

Use this section as a decision map. Start with the business risk, verify the live system and its dependencies, secure operational control, then plan data movement and supplier exit before committing to a modernisation route.

Legacy software is not defined by age alone. A system becomes legacy when the business depends on it but can no longer change, support or recover it with acceptable confidence. The practical task is therefore to understand the operating dependency before choosing between continued support, modernisation, replacement or retirement.

Understanding Legacy Systems

What Counts as a Legacy System?

A legacy system is not simply old software. The term describes a system that still supports critical business operations but has become difficult to maintain, extend, or integrate with newer tools. Age alone is not the deciding factor: a system built five years ago can qualify as legacy if its underlying framework is no longer supported, its original developers have left, or it cannot communicate with the rest of the business stack without brittle workarounds.

Signs Your Legacy System Is Becoming a Business Risk

  • Only one or two people understand how the system works, and their departure would cause a knowledge crisis.
  • Changes take weeks rather than days because every modification risks breaking something elsewhere.
  • The system cannot connect to newer platforms without custom scripts that break when either side updates.
  • Security patches are no longer available for the underlying framework or operating system.
  • Staff resort to spreadsheets or email to work around gaps in functionality.
  • New hires take months to become productive because the system behaves differently from anything they have used before.

The True Cost of Keeping a Legacy System Running

The visible costs of a legacy system — hosting, occasional contractor hours, licence renewals — rarely reflect the full picture. Hidden costs accumulate through slower time to market, lost opportunities when the system cannot support a new business process, and the premium contractors charge for working with unfamiliar or outdated technology. There is also an opportunity cost in staff time: if operations employees spend hours each week compensating for system limitations, that capacity is not available for higher-value work.

Legacy Systems and Compliance Risk

Regulatory expectations do not remain static while a system stays frozen. UK data protection law, industry-specific requirements, and customer contract terms may all impose obligations that the system was never designed to meet. If the system cannot produce audit logs, enforce access controls, or export data in a usable format, compliance gaps will widen over time.

How Legacy Systems Hold Back Business Growth

Growth often demands that a process which once served ten users now serves a hundred, or that data previously viewed by one team becomes available to three. Legacy systems frequently resist this kind of scaling. They may have hard-coded limits, single-tenant architectures that cannot separate customer data, or reporting tools that cannot aggregate across new dimensions. The result is not a dramatic failure but a gradual inability to pursue opportunities that the business can clearly see but technically cannot reach.

Auditing Legacy Systems

How to Audit a Legacy Web Application

An audit should answer three questions: what does the system actually do, what condition is it in, and what would it cost to keep it running versus change it? The first question is often the hardest because documentation, if it exists, may describe the system as it was planned rather than as it operates today. The only reliable way to establish current behaviour is to trace real processes through the system with the people who use it daily.

What to Look for in a Legacy Codebase

A codebase review does not require reading every line. The focus should be on structural indicators: how the code is organised, whether there are automated tests, how configuration is managed, and whether dependencies are pinned to specific versions or left floating. A codebase with no tests, no separation between business logic and presentation, and dependencies on unmaintained libraries presents a materially different risk profile from one that is well-structured but simply written in an older language.

Assessing Legacy System Documentation

Documentation in legacy environments tends to fall into one of three categories: absent, outdated, or accurate but incomplete. Absent documentation means the audit must rely entirely on code inspection and user interviews. Outdated documentation can be worse than none if it creates false confidence about how the system behaves. Accurate but incomplete documentation typically covers the happy path — what happens when everything works — and omits error handling, edge cases, and the manual interventions that users have learned to apply.

Legacy System Security Assessment

A security assessment for a legacy system should focus on areas where age creates specific vulnerability: unsupported runtime versions, known vulnerabilities in dependencies, authentication mechanisms that do not meet current standards, and the absence of logging or monitoring. The assessment should also consider whether the system holds data that has become more sensitive over time — for example, personal data that was collected before current data protection requirements applied.

Identifying Technical Debt in a Legacy Application

Technical debt in a legacy system manifests as the gap between how the system could work and how it actually works. Common forms include: processes that require manual steps because automation was never completed, features that were bolted on rather than integrated, data that is duplicated across tables because the schema was extended rather than restructured, and interfaces that confuse users because they reflect the system's internal history rather than the user's task.

Dependency Mapping for Legacy Applications

A dependency map for a legacy system should cover three layers: internal dependencies between components of the system itself, external dependencies on other business systems and data sources, and infrastructure dependencies on specific servers, operating systems, or hosting environments. Each dependency represents a point where a change in one system can cause a failure in another.

How to Assess Legacy Database Health

Database health in a legacy system is measured by schema clarity, data integrity, and performance under current load. Schema clarity means that tables, columns, and relationships can be understood without extensive oral history. Data integrity means that referential constraints are enforced, orphaned records are identified, and there are no widespread inconsistencies such as mismatched status codes. Performance means that queries supporting critical business processes complete within acceptable timeframes as data volumes have grown.

Taking Over Legacy Systems

Source Code Access and Repository Recovery

The first practical challenge in taking over a legacy system is establishing that you actually have the complete, current source code. In some cases, the code exists only on a developer's local machine or on a server that has not been backed up. In others, the repository contains the code but the commit history has been lost, making it impossible to understand when and why changes were made.

Server and Infrastructure Discovery

Legacy systems often run on infrastructure that was provisioned ad hoc and documented, if at all, in someone's personal notes. The discovery process should identify every server, database instance, file storage location, and background process that the system depends on. This includes cron jobs, scheduled tasks, and any scripts that run outside the main application but are essential to its operation — for example, a nightly script that generates reports or synchronises data with another system.

Database Schema Documentation for Legacy Systems

When taking over a legacy system, the database schema is often the most reliable documentation of what the system actually does — even if it was never intended as documentation. Reverse-engineering the schema means identifying the core entities, the relationships between them, and the meaning of status fields, flags, and lookup tables that may have been repurposed over time.

Domain and DNS Control for Legacy Applications

The domain name and DNS configuration are easy to overlook during a technical takeover because they sit outside the application code. If the domain is registered to a personal account, controlled by the outgoing supplier, or pointed to infrastructure you do not own, the business does not fully control its own web address. This should be verified and corrected as an early priority, separate from any application modernisation work.

Third-Party Service and API Key Discovery

Legacy systems typically accumulate connections to external services: payment processors, email delivery services, mapping tools, analytics platforms, and integration endpoints for other business systems. Each of these connections relies on API keys, credentials, or service accounts that must be identified, verified, and transferred to the new team's control.

Knowledge Transfer from Outgoing Developers

Knowledge transfer from the outgoing team should be structured around specific scenarios rather than open-ended questions. Asking "how does the system work?" tends to produce a high-level overview that misses the nuances that actually matter. Asking "walk me through what happens when a customer disputes an invoice" or "show me where the overnight sync fails and how you fix it" produces the detailed, conditional knowledge that new team members need.

Modernisation Strategies

Rebuild vs Modernise an Existing System

The choice between rebuilding and modernising depends on the condition of the existing system, the clarity of requirements, and the business's tolerance for risk. A rebuild makes sense when the underlying technology is fundamentally unsuitable, the codebase is so tangled that modification costs exceed the cost of starting fresh, or the business requirements have diverged so far from the original design that the existing system is more of a constraint than a foundation.

Strangler Fig Pattern: Gradually Replacing a Legacy System

The strangler fig pattern involves placing a new system in front of the legacy one and progressively routing functionality through the new system while the old one handles whatever has not yet been migrated. Over time, the legacy system is "strangled" until it can be retired entirely.

Lift and Shift vs Refactoring Legacy Applications

Lifting and shifting means moving the existing system to a new infrastructure environment — for example, from an on-premises server to a cloud instance — without changing the code. This can address immediate risks such as unsupported hardware or expiring data centre contracts, but it does not reduce technical debt or improve maintainability. The system runs in a new location but behaves exactly as before.

When a Legacy System Should Be Replaced Entirely

Full replacement is the appropriate choice when the cost of understanding and modifying the existing system exceeds the cost of building a new one with equivalent functionality. This threshold is reached more quickly than many businesses expect, particularly when the existing system lacks tests, documentation, and developers familiar with its technology stack. The hidden cost of a rebuild — the effort required to understand and replicate the existing system's behaviour, including all the edge cases and workarounds that have accumulated — should be factored into the comparison honestly.

Phased Modernisation Planning

Phased modernisation requires dividing the work into increments that each deliver usable value and can be deployed independently. The planning challenge is identifying boundaries that are technically clean — meaning each phase can be built and tested without depending on unfinished later phases — and that also make sense from a business perspective, so that users are not asked to adopt partial solutions that create more work than they save.

Budgeting for Legacy System Modernisation

Modernisation budgets should account for three categories of work: understanding the existing system, building the replacement or improvements, and managing the transition. The understanding phase is frequently underestimated because it does not produce visible output, but it is where the most consequential decisions are made. Building without adequate understanding leads to rework; transitioning without adequate planning leads to business disruption.

Managing Business Continuity During Modernisation

Business continuity during modernisation requires a clear agreement on what "working" means at each stage. If the legacy system must continue to operate normally throughout the transition, the modernisation approach must accommodate that constraint — which may rule out certain strategies or require additional infrastructure. If brief periods of reduced functionality are acceptable, those windows should be defined in advance, communicated to affected users, and used deliberately rather than arising from unexpected failures.

Data Migration from Legacy Systems

Planning Data Migration from Legacy Databases

Data migration planning should begin with a clear understanding of what data needs to move, what can be left behind, and what needs to be transformed. Not all data in a legacy system is worth migrating. Historical logs, deprecated record types, and duplicate entries may be candidates for archival or deletion rather than transfer. Deciding what to keep, archive, or discard should be a business decision informed by regulatory and operational requirements, not a technical afterthought.

Data Validation During Legacy Migration

Validation during migration means checking that the data in the new system matches the source data according to defined rules. This is not the same as checking that the migration script ran without errors. A script can complete successfully while silently dropping records, truncating values, or applying incorrect transformations.

Handling Inconsistent Data in Legacy Systems

Legacy systems frequently contain data that is inconsistent with the system's own rules: records with missing required fields, status values that do not match any defined option, or relationships that point to non-existent records. These inconsistencies may have accumulated over years and been tolerated because the legacy system did not enforce the rules strictly.

Parallel Running: Old and New Systems Side by Side

Parallel running means operating both the legacy and new systems simultaneously for a period, comparing their outputs to verify that the new system behaves correctly. This can increase confidence in the new system but also increases operational burden, as staff may need to enter data into both systems or reconcile differences between their outputs.

How to Plan a Legacy Data Cutover

A data cutover plan should specify the exact sequence of steps, the point at which the business switches from the legacy system to the new one, and the criteria for confirming that the cutover has succeeded. The plan should include a final delta migration — the transfer of any data that changed in the legacy system between the initial migration and the cutover point — because most legacy systems cannot be frozen for the hours or days that a full migration and validation cycle may require.

Rollback Planning for Legacy Migrations

A rollback plan defines how to revert to the legacy system if the cutover reveals problems that cannot be resolved quickly. The plan should address what happens to data entered into the new system after the cutover — that data must either be migrated back to the legacy system or accepted as lost, and the business must understand and agree to that trade-off in advance.

Vendor Exit and Transition

How to Exit a Software Vendor Without Losing Control

Exiting a software vendor without losing control of your business systems requires starting the process well before the contract ends. The first step is to establish what you actually control: the data, the domain, the user accounts, the integrations, and any custom configurations. In many vendor relationships, the business controls the data but not the infrastructure, the code, or the deployment pipeline, which means exit means migration rather than simple transfer.

What to Check Before Ending a Software Contract

Before giving notice, confirm the following: the contract's notice period and any penalties for early termination; the data export formats available and whether they are sufficient for migration; whether any custom developments are owned by the business or the vendor; what happens to integrations with other systems when the vendor's service is disconnected; and whether the vendor will provide transition support as part of the contract or only as a paid extra.

Negotiating Source Code Escrow

Source code escrow means placing a copy of the source code with a third-party escrow agent, who releases it to the customer under defined conditions — typically the vendor's insolvency or failure to maintain the software. Escrow provides a safety net but not a straightforward recovery path. The released code may lack documentation, depend on infrastructure that is no longer available, or require expertise that the business does not have in house.

Transition Planning When Leaving a SaaS Vendor

Leaving a SaaS vendor is fundamentally a data migration and integration rewiring exercise. The transition plan should identify every system that sends data to or receives data from the SaaS platform, and define how those flows will be rerouted. It should also address user provisioning — how users will access the replacement system, how their permissions will be mapped, and how authentication will work if the SaaS vendor was providing single sign-on.

Data Export Rights When Leaving a Vendor

Data export rights should be confirmed in the contract, not assumed from the vendor's marketing materials or the existence of an export button in the user interface. The contract should specify the formats available, whether the export includes all data or only a subset, whether there are volume limits or per-export fees, and how long the vendor will retain the data after the contract ends in case a re-export is needed.

Finding a Replacement Supplier for a Legacy System

When selecting a replacement supplier for a legacy system, the requirements should be derived from the business's current needs, not from a feature-by-feature comparison with the legacy system. Replicating a legacy system's feature set often means replicating its design compromises as well. A more useful starting point is to define what the business needs the system to do now, informed by the legacy system's shortcomings as well as its capabilities.

Contract Notice Periods and Exit Clauses

Leave the next team with verifiable evidence

Contract notice periods should be diarised well in advance, with a reminder set for a date that allows sufficient time for the exit process. Missing a notice period can result in an automatic renewal for another term, which may be difficult or expensive to reverse.