A website redesign changes more than visual styling. New templates can affect navigation, public URLs, forms, analytics, accessibility, search signals, and page performance, so the release needs measurable boundaries before design approval becomes a launch decision.
Keep a redesign separate from a domain move, CMS replacement, hosting cutover, or measurement reset whenever those changes can ship independently. Google recommends changing one major site variable at a time where possible; changed public URLs also need direct permanent redirects to their closest replacement pages.
Use one release board to connect each planning area with an accountable owner, readiness status, evidence location, and unresolved blocker. A machine-readable gate can then reject incomplete rows instead of relying on a meeting note that already says the plan is ready.
Objective | Improve product discovery without reducing qualified leads Protected outcomes | Organic landing traffic, form submissions, completed purchases Critical journey | Landing page -> product page -> checkout confirmation
Workstream | Owner | Due date | Status Content and navigation | Content lead | 2026-08-14 | In progress Templates and components | Front-end lead | 2026-08-21 | In progress Search and redirects | SEO lead | 2026-08-21 | Not started Analytics and consent | Analytics lead | 2026-08-21 | Not started Launch and rollback | Release lead | 2026-08-28 | Not started
Organic landing pages | Export saved Search queries | Export saved Conversions and revenue | Export saved Form submissions | Export saved Core Web Vitals | Mobile and desktop field baseline saved Accessibility findings | Current evaluation saved
Field performance data reflects real visits, while lab tests support pre-release diagnosis. Automated accessibility tools also need knowledgeable human evaluation for checks they cannot determine.
Page types | Home, category, product, article, contact, checkout, confirmation Files and feeds | PDFs, images, XML sitemaps, RSS feeds Integrations | Search, payments, forms, analytics, consent, support chat
Sitemap, analytics, server-log, and link-report inventories expose different parts of the live site.
Tool: Sitemap URL Extractor
Combining a domain move, CMS replacement, hosting cutover, or measurement reset with the redesign enlarges the rollback scope and makes traffic, indexing, or conversion regressions harder to isolate.
Current URL | Launch response | Final URL /services/seo | 301 | /services/search-audit /blog/old-guide | 301 | /guides/new-guide /summer-promo | 410 | —
Permanent URL moves need 301 or 308 server-side redirects that point directly to relevant destinations. A direct mapping avoids chains plus irrelevant home-page targets.
Related: website-redirect-test-before-launch
Preferred staging control | Password, SSO, VPN, or IP allowlist Public-review exception | Crawlable noindex response Removal owner | Release lead Removal checkpoint | Before production traffic opens
A robots.txt block does not reliably hide a staging URL from search results. Google must crawl a page to observe its noindex rule.
Related: staging-site-block-search
Related: noindex-manage
Surface | Acceptance evidence Navigation | Keyboard and pointer paths reach every primary destination Forms and checkout | Successful submission reaches the expected confirmation state Accessibility | Required WCAG 2.2 checks pass through automated and human evaluation Performance | Agreed mobile and desktop budgets pass Search | Status, canonical, robots, structured data, and internal links match the plan Measurement | Analytics and consent events appear once with the expected values
Representative pages from every template expose navigation, content, metadata, and integration defects that a home-page-only or component-library review can miss.
Search Console property | Verified Verification method | Preserved by the new templates Canonical targets | Match the launch URL map Launch sitemap | https://www.example.com/sitemap.xml Analytics and consent tags | Included in production templates
A redesign that also changes domain or subdomain needs verified old and new properties before cutover.
Related: How to create an XML sitemap for your website
Launch window | Saturday 22:00-23:30 Rollback owner | Release lead Stop condition | A critical journey fails on production Stop condition | A priority URL returns an unmapped error or redirect Stop condition | Analytics or consent events are missing or duplicated Recovery action | Restore the previous release and redirect configuration Decision deadline | 30 minutes after traffic opens
The previous release and configuration must remain recoverable until the production checks pass and the rollback window closes.
{
"approval_rows": [
{"area":"Objective and protected outcomes","owner":"Product sponsor","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/objective","unresolved_blocker":""},
{"area":"Owners and dates","owner":"Release lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/workstreams","unresolved_blocker":""},
{"area":"Live baseline","owner":"Analytics lead","readiness_status":"Not ready","evidence_link":"","unresolved_blocker":"Mobile field-data export is pending"},
{"area":"Site inventory","owner":"Content lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/site-inventory","unresolved_blocker":""},
{"area":"Change separation","owner":"Release lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/release-scope","unresolved_blocker":""},
{"area":"URL response map","owner":"SEO lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/url-map","unresolved_blocker":""},
{"area":"Staging rule","owner":"Platform lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/staging-access","unresolved_blocker":""},
{"area":"Acceptance matrix","owner":"","readiness_status":"In review","evidence_link":"https://projects.example.net/redesign/evidence/acceptance-matrix","unresolved_blocker":"Checkout keyboard test is open"},
{"area":"Search and measurement assets","owner":"SEO lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/search-measurement","unresolved_blocker":""},
{"area":"Rollback plan","owner":"Release lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/rollback","unresolved_blocker":""}
]
}
projects.example.net represents a project system accessible to reviewers. The intentionally incomplete rows demonstrate the gate's failure path.
import json import sys from pathlib import Path rows = json.loads(Path(sys.argv[1]).read_text())["approval_rows"] errors = [] for index, row in enumerate(rows, start=1): area = str(row.get("area", "")).strip() or f"Row {index}" owner = str(row.get("owner", "")).strip() evidence_link = str(row.get("evidence_link", "")).strip() readiness_status = str(row.get("readiness_status", "")).strip() unresolved_blocker = str(row.get("unresolved_blocker", "")).strip() if not owner: errors.append(f"{area}: missing owner") if not evidence_link: errors.append(f"{area}: missing evidence link") if readiness_status != "Ready": errors.append(f"{area}: readiness is {readiness_status or 'missing'}") if unresolved_blocker: errors.append(f"{area}: {unresolved_blocker}") if errors: raise SystemExit("BLOCKED:\n" + "\n".join(errors)) print(f"READY: {len(rows)} approval rows passed")
$ python3 validate-redesign-release-gates.py redesign-release-gates.json BLOCKED: Live baseline: missing evidence link Live baseline: readiness is Not ready Live baseline: Mobile field-data export is pending Acceptance matrix: missing owner Acceptance matrix: readiness is In review Acceptance matrix: Checkout keyboard test is open
{"area":"Live baseline","owner":"Analytics lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/live-baseline","unresolved_blocker":""}
{"area":"Acceptance matrix","owner":"Accessibility lead","readiness_status":"Ready","evidence_link":"https://projects.example.net/redesign/evidence/acceptance-matrix","unresolved_blocker":""}
$ python3 validate-redesign-release-gates.py redesign-release-gates.json READY: 10 approval rows passed