How much does legacy system modernization cost? Ranges by approach, hidden costs, and the cost of waiting
Rehost, refactor, or rebuild: each has a different price and a different risk. Here are planning ranges, the line items that get missed, and how to put a number on doing nothing.
Working on something like this?
Get an estimate- Cost depends mostly on approach. Rehosting is the cheapest, a full rebuild the most expensive, and incremental refactoring sits between with the lowest risk of a write-off.
- The application is rarely the biggest line. Data migration, parallel running, and missing documentation usually are.
- Most budgets fail on what is not yet known about the system. A short assessment is the cheapest way to move the estimate from a guess to a range.
- Doing nothing has a price. Price it before you compare options, or the cheapest option will always be to wait.
Anyone asking what modernizing a legacy system costs is usually holding two numbers they do not trust: a vendor's estimate and a rough sense of what the current system costs to keep alive. This article is for comparing the two honestly.
The numbers below are planning ranges, not a quote. They assume North American delivery and one business application of moderate complexity. A portfolio of many applications is a different exercise, and the first step in it is deciding which ones deserve money at all, which we cover in modernizing without a big-bang cutover.
Cost ranges by modernization approach
Cheaper is not better. Rehosting an application that nobody can safely change gets you a hosting bill and the same constraints. Rebuilding an application whose behaviour nobody has written down means paying to rediscover its business rules by getting them wrong. The right approach is the one that matches what is actually wrong, and that is why assessment comes first.
The costs that do not appear in the headline number
Data migration
Fifteen years of data holds duplicates, orphaned records, and fields repurposed for something their name never suggested. Cleaning, mapping, and reconciling it is frequently larger than the application work, and it cannot be estimated without looking at the data itself.
Running both systems at once
A safe cutover means the old system stays live while the new one proves itself. That is a real cost: two environments, two sets of support, and sometimes two sets of licences, for as long as the overlap lasts.
Missing documentation and tests
When the original developers are gone, behaviour has to be recovered by reading code and watching production. Characterisation tests, written to pin down what the system does today, are what let anyone change it with confidence. They cost real time and are worth it.
Integrations nobody listed
Every legacy system has consumers that were never documented: a nightly export, a spreadsheet macro, another team's report. Finding them during the project is expensive. Finding them after cutover is worse.
Compliance and security work
Moving an auditable system means evidencing the controls again, and modernising is usually the right moment to close long-standing gaps. Plan for SOC 2 or HIPAA evidence if either applies, and expect it to be cheaper designed in than retrofitted.
People and training
Users change how they work, support learns a new stack, and your team inherits something unfamiliar. Training and handover sit outside most engineering estimates, but they decide whether the new system gets adopted.
What drives the range within each approach
- Size and complexity of the codebase. More modules, more business rules, more edge cases.
- Number of integrations. Each connected system adds testing and a cutover dependency.
- Data volume and quality. Both the size of the migration and how much needs correcting.
- Technology age. Mainframe and unsupported runtimes mean scarcer skills and fewer tools.
- Uptime requirements. Zero-downtime cutover costs more than a weekend window.
- How many people must agree. Idle engineering days waiting on a decision are still billed.
How to put a number on doing nothing
The cheapest line on any comparison is always “leave it alone”, because its cost is spread across budgets nobody adds up. Add it up before you decide.
Put that total against the modernization cost over the same three to five years. The comparison is not always in favour of modernizing, and when it is not, you have a defensible reason to leave the system alone. When it is, you have the business case written.
How to keep the estimate from doubling
Pay for an assessment first
A short engagement to read the code, profile the data, and map the integrations turns a guess into a range and tells you which approach fits. It costs a small fraction of the build and removes the largest source of overruns.
Modernize in slices, with a value date for each
Moving one seam at a time means money is spent against something shipped, and you can stop when the remaining system no longer justifies the cost. A budget approved as a single block cannot be stopped without being wasted.
Agree the parallel-run period early
Decide how long both systems live and what the criteria are for switching one off. Leaving it open is how a six-month overlap becomes two years.
Hold contingency for discovery, openly
Any honest estimate of a system you cannot fully see carries contingency. Showing it as a line is better than burying it in rates, and it makes the conversation about what is still unknown.
For how the infrastructure side prices out, see cloud migration cost drivers. To see the approach applied, read how a legacy enterprise system was modernized on Azure. If you want a number for your own system, our software engineering team can scope an assessment, and you can reach us here.
Working through this on a real project?
Tell us what you are building. You will get a scoped estimate and an architecture you own, not a capability deck.

