Skip to content
CipherCruCipherCru

Menu

Web Development

Web Application Migration

Same behaviour, different ground. A migration that changes what the system does at the same time is two projects, and it is usually the second one that sinks it.

Typical duration
Four to twelve months
Team shape
Three to five senior engineers
Starts with
A three-week assessment
A migration sequence planned out on a wall of cards

One change at a time is the whole discipline

A migration is a move: to a new cloud, a new database, a new framework version, a new hosting arrangement. The behaviour on the other side should be identical, and the test of success is that users do not notice.

That sounds modest and is surprisingly hard to hold to, because a migration surfaces every improvement anyone has been waiting to make. Accepting those is how a three-month move becomes a year, and how a failure becomes impossible to diagnose — when behaviour changed and the platform changed together, nobody can say which one broke it. We keep the two apart, and the list of deferred improvements is a deliverable rather than a refusal.

What usually goes wrong, and what we do instead

Migrations fail on scope and on verification, rarely on the move itself.

Where migrations go wrong

  • Improvements folded in, so a failure cannot be attributed to anything
  • A single cutover weekend with no rehearsed way back
  • Configuration that existed only on the old servers, discovered live
  • Data verified by row count rather than by behaviour
  • Integrations pointing at hostnames nobody knew were hardcoded

How we run it instead

  • Behaviour held constant, with improvements listed and deferred
  • Traffic moved gradually, and moved back at least once on purpose
  • Environments rebuilt as code, so nothing depends on a live machine
  • Old and new run in parallel and are compared on real traffic
  • Every outbound and inbound dependency inventoried before the move

What changes, in practice

The system does the same things. These are the things that are different around it.

Where it runs today

Working, and hard to reproduce.

  • Environments configured by hand, and not identically
  • A new environment takes days and someone's memory
  • Scaling means a bigger machine, ordered in advance
  • Recovery is a restore nobody has tested this year
  • Patching is deferred because the upgrade path is unknown
  • Costs are a fixed bill nobody can attribute to anything

Where it runs after

Same behaviour, reproducible.

  • Environments defined as code and rebuilt from it
  • A new environment takes minutes and no tribal knowledge
  • Scaling is a configuration change, applied when load says so
  • Recovery is tested on a schedule, with a measured objective
  • Dependencies are current, and upgrading is routine
  • Costs are attributable to services and visible per environment

What the work involves

Whatever is moving, the shape of the work is the same.

Platform moves

On-premise to cloud, or between clouds, with environments rebuilt as code rather than copied.

Database moves

Engine or version changes, replicated and reconciled while both sides serve traffic.

Framework and runtime upgrades

Major-version jumps done incrementally, with the old version serving until the new one matches.

Dependency inventory

Everything the system calls and everything that calls it, found by measuring traffic rather than by asking.

Parallel verification

Real requests served by both sides and compared, so a difference is found before users find it.

Rehearsed rollback

The route back exercised on production traffic before the move that needs it.

How the migration runs

The same five stages as every engagement, applied to a move.

Diagnose

What is really running, what depends on it, and what configuration exists only on the current machines.

Decide

The target, the sequence and the verification method, written down along with the improvements being deferred.

Prove

A share of production traffic served by the new platform, compared against the old, and routed back once deliberately.

Deliver

Traffic moved in increments, each one verified and stable before the next.

Hand over

Your team operates the new platform with us watching, then without us, and the old one is retired once nothing calls it.

What we move systems onto

The target depends on where you are going and what you already run. This is the usual range.

Platform

  • AWS
  • Azure
  • Google Cloud
  • Kubernetes
  • Docker

Infrastructure as code

  • Terraform
  • GitHub Actions
  • Datadog
  • Sentry

Data

  • PostgreSQL
  • MySQL
  • MongoDB
  • Redis
  • Elasticsearch

Runtime

  • Node.js
  • TypeScript
  • Java
  • Spring Boot
  • Python

What you get, and when

Handed over as it is produced, not assembled at the end.

  • An inventory of what runs, and what calls it in both directions
  • The target architecture and the migration sequence
  • The deferred improvements list, so nothing is silently dropped
  • Environments defined as code, in accounts you own
  • Pipelines that build and deploy without a person in the loop
  • Comparison results from parallel running on real traffic
  • A rehearsed rollback, exercised rather than documented
  • Dashboards, alerts and their runbooks
  • A decommissioning record for what has been retired

What we work towards

ILLUSTRATIVE, pending sign-off. These are the measures a migration is judged on and the direction they should move — not results from a named engagement. They will carry real figures or be removed before launch.

Time to stand up an environment

DaysMinutes

Recovery objective

UntestedMeasured and rehearsed

Deploy frequency

Scheduled windowsOn demand

Configuration held outside code

On the serversNone

Cost attribution

One billPer service and environment

Questions about migration

The ones we are asked most often before a first conversation.

How is this different from modernization?
A migration changes where and what the system runs on and keeps its behaviour identical. A modernization changes how the behaviour is implemented, usually because the current implementation cannot be changed safely. They are often done in sequence — migrate first so the system is reproducible and deployable, then modernize on ground that supports it — and doing both at once is the most reliable way to make either fail.
Will there be downtime?
The aim is none, and for most web systems that is achievable by moving traffic in increments with both sides running. Where a database engine change forces a brief window, we will tell you the length and when, and we will have rehearsed it. What we will not do is promise zero downtime before we have seen the data layer, because that promise depends entirely on what is underneath.
Can we fix things at the same time?
We would strongly advise not, and we will push back on this. If behaviour and platform change together, a problem after the move cannot be attributed to either, which turns a bad afternoon into a week. The improvements are captured as a list during the assessment and delivered as their own piece of work afterwards — usually faster, because by then the system is deployable.
How do you know it behaves the same?
By running both sides against real traffic and comparing the responses, rather than by testing against a specification. That catches the behaviour nobody documented, which is where migration surprises actually live. Data is reconciled the same way: continuously, and against the original, until the numbers agree for long enough to trust.
Which cloud should we move to?
Usually the one your team can already operate, which is a hiring and skills question more than a technical one. Where the choice is genuinely open we will compare them on what your system actually needs and what each would cost to run, and give you the reasoning rather than a preference. If the honest answer is that staying where you are is fine, that is also an answer we are willing to give.
When can we cancel the old contract?
Once nothing calls it, measured rather than assumed. We inventory the inbound dependencies during the assessment precisely because there is almost always one forgotten integration pointing at an old hostname. Decommissioning is planned as its own step, because an environment left running for safety is a cost and a security surface that outlives everyone's memory of why.

Need to move a system that cannot stop?

Tell us where it runs now and where it needs to go. We will tell you what the sequence should be.

Strictly necessaryEssential for the site to function: page navigation, security, session management, and remembering the cookie choices you make here.
Always on
FunctionalRemembers choices you make, such as language, region or display preferences, so the site opens the way you left it.
Performance and analyticsPerformance and analytics cookies show us how the Website is used: which pages are visited, how long is spent on them, where visitors came from, and what errors occur. They are set by Google Analytics and by HubSpot, whose cookies also link the pages you viewed to any enquiry you later send us.
Marketing and targetingTracks browsing activity to measure advertising and show relevant ads. We set none of these today, and will not without your opt-in.