River
Y CombinatorBacked by Y Combinator

Free template

Technical Migration Plan Template

A migration plan, cutover runbook, rollback procedure and comms plan for moving a live system, plus sheets showing which checks answer before their rollback expires.

Free download · No account needed

What you get

Pack of 9 files: 6 documents, 3 spreadsheets

Technical Migration Plan Template
  • How Rollback Windows WorkDocument
  • Migration StandardDocument
  • Migration PlanDocument
  • Cutover RunbookDocument
  • Rollback ProcedureDocument
  • Comms PlanDocument
  • Sequencing and Rollback RegisterSpreadsheet
  • Validation ChecksSpreadsheet
  • Risk RegisterSpreadsheet

How to write a technical migration plan

A technical migration plan sets out how you will move a working system, such as a database, a platform or a data center, onto something new. A good one splits the move into phases that can each be undone and says how long each rollback stays possible. It sets checks for every phase against numbers measured on the old system, and names who decides whether to go ahead.

One principle matters most: once real traffic or data moves, a rollback works only until a specific event ends it. Name that event for each phase, and make sure the checks meant to trigger the rollback answer before then.

A data center floor with rows of black and white server cabinets beneath overhead trays of blue network cables
Before anything moves, list everything that still depends on the old system. Photo: Taylor Vick on Unsplash

Map what moves and what depends on it

Start by describing the system as it runs today and the one you are moving to. If the target is not written down yet, write a solution architecture document first. Then list everything that touches the old system: services, batch jobs, reports, partner integrations and people with direct database access.

Build that list from evidence. Access logs show who actually connects and the grant list shows who could, but logs only help if they cover your longest cycle. Three days of logs can miss a weekly job.

Then collect the facts the plan depends on:

  • Baselines from real traffic on the old system: row counts, latency, error rates and business totals
  • Retention for anything a rollback would need, such as database logs and backups
  • How many old versions your deployment tool keeps, and how soon it shuts the old one down
  • Any hard deadline, such as a data center lease ending

Split the migration into phases you can undo

A phase is a change you can undo as a unit. The test is the rollback: if undoing half of a step would leave the system in a state nobody planned for, the step is one phase.

Where data or an interface changes shape, use what Danilo Sato, writing on Martin Fowler's site, calls parallel change, or expand and contract1. Add the new version beside the old, move every client across, then remove the old one. Sato warns that skipping the last step can leave you worse off than when you started.

Order the phases by their rollback. Put phases whose rollback never expires first and those on a clock next. Leave one-way phases, the ones you cannot reverse once their window closes, as late as the dependencies allow.

Move traffic in small steps. Google's Site Reliability Workbook shows the arithmetic: a release that fails 20% of requests, tried on 5% of traffic, fails 1% overall2.

Write down when each rollback expires

For each phase, write the rollback as a specific act, such as "shift the traffic weight back." Then name the event that ends it. Four kinds cover most migrations.

What ends a rollback

EventWhat happensWhat to check
New system takes writesThe old copy falls behind or can no longer start safelyWhether changes flow back to the old system
Old versions cleaned upThe previous release is deletedHow many versions are kept, counted in deploys
A timer runs outThe old version shuts down after a set delayThe delay actually configured
Retention runs outLogs or backups a rollback needs are deletedRetention on the running system

PostgreSQL's upgrade guide says that after a link-mode upgrade, once the new cluster has started, the old cluster is unsafe to use and must be restored from backup3. Kubernetes keeps 10 old versions of a deployment by default and warns that once one is deleted, you lose the ability to roll back to that revision4.

Argo Rollouts, which runs blue-green releases on Kubernetes, scales the old version down 30 seconds after the switch5 unless you change the delay. Read each setting from the running system, since a default may have been changed. Then turn each event into a window: hours from when the phase lands, deploys if version cleanup ends it, or "unbounded" if nothing does.

Window, duration and decision time

A 6-hour rollback inside an 8-hour window leaves 2 hours to decide. Record all three on the phase, because the last is the time you actually have.

Give every check a baseline and a deadline

A validation check is a comparison, not a hope. "Performance is acceptable" cannot fail, because nothing was measured to compare it against. Each check needs four parts: what it asserts, a baseline, a threshold and a detection time.

Measure baselines on the old system's real traffic, not a load test, and record their source and date. Detection time is how long until the answer means anything, not how long the query runs. A row count answers in minutes, but a daily billing reconciliation needs a full day.

Set each check's detection time beside its phase's rollback window. The Site Reliability Workbook gives similar advice for canary releases: measure over intervals no longer than the canary itself2. A check that answers after its rollback expires cannot trigger it, so pick one fix and write it on the row:

  • Extend the window, for example by keeping logs or backups longer
  • Shorten detection by running the check on both systems before cutover, using past data
  • Accept in writing that the risk will be fixed forward, and name an owner
ExampleOne check, before and after the arithmeticAn illustrative example written for this guide, adapted from the template's fictional worked plan.

V-08: Daily billing totals match between systems, within 0.01%. Baseline: the old system's mean of 4,180,442 kWh a day over 90 days.

Detection: 26 hours, one full billing cycle. Rollback window: 8 hours, until the log that reverse replication reads is deleted. The check lands 18 hours late.

Fix: keep 48 hours of that log around cutover, so the check lands with 22 hours to spare. The runbook names who reads it.

  • A fix, not a footnote. One setting change turns a late check into a real one.

Rehearse each rollback and keep it ready

Practice each rollback before its phase, one-way phases first, to learn whether it works and how long it takes. A rehearsal on an empty copy proves only that the commands run, so use production-sized data. AWS, in the Well-Architected guidance it gives customers, says a rollback or fix-forward plan should be documented and tested before the change reaches production6.

Keep the fallback ready for longer than the first night. Google Cloud's guide for customers moving databases to its platform warns that a fallback might be needed days or weeks after the switchover7. It treats the fallback as a full migration in reverse, testing included.

Write the cutover runbook and the notices

Every one-way phase needs a runbook with times, not intentions. Name the roles before the night and give one person, the cutover lead, the call on rolling back. Write preconditions as facts someone verifies by query at a stated time, and decide the no-go readings in advance.

Send a notice for each phase that people outside the team will see, not one announcement for the whole move. Say what changes for the reader, when, what a problem would look like, who to contact and how long you can undo it. A reply saying "our nightly job reads that table" is a dependency you can still plan for.

Before the one-way phase

  • Every phase names its rollback, the event that ends it and the window in hours
  • The one-way rollback has been rehearsed and timed
  • Every check has a dated baseline, a threshold and a detection time
  • Each check meant to trigger a rollback answers inside its window
  • One named person calls the rollback, against no-go readings written in advance
  • Every notice gives the time, a contact and how long you can undo it

Before cutover, business teams can test their own workflows with a UAT test plan. Afterward, a post-implementation review compares what the move promised with what it delivered. The template on this page has the three registers, a cutover runbook and a comms plan, with a worked example. River can build the registers from your own plan.

How to use this template

Use the files on their own. List your phases in the Sequencing and Rollback Register, rewrite your validation list in Validation Checks, and tie each risk to a check and a rollback. The Migration Plan, Cutover Runbook and Rollback Procedure show a finished example to aim for.

Or open them in River with Edit with AI and send what you have, from architecture diagrams to a list of steps on a whiteboard. River splits it into phases you can undo and names the event that ends each rollback. Then it reports which checks answer too late, and the one setting change that would most extend your tightest window.

  1. Download it or open it in River

    Get the six Word documents and three CSV sheets free, or open the template in River to work with AI.

  2. List the phases and rollbacks

    Add each phase to the Sequencing and Rollback Register, with the event that ends its rollback and whether it has been rehearsed.

  3. Turn checks into comparisons

    Give each validation check a baseline from the old system, a threshold and a detection time, or ask River to convert your list.

  4. Close the gaps before cutover

    Fix each check that lands after its rollback expires, then finish the runbook and send each phase's notice.

What's in the template

The check that answers after the rollback has goneEvery window is derived from its ending event, and every coverage column is a join. Neither is typed in.
Technical Migration Plan Template
RiverSequencing

Sequencing and Rollback Register

Harlow Grid, a fictional energy retailer moving its metering platform onto managed Postgres 16 and Kubernetes. Rollback Ends When is an event; the hours follow from it.

PhaseWhat movesRollbackEnds whenWindowRehearsedOne-way
P1Target cluster stood up, no trafficDelete the clusterNothing, while no data has been writtenunboundedNot neededNo
P2Expand-only schema change on the targetDrop the added columns and indexesThe application starts writing them, at P6unbounded2026-09-16No
P3Logical replication, old primary to targetDrop the subscriptionNothing, while writes go to the old primaryunbounded2026-09-18No
P4New app deployed, preview service onlyScale the deployment to zeroNothing, while no production traffic reaches itunbounded2026-09-22No
P55 percent of read traffic to the targetRevert the traffic weightOld ReplicaSet scaled down after the promotion delay0.5h2026-09-24No
P6All reads, and the new columns start being writtenRevert the weight, stop writing the columnsOld ReplicaSet scaled down after the promotion delay0.5hNeverNo
P7Writes cut over to the targetReverse replication, target to old primaryThe reverse slot falls outside WAL retention8hNeverYes
P8Old application fleet decommissionedRedeploy the retained previous revisionReplicaSet garbage collected past a limit of 3unboundedNeverNo
P9Old Postgres 13 cluster droppedRestore from backup, measured at 6hBackup retention expires at 14 days336hNeverYes

Nine phases, ordered by rollback rather than by convenience: four unbounded first, then the two half-hour phases, then the one-way cutover. Four rollbacks have never been rehearsed and they are the last four, which is the ordinary pattern and runs exactly opposite to where the stakes are. P2 is the coupling nobody spots: its rollback expires because of P6, two weeks later, so the register names the ending event as a phase identifier rather than a date. P8's window is measured in deploys, not hours, because the revision history limit is 3.

RiverValidation Checks

Validation Checks

A baseline measured on the old system before anything moved, beside the threshold. Detection is hours until the verdict means anything, not how long the query runs.

CheckPhaseAssertsBaselineThresholdDetectionWindowCan gate it
V-01P3Every row present in the target, ten largest tables1,412,880,310 rows on the old primaryExact match per table0.5hunboundedYes
V-03P5Read latency p99 does not regressp99 214ms, 14 daysUnder 250ms0.25h0.5hYes
V-05P6Meter reads identical for a sampled 5,000 meters5,000 of 5,000 on the old primary5,000 of 5,0002h0.5hNo, 1.5h late
V-06P6The new columns are written on every insert path17 insert paths, enumerated17 of 171h0.5hNo, 0.5h late
V-07P7No write is lost during the cutoverSequence high-water marks, both clustersZero gap0.25h8hYes
V-08P7Daily billing totals agree between the systems4,180,442 kWh per day, 90 daysWithin 0.01 percent26h8hNo, 18h late
V-09P7Monthly invoice values agree, 2,000 accountsInvoices already issued, SeptemberWithin one penny744h8hNo, 736h late
V-11P8No client still resolves the old endpoint9 distinct client identities, 7 days of logsZero for 72 hours72hunboundedYes
V-12P6The system is stableNo baseline was measuredNone declared—0.5hNo, nothing to compare
V-13P7Performance is acceptable under loadNo baseline was measuredNone declared—8hNo, nothing to compare
V-14P9Nothing depends on the old clusterNo baseline was measuredNone declared—336hNo, nothing to compare

Fourteen checks in the shipped sheet. Seven can trigger the rollback they exist to trigger. Four have a real baseline and answer after the window has closed. Three cannot fail at all. V-05 and V-06 both failed in rehearsal, at 4,997 of 5,000 and 15 of 17, which is how a rounding change and two batch jobs nobody had grepped for were found. Neither would have failed in time if it had first run at cutover. V-08 is the one that changed the plan: raising the target's write-ahead log retention for the reverse slot from 8 hours of writes to 48 brings it inside the window with 22 hours to spare, and costs 340GB of disk.

RiverRisk Register

Risk Register

Every risk names one check and one rollback, both by identifier. Detectable in time is a join, not a judgement.

RiskPhaseSeverityDescriptionDetected byDetectionWindowIn time
R-05P7CriticalWrites lost between stopping the old path and starting the newV-070.25h8hYes
R-06P7CriticalBilling totals diverge because a rounding rule differsV-0826h8hNo, 18h too late
R-07P7CriticalInvoice values change for accounts with a mid-month tariff switchV-09744h8hNo, 736h too late
R-10P9CriticalSomething still depends on the old cluster after it is droppedV-14—336hNo, the check has no baseline
R-03P6HighSampled reads disagree after a data type widenedV-052h0.5hNo, 1.5h too late
R-04P6HighAn insert path nobody enumerated skips the new columnsV-061h0.5hNo, 0.5h too late
R-09P8HighA client nobody knows about still calls the old endpointV-1172hunboundedYes
R-12P7HighThroughput collapses under a load pattern the test missedV-13—8hNo, the check has no baseline
R-01P3HighReplication falls behind and the target divergesV-021hunboundedYes
R-11P6MediumThe system misbehaves in a way nobody predictedV-12—0.5hNo, the check has no baseline

Twelve risks in the shipped sheet: five detectable while the rollback still exists, four detected only after it expired, three with no detection at all. Four risks are critical and three of them are not in the first group. Three of the four sit on P7, the eight-hour one-way phase. R-10 is the quietest: its check has no baseline, so a critical risk on the phase with the longest window in the plan currently has no detection except a repeated notice to everyone holding a credential on the old cluster, which is detection by outage.

  • Migration PlanA worked plan for a made-up energy company: nine phases, the checks that land late and the fixes chosen.
  • Cutover RunbookNamed roles, blocking preconditions, timed steps and no-go readings for the night writes move to the new database.
  • Rollback ProcedureEach phase's rollback: how to run it, what ends it, the window, how long it takes and rehearsal status.
  • Comms PlanWho hears about each phase and when, and the five things every notice says.
  • How Rollback Windows WorkThe four events that end a rollback, and the three fixes when a check answers too late.
  • Migration StandardThe 10 rules your team settles once, from what counts as a phase to how risks are rated.
  • Sequencing and Rollback Register sheetOne row per phase: its rollback, what ends it, the window in hours and whether it is one-way.
  • Validation Checks sheetEach check's baseline, threshold and detection time, and whether it answers before its rollback expires.
  • Risk Register sheetEach risk tied to one check and one rollback, showing whether it can be caught in time.

Common questions

What should a migration plan include?

A migration plan should cover the current and target systems, everything that depends on the old one, and the phases in order. Give each phase a rollback, the event that closes it and a window in hours. Then add validation checks with baselines, a risk register, a cutover runbook with named roles and a notice for each phase anyone outside the team will see.

What is a rollback window?

A rollback window is how long you can still undo a phase. It runs from the moment the phase lands to the event that ends the option, such as old versions being cleaned up or a log retention limit passing. It is not the same as how long the rollback takes, which you learn by rehearsing it.

What is the difference between a migration plan and a cutover plan?

A migration plan covers the whole move, which can run for weeks, with a rollback and checks for every phase. A cutover plan, or cutover runbook, covers the few hours when traffic or writes switch: named roles, preconditions, timed steps and the readings that stop it. A one-way phase deserves its own runbook.

How do you validate a migration?

Compare the new system with numbers measured on the old one before anything moved. Typical checks are row counts per table, a sample of records compared field by field, latency and error rates, and business totals such as daily billing. Give each a threshold and a detection time, and run slow ones on both systems before cutover.

Who should decide whether to roll back?

One named person per phase, such as the cutover lead, chosen before the phase starts. Not the most senior person on the call, and not a vote. Agree the no-go readings in advance, so the decision at 2 a.m. is a comparison with written thresholds rather than an argument.

Is this migration plan template free?

Yes. Download the six Word documents and three CSV sheets with no signup. The plan, runbook and sheets come filled in for a made-up energy company, so you can see how each register works before you clear it. Edit with AI opens the same template in a free River workspace.

What does Edit with AI do?

It opens this template in a free River workspace and asks for what you have: architecture diagrams, a dependency map, traffic data or a runbook draft. River turns it into phases, names the event that ends each rollback, rewrites your checks as comparisons and reports which answer too late. Where a check has no measured baseline, it says so rather than inventing one.

Sources

  1. Martin Fowler. “Parallel Change.” martinfowler.com (opens in a new tab)

  2. Google SRE. “Canarying Releases.” sre.google (opens in a new tab)

  3. PostgreSQL. “pg_upgrade.” postgresql.org (opens in a new tab)

  4. Kubernetes. “Deployments.” kubernetes.io (opens in a new tab)

  5. Argo Rollouts. “BlueGreen Deployment Strategy.” argo-rollouts.readthedocs.io (opens in a new tab)

  6. AWS Well-Architected Framework. “OPS06-BP01 Plan for unsuccessful changes.” docs.aws.amazon.com (opens in a new tab)

  7. Google Cloud. “Database migration: Concepts and principles (Part 2).” docs.cloud.google.com (opens in a new tab)

Written by

Chandler Supple

Co-founder & CEO, River

Chandler has spent the last six years working in AI, building tools for millions of users and Fortune 100 companies. In 2025, he co-founded River to build a new kind of operating system for AI agents.

Reviewed by

Brian Joseff, Co-founder, River