1. Map the seams
Identify natural boundaries in the legacy system — modules, bounded contexts, or simply the least-coupled screens — where a facade can intercept traffic without touching everything else.
Guides
Replacing a system a business depends on every day is a data integrity problem first and a software project second. This guide sets out the strangler-fig approach we use to move off legacy platforms without a single high-risk cutover weekend, and the verification work that makes it defensible.
It complements our legacy modernisation service and our discovery and scoping sprint, which is where a migration's phasing and cost bands are actually established.
Approach
Rather than replacing a legacy system in one event, a facade or routing layer sits in front of both the old and new systems and gradually redirects capability from one to the other, slice by slice, until the legacy system has nothing left to do. The name comes from the strangler fig plant, which grows around a host tree until the host is no longer needed.
Identify natural boundaries in the legacy system — modules, bounded contexts, or simply the least-coupled screens — where a facade can intercept traffic without touching everything else.
A routing layer sits in front of both systems and directs each request to whichever side currently owns that capability. It is the single piece of new infrastructure every subsequent slice depends on, so it is built and hardened first.
Start with a slice that is well-understood, lower risk, and still visibly valuable — proving the pattern works builds confidence for the harder slices later. Save the most tightly coupled, highest-risk capability for when the team and the facade are both proven.
Each slice is built against production-shaped data, verified through reconciliation, redirected via the facade, run in parallel, and only then is the legacy code path for that slice retired.
The facade itself is the last thing removed, once every capability has moved and the legacy system has no remaining callers.
The ordering of slices matters more than most teams expect. Migrating the highest-risk, most tightly coupled capability first, because it is the "most important", tends to produce the worst outcomes: the team has no proven facade pattern, no track record of reconciliation working correctly, and no fallback plan if the slice fails. Order by a combination of risk, coupling and value, not by organisational priority alone.
Data integrity
Sampling is not sufficient for a migration a business will run on. Every migrated slice needs full-population verification with an audit trail a sceptical stakeholder can inspect after the fact.
Row counts and aggregate totals (sums, counts by category) compared between source and target after every batch load, run automatically and alerting on any mismatch.
Hash comparisons on records that should be byte-for-byte identical after transformation, catching silent corruption that count-based checks miss.
A field-by-field comparison tool that surfaces every discrepancy between source and target records, not just whether a record exists on both sides.
Records that fail reconciliation are routed to a queue for manual review rather than silently dropped or silently overwritten, with an owner assigned to clear it before cutover.
A named business owner formally accepts each slice's reconciliation report before it is allowed to move from parallel running to being the system of record.
Parallel running
Dual-write sends every write to both the legacy and new system simultaneously, so both stay current and either can be treated as the system of record at any point. It is the safer option where writes are infrequent enough that the added latency and complexity are acceptable, and it gives the cleanest rollback path because the legacy system never falls behind.
Shadow-read keeps the legacy system as the sole system of record for writes, but replays the same reads against the new system in the background and compares the results, without exposing shadow results to users. It is lower risk to implement because it never touches the legacy system's write path, but it verifies read behaviour only, so a separate batch reconciliation is still needed to prove the write path is correct.
Run parallel for long enough to see the full range of business activity a system encounters — typically a full month-end, quarter-end and any seasonal peak specific to the business, rather than a fixed number of calendar days. Divergences found during this period go into the same exception queue as data migration errors, with a named owner and a decision on whether the divergence is a bug or a deliberate behaviour change.
Cutover
Freeze window
Runbook
Communications
Go/no-go criteria
Rollback
A rollback procedure is a tested, timed sequence for reverting to the legacy system as the system of record, not a hope that the old system is "still there". Test it before cutover, not during an incident.
Rollback becomes impossible, or prohibitively expensive, once writes have occurred against the new system that have no equivalent representation in the legacy schema — for example, a workflow state the old system cannot express — or once downstream systems have started consuming data from the new system in a way that cannot be unwound. Identify this point explicitly for every slice before it goes live, and treat crossing it as a one-way decision that requires the same sign-off as the cutover itself.
Timelines and cost
| System scope | Indicative duration | Indicative cost band |
|---|---|---|
| Single-purpose system, limited integrations | 4–7 months | £180,000–£350,000 |
| Core operational system, moderate integration surface | 9–14 months | £400,000–£750,000 |
| Enterprise-wide platform, heavy integration and compliance load | 14–24 months | £800,000 and above |
These are indicative bands, not quotes. A discovery sprint produces a phased estimate specific to your systems and data quality, with the tightest confidence on the first phase and honestly wider ranges on the phases that depend on what discovery finds.
Questions
For a core operational system with meaningful integration surface, expect nine to eighteen months from first slice to full decommission of the old system. Anyone quoting a fixed date before discovery has not accounted for the data quality issues you will find in month two.
You can, and some genuinely small systems justify it. For anything a business depends on daily, a single cutover concentrates all the risk into one weekend and gives you no early warning if the new system behaves differently under real load. We recommend it only when the strangler-fig approach is not technically possible.
Underestimating data quality in the source system. Duplicate records, inconsistent reference data and undocumented manual workarounds are discovered during reconciliation, not before, however much analysis precedes the build.
They are the most valuable people in the project. The workarounds they have learned are often undocumented business rules the new system needs to replicate or deliberately correct — deliberately, with sign-off, not by accident.
Tell us what the current system does and which parts of it worry you. We will map the seams before we talk about a plan.
Talk to us