Home/Guides/Modernize an old web app

// Guide

How to modernize an old web application without betting the business on a rewrite

To modernize an old web application without a risky rewrite, replace it in small pieces while the old system keeps running. List the screens, start with the ones people use most (especially on phones), decide page by page whether to keep, refresh or rebuild, test each change on a staging copy, and release it with a way back. A full rewrite is still the right call in a few cases, covered below.

This guide is for operations leaders, IT managers and owners whose staff, customers or field crews depend on a web application built for another decade. It covers how to tell modernization from maintenance, why full rewrites stall, and how to modernize page by page without pulling the system out from under the people using it.

The method in six steps:

  1. List every page, form, report and integration, and who uses each one.
  2. Write down the business rules the old code enforces before you change anything.
  3. Rank pages by use and pain. Start with the busiest screens, especially the ones people need on their phones.
  4. Decide page by page: keep, refresh, rebuild or retire.
  5. Build and test each change on a staging copy with realistic data and the people who use the page.
  6. Release in small batches with a way back, and delete old pages once their replacements prove themselves.

Signs your web application needs modernizing (beyond ‘it’s old’)

Age alone isn’t a reason to spend money. An application from 2008 that does its job, gets security updates and is easy to change only needs maintenance. Modernization pays off when the system costs you time, people or risk every week. The real signs your legacy software needs modernization sound like this:

  • “Our existing system is difficult to use.” New hires need someone beside them for a week, people keep cheat sheets taped to their monitors, and side spreadsheets exist because the system can’t show what they need.
  • “Our contractors need to do this from their phones.” Pages that need pinching and zooming, forms that break on a small screen, and people who wait until they’re back at a desk or call the office instead.
  • “Only one person understands it.” The rules that run your operation live in old code and one person’s memory. Every change waits for them, and nobody wants to think about what happens when they leave.
  • “It can’t connect to anything.” Orders get retyped into accounting, weekly reports are built by exporting and pasting, and each new tool adds another spreadsheet.
  • “We can’t patch it.” The language, framework, server operating system or database no longer gets security updates, or applying them breaks the application.
  • “It only works in Internet Explorer mode.” Microsoft ended support for the Internet Explorer 11 desktop app on certain Windows versions on June 15, 2022, and commits to supporting IE mode in Edge “through at least 2029” (Microsoft lifecycle FAQ). That’s a stopgap, not a long-term home.
  • “It’s built on a platform nobody supports anymore.” If that platform is Classic ASP, our guide to Classic ASP end of life covers what Microsoft actually says and your options.

Modernization or maintenance?

If people work around the system, can’t use it on their phones, or only one person can change it safely, maintenance alone won’t fix it. If it’s behind on updates and has a few bugs that hurt, start with maintenance. Our web application maintenance checklist shows what that covers.

Why full rewrites stall, and when one is still the right call

The case for starting over is easy to make: clean code, current tools, no more mystery. The trouble starts once the rewrite is under way.

Why rewrites stall

  • The old code is the only complete record of your rules. Years of edge cases (“hold the order if an invoice is over 60 days late, unless the account is flagged”) live only in the code. A rewrite has to rediscover each one, and some get rediscovered after launch, by customers.
  • Nothing ships until everything ships. The people using the system see no improvement for months while you pay to run the old system and build the new one.
  • The target moves. Either you freeze changes to the old system and the business waits, or you keep changing it and the rewrite chases it.
  • Launch day is a cliff. Everyone switches at once, every gap shows up at once, and when something breaks it’s hard to tell which change caused it.

When a rewrite is still the right call

  • The business rules no longer match how you work, so carefully preserving them would preserve a process you want to change.
  • The platform can’t reasonably be patched or hosted safely, and the code can’t be replaced in pieces.
  • The application is small and simple. Microsoft’s architecture guidance notes that the incremental approach might not suit a small system where “replacing the whole system is simple” (Azure Architecture Center).
  • The way the data is structured is fundamentally wrong for the business today, so every screen would need to change anyway.

Even then, a rewrite doesn’t have to be one big switch. Rebuilding one module at a time and running it beside the old system keeps most of the safety of a page-by-page migration.

The page-by-page method: modernize while the old system keeps running

Engineers call this the strangler fig pattern, after a plant that grows around a host tree until it can stand on its own. In plain words: you build new pages alongside the old application, move people to each new page once it’s ready, and keep the old system running for everything not yet replaced. Over time the old part shrinks until you can switch it off. Microsoft’s Azure Architecture Center describes it as a way to “incrementally migrate a legacy system by gradually replacing specific pieces of functionality.”

It’s the approach we take to legacy application modernization, because it lets you judge the work on real pages instead of waiting for a launch date.

What the strangler fig pattern looks like in a web application

  • A shared foundation first. Layout, navigation and styles that work on any screen size, built so old pages still display correctly beside the new ones.
  • One page or workflow at a time. “Check order status” or “submit a job update”, not “the customer module”.
  • The same data, at first. New pages read and write the existing database, so old and new screens agree and the reports people rely on keep working. If the database itself is the problem, move it as a separate, planned phase.
  • Switch links, keep a fallback. Menus and links point to the new page; the old one stays available until the new one has proven itself.
  • Retire as you go. Once a new page is stable, delete the old one and its code so dead pages don’t pile up.

When the full pattern is overkill

The textbook version puts a routing layer (a “façade” or proxy) in front of both systems and sends each request to the old or new version. That machinery earns its keep on large systems with many users and integrations. For a smaller application it can be more than the job needs: modernizing the busiest screens one at a time inside the existing application, testing each on a staging copy and releasing them in small batches gets you most of the benefit.

Where to start: the screens people use most, especially on phones

Start where heavy use and daily pain overlap. To find that spot, you need an inventory.

Build a page inventory

For each page, form and report, note:

  • Who uses it (staff, customers, field crews, admins) and on which devices.
  • How often it’s used. Server logs or analytics help; if you have neither, ask the people who use it.
  • What data it reads and writes, and which reports, exports or other systems depend on that data.
  • Rules or quirks that live only in its code.
  • The complaints, workarounds and support calls it generates.

An inventory often turns up pages nobody uses anymore. Retire those instead of modernizing them.

Rank by use, pain and risk

Kind of page
Typical priority
Why
Busy screens people need on phones: status checks, quick updates, photo uploads, short forms
First
Biggest daily payoff, and the logic behind them is often simple
Screens that generate calls and emails: login, password reset, search
First or second
Each fix removes a reason to call the office
Complex, rule-heavy screens: order entry, scheduling, approvals
Later
Most business rules live here; move them once the foundation and release process are proven
Admin screens used by a few trained people at desks
Last, or keep
Few users and little pain; a refresh can wait
Pages with no recent use
Retire
Don’t modernize what you can delete

If the complaint is phones, see exactly what breaks before you set the scope. Our free mobile-friendly test runs in your browser, including on pages behind a login, and flags the problems. To fix them inside the existing app, see how we make an existing web app mobile-friendly.

Example (hypothetical, not client data)

A building-products distributor runs a dealer portal built in 2009. The inventory finds 46 pages. Six of them (order status, invoice lookup, reorder from history, delivery-date check, login and password reset) account for nearly all dealer visits, and dealers increasingly open them on phones from job sites. Those six go first. The custom quote builder, used by three inside-sales staff at their desks, stays as it is for now. Eleven pages show no visits in a year and are retired.

Have an old system people work around?

Your first call is with an engineer. Tell us which screens cause the most trouble, who uses them and on what devices, and we’ll talk through where a page-by-page plan would start.

Talk to an engineer

Keep, refresh or rebuild: deciding page by page

Not every page needs the same treatment. Give each page in the inventory one of four decisions.

Decision
When it fits
What changes
Keep
It works, few people use it, and they rarely complain
Only the shared header, navigation and security updates; revisit later
Refresh
The logic is right, but the screen is hard to use or breaks on phones
Layout, forms, tap targets, wide tables and navigation; the business logic stays as it is
Rebuild
The workflow itself is wrong, the code is unsafe to touch, or the page depends on something being retired
A new page and new logic against the same data, with the old rules written down first
Retire
Nobody has used it in months
Remove it and its code, and redirect its address

Questions to ask about each page

  • Do the rules on this page still match how we work?
  • Do people complain about it, or quietly work around it?
  • Does anyone need it on a phone?
  • Is the code safe to change, and does anyone understand it?
  • What else reads or writes the data this page touches?

A useful rule: keep visual changes and logic changes in separate releases where you can. If a release changes both how a page looks and how it calculates, and a number comes out wrong, you won’t know which change caused it.

For a structured version of these questions across the whole application, use our rewrite or refactor scorecard. It scores your application on value, pressure, technical risk, data and readiness, and recommends a path with the reasons behind it.

Releasing without disruption: staging copies, rollbacks, running both

If the goal is to modernize a legacy application without downtime for the people using it, how you release matters as much as what you build. There are three broad ways to move people off an old system:

Approach
How it works
Risk
Fits when
Big-bang
Build the whole replacement, then switch everyone over on one date
Highest: every gap appears at once, and rolling back means returning to the old system wholesale
The app is small, or the old platform must be gone by a fixed date
Phased
Replace one module or workflow at a time while old and new run side by side
Moderate: both systems share data and links during the transition
The core logic needs replacing in a larger system
Retrofit
Refresh screens inside the existing application, page by page
Lowest per release: each change is small and easy to reverse
The logic is sound and the problem is usability, phones or a few broken workflows

Test each page on a staging copy first

A staging copy is a private copy of your application that mirrors production: the same configuration, realistic data (with sensitive details masked) and integrations pointed at test accounts. A modernized page goes to production only after it passes there. Check:

  • Real phones and tablets, not just a narrowed browser window.
  • Each path through the page: successful submits, validation errors, empty states and the odd cases from your inventory.
  • The old pages next to it, in case new styles leaked into them.
  • Integrations, run against test accounts.
  • Reports and exports, to confirm they still get the data they expect.
  • Sign-off from a few people who use the page every day. They spot problems no test script will.

Keep a way back

Release each page on its own or in a small batch, and decide how you’d undo it before it ships: a version-control revert, a setting that points the menu back to the old page, or a feature switch. If something unexpected shows up in production, you roll back one page, not the whole application.

Running old and new side by side

  • Make the header and navigation consistent early, so the mix of old and new pages doesn’t feel like two systems.
  • Redirect old page addresses, so bookmarks and emailed links still work.
  • Keep patching old pages until they’re replaced.
  • Track progress on a simple list: not started, on staging, live, old page retired.
  • Tell the people who use the system what’s changing and when, before it changes.

The next section shows page-by-page modernization on a real system: a contractor portal where each page is tested on a staging copy before production. For more on old systems, portals and stalled projects, browse our guides.

// In practice

What it looks like in practice: Amusement Advantage’s contractor portal

Amusement Advantage is an attractions guest-experience company with a network of 60,000+ contractors. We’re modernizing its existing contractor portal page by page. Each page is tested on a staging copy before production, and we provide ongoing maintenance.

The work lets contractors do these from their phones:

  • ✓Register
  • ✓Find and apply for assignments
  • ✓Check status
  • ✓Update their information
  • ✓Upload photos
Amusement Advantage

Modernization · Contractor portal

A contractor portal made mobile-friendly, page by page

We’re modernizing Amusement Advantage’s existing contractor portal for its network of 60,000+ contractors. Mobile-responsive pages now cover about 90% of the contractor workflow, with 20–30% fewer support requests for login, opportunity search and assignment status.

ModernizationPortalMaintenance
Read the case study →

// By the numbers

The contractor portal modernization by the numbers

Where the work stands today. The full story is in the Amusement Advantage case study.

60,000+

Contractors in the network the portal serves

~90%

Share of the contractor workflow now on mobile-responsive pages

20–30%

Fewer support requests for login, opportunity search and assignment status

// FAQ

Modernizing an old web application: common questions

Can we modernize without downtime?

Working page by page keeps the existing system running while each modernized page is tested on a staging copy before production. That’s how we’re modernizing Amusement Advantage’s contractor portal. We don’t promise that nothing will ever be interrupted. What the method gives you is small changes, checked before they go live, that are easier to undo if something surprises you.

Is the strangler fig pattern overkill for a small application?

The full pattern can be. Its routing layer in front of the old and new systems earns its keep on large applications with many integrations. Smaller apps often just need the busiest screens modernized one at a time on a staging copy.

How do we know if we need modernization or just maintenance?

If people work around the system, can’t use it on phones, or only one person can change it safely, maintenance alone won’t fix it. If it mostly needs updates and a few bug fixes, start with maintenance and support.

How long does it take to modernize an old web application?

It depends on how many pages there are, how much code they share, the integrations involved and how complex the busiest workflows are. Working page by page means you don’t wait for the end: the first modernized pages can go live while the rest follow in planned releases.

Can we keep adding features while the app is being modernized?

Yes. Because the application stays in production, new features can go into pages that are already modernized, or into old pages that aren’t scheduled yet. Agree on which, so nobody builds the same thing twice.

// Bring us in

Tell us about the software your business runs on.

A new build, a system that’s hard to use, a stuck project or a prototype that needs to go live. An engineer, not a salesperson, will get back to you.

202-88-MAGIC · or email info@effortlesspresence.com