{"id":42611,"date":"2026-03-27T10:05:46","date_gmt":"2026-03-27T00:05:46","guid":{"rendered":"https:\/\/digitalnomadshq.com.au\/?p=42611"},"modified":"2026-03-29T12:31:13","modified_gmt":"2026-03-29T02:31:13","slug":"website-migration-checklist","status":"publish","type":"post","link":"https:\/\/digitalnomadshq.com.au\/blog\/website-migration-checklist\/","title":{"rendered":"Website Migration Checklist: How to Move Your Site Without Tanking Your SEO"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"42611\" class=\"elementor elementor-42611\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5b7adc3a e-con-full e-flex e-con e-parent\" data-id=\"5b7adc3a\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-91fdd82 e-con-full e-flex e-con e-child\" data-id=\"91fdd82\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-bc2faba e-flex e-con-boxed e-con e-child\" data-id=\"bc2faba\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ecbd83 elementor-widget elementor-widget-text-editor\" data-id=\"6ecbd83\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Migrating a website is one of those things that sounds straightforward until you&#8217;re knee-deep in broken links, tanked rankings, and pages that have vanished from Google overnight.<\/p><p><em>Fun times.<\/em><\/p><p>Whether you&#8217;re switching hosting providers, moving to a new domain, replatforming from WordPress to something else (or <em>onto<\/em> WordPress), or doing a full site redesign&#8230; a website migration touches everything. Your URLs, your content, your SEO, your site structure. All of it.<\/p><p>The good news?\u00a0<\/p><p>With a solid plan, you can make changes to your site without losing the rankings and traffic you&#8217;ve worked hard to build.<\/p><p>That&#8217;s exactly what this website migration checklist is for &#8211; and our migration checklist builder!<\/p><p>We&#8217;ve broken the entire migration process into clear, actionable steps so you can move your site with confidence.<\/p><p>Let&#8217;s get into it.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-630e94e elementor-widget elementor-widget-text-editor\" data-id=\"630e94e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>TLDR<\/b><\/p><p>Website migration doesn&#8217;t have to be a nightmare&#8230; but it will be if you wing it.\u00a0<\/p><p>Back up everything first.\u00a0<\/p><p>Crawl your existing site so you know what you&#8217;re working with.\u00a0<\/p><p>Map every single redirect (no, not just the important ones&#8230; all of them).\u00a0<\/p><p>Set up a staging environment.\u00a0<\/p><p>Check your on-page SEO hasn&#8217;t gone walkabout during the move.\u00a0<\/p><p>Submit a fresh sitemap.\u00a0<\/p><p>Then monitor everything like a hawk for the first month post-launch.<\/p><p><b> The short version? Plan it properly, redirect it completely, and test it obsessively. That&#8217;s 90% of a successful migration right there.<\/b><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-94ec8c2 elementor-widget elementor-widget-heading\" data-id=\"94ec8c2\" data-element_type=\"widget\" id=\"heading2\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What Is a Website Migration?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b1fbb79 elementor-widget elementor-widget-text-editor\" data-id=\"b1fbb79\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Before we jump into the checklist, let&#8217;s get the basics sorted.<\/p><p><strong>A website migration is any significant change to your site that can impact how search engines crawl, index, and rank your pages.<\/strong> That includes things like:<\/p><p>Moving to a new domain (e.g. oldbusiness.com.au to newbrand.com.au). Switching hosting providers or servers. Replatforming (say, from Squarespace to WordPress). A full site redesign with new URLs and page structure. Moving from HTTP to HTTPS. Or even merging multiple sites into one.<\/p><p>Each of these changes carries SEO risk. Google needs to re-crawl and re-index your new site, and if it can&#8217;t find or understand your pages properly&#8230; your rankings take a hit.<\/p><p><strong>PRO TIP:<\/strong> Not all migrations are equal. A simple hosting change with no URL changes is far lower risk than a full domain migration with a new site structure. Understand which type of migration you&#8217;re doing, because that determines how much SEO work is involved.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-21de62e elementor-widget elementor-widget-heading\" data-id=\"21de62e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Build Your Custom Migration Checklist\n\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a408d38 elementor-widget elementor-widget-text-editor\" data-id=\"a408d38\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Every migration is different. Moving hosting providers? That&#8217;s a very different job to a full domain change with a site redesign thrown in.<\/p><p>So we built something to help.<\/p><p>Our free Website Migration Checklist Generator lets you select exactly what type of migration you&#8217;re doing, and it builds a step-by-step checklist tailored to your situation. No fluff. No irrelevant steps. Just the tasks you actually need to complete, in the right order.<\/p><p>Whether you&#8217;re replatforming to WordPress, switching domains, merging two sites into one, or just upgrading your hosting&#8230; select what applies, and the tool does the rest.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fd61212 elementor-widget elementor-widget-html\" data-id=\"fd61212\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n<title>Website Migration Checklist Generator<\/title>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/exceljs\/4.4.0\/exceljs.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/2.0.5\/FileSaver.min.js\"><\/script>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow+Condensed:wght@600;700&family=Inter+Tight:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n  \/* \u2500\u2500 DNHQ Design System \u2014 high specificity to survive page themes \u2500\u2500 *\/\n  .mig-wrapper *, .mig-wrapper *::before, .mig-wrapper *::after {\n    box-sizing: border-box !important;\n  }\n  .mig-wrapper {\n    font-family: 'Inter Tight', sans-serif !important;\n    max-width: 1200px !important;\n    margin: 0 auto !important;\n    background: #ffffff !important;\n    border: 1px solid #e6e9ec !important;\n    box-shadow: 0 15px 40px rgba(0,42,69,0.08) !important;\n    border-radius: 16px !important;\n    overflow: hidden !important;\n    color: #002A45 !important;\n    width: 100% !important;\n  }\n\n  \/* \u2500\u2500 Header \u2500\u2500 *\/\n  .mig-wrapper .mig-header {\n    background: #86A4ef !important;\n    padding: 40px 40px 32px !important;\n    text-align: center !important;\n  }\n  .mig-wrapper .mig-header h1 {\n    font-family: 'Barlow Condensed', sans-serif !important;\n    font-size: 36px !important;\n    font-weight: 700 !important;\n    color: #fff !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.5px !important;\n    line-height: 1.1 !important;\n    margin: 0 0 8px !important;\n    padding: 0 !important;\n    background: none !important;\n    border: none !important;\n  }\n  .mig-wrapper .mig-header p {\n    font-size: 15px !important;\n    color: rgba(255,255,255,0.8) !important;\n    margin: 0 !important;\n    font-weight: 400 !important;\n  }\n\n  \/* \u2500\u2500 Body \/ Sections \u2500\u2500 *\/\n  .mig-wrapper .mig-body {\n    padding: 40px !important;\n    animation: migFadeIn 0.4s ease;\n    background: #ffffff !important;\n  }\n  @keyframes migFadeIn {\n    from { opacity: 0; transform: translateY(5px); }\n    to { opacity: 1; transform: translateY(0); }\n  }\n\n  \/* \u2500\u2500 Wizard Form \u2500\u2500 *\/\n  .mig-wrapper .form-section {\n    margin-bottom: 32px !important;\n  }\n  .mig-wrapper .form-section label {\n    display: block !important;\n    margin-bottom: 10px !important;\n    font-size: 14px !important;\n    font-weight: 700 !important;\n    color: #002A45 !important;\n    padding: 0 !important;\n    background: none !important;\n  }\n  .mig-wrapper .form-section .hint {\n    font-size: 13px !important;\n    color: #7a8ea0 !important;\n    margin-bottom: 10px !important;\n    font-weight: 400 !important;\n  }\n\n  .mig-wrapper .option-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 10px !important;\n    max-width: 100% !important;\n    overflow: hidden !important;\n  }\n  .mig-wrapper .option-grid.three-col { grid-template-columns: 1fr 1fr !important; }\n\n  .mig-wrapper button.option-btn {\n    display: flex !important;\n    align-items: center !important;\n    gap: 10px !important;\n    width: 100% !important;\n    min-width: 0 !important;\n    max-width: 100% !important;\n    padding: 14px 18px !important;\n    background: #fcfcfc !important;\n    border: 1px solid #d1d9e0 !important;\n    border-radius: 12px !important;\n    font-size: 14px !important;\n    font-family: 'Inter Tight', sans-serif !important;\n    font-weight: 500 !important;\n    color: #002A45 !important;\n    cursor: pointer !important;\n    transition: border-color 0.3s, box-shadow 0.3s, background 0.3s !important;\n    text-align: left !important;\n    -webkit-appearance: none !important;\n    appearance: none !important;\n    text-decoration: none !important;\n    text-transform: none !important;\n    line-height: 1.4 !important;\n    letter-spacing: normal !important;\n    box-shadow: none !important;\n    outline: none !important;\n    overflow: hidden !important;\n  }\n  .mig-wrapper button.option-btn:hover {\n    border-color: #86a4ef !important;\n    box-shadow: 0 0 0 3px rgba(134, 164, 239, 0.15) !important;\n    background: #fff !important;\n    color: #002A45 !important;\n  }\n  .mig-wrapper button.option-btn.selected {\n    border-color: #86a4ef !important;\n    box-shadow: 0 0 0 3px rgba(134, 164, 239, 0.2) !important;\n    background: #fff !important;\n    color: #002A45 !important;\n  }\n  .mig-wrapper .option-btn .option-label {\n    flex: 1 !important;\n    min-width: 0 !important;\n    overflow: hidden !important;\n  }\n  .mig-wrapper .option-btn .option-desc {\n    display: block !important;\n    font-size: 12px !important;\n    font-weight: 400 !important;\n    color: #7a8ea0 !important;\n    margin-top: 2px !important;\n    text-transform: none !important;\n  }\n  .mig-wrapper button.option-btn.selected .option-desc { color: #86a4ef !important; }\n  .mig-wrapper .multi-select button.option-btn.selected::after {\n    content: '\u2713' !important;\n    font-weight: 700 !important;\n    color: #CDFFB6 !important;\n    background: #002A45 !important;\n    width: 22px !important;\n    height: 22px !important;\n    border-radius: 6px !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    font-size: 12px !important;\n    flex-shrink: 0 !important;\n  }\n\n  \/* \u2500\u2500 Primary Button \u2500\u2500 *\/\n  .mig-wrapper button.btn-primary {\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    gap: 8px !important;\n    width: 100% !important;\n    padding: 18px 32px !important;\n    background: #002A45 !important;\n    color: #CDFFB6 !important;\n    border: none !important;\n    border-radius: 12px !important;\n    font-family: 'Barlow Condensed', sans-serif !important;\n    font-size: 20px !important;\n    font-weight: 600 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.5px !important;\n    cursor: pointer !important;\n    transition: background 0.3s, box-shadow 0.3s !important;\n    box-shadow: none !important;\n    text-decoration: none !important;\n    line-height: 1.2 !important;\n  }\n  .mig-wrapper button.btn-primary:hover { background: #001c30 !important; box-shadow: 0 8px 24px rgba(0,42,69,0.2) !important; color: #CDFFB6 !important; }\n\n  .mig-wrapper button.btn-secondary {\n    display: inline-flex !important;\n    align-items: center !important;\n    gap: 6px !important;\n    padding: 10px 18px !important;\n    background: #fcfcfc !important;\n    color: #002A45 !important;\n    border: 1px solid #d1d9e0 !important;\n    border-radius: 12px !important;\n    font-family: 'Inter Tight', sans-serif !important;\n    font-size: 13px !important;\n    font-weight: 600 !important;\n    cursor: pointer !important;\n    transition: all 0.3s !important;\n    text-decoration: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    line-height: 1.4 !important;\n    box-shadow: none !important;\n  }\n  .mig-wrapper button.btn-secondary:hover {\n    border-color: #86a4ef !important;\n    box-shadow: 0 0 0 3px rgba(134, 164, 239, 0.15) !important;\n    background: #fff !important;\n    color: #002A45 !important;\n  }\n  .mig-wrapper button.btn-xlsx {\n    border-color: #86a4ef !important;\n    color: #002A45 !important;\n    background: #f0f4ff !important;\n  }\n  .mig-wrapper button.btn-xlsx:hover { background: #e0e8ff !important; }\n\n  \/* \u2500\u2500 Progress Section (results-box style) \u2500\u2500 *\/\n  .mig-wrapper .progress-section {\n    background: #002A45 !important;\n    color: #fff !important;\n    padding: 28px 35px !important;\n    border-radius: 16px !important;\n    margin-bottom: 24px !important;\n    position: sticky;\n    top: 0;\n    z-index: 10;\n  }\n  .mig-wrapper .progress-header {\n    display: flex !important;\n    justify-content: space-between !important;\n    align-items: center !important;\n    margin-bottom: 16px !important;\n  }\n  .mig-wrapper .progress-header h3 {\n    font-family: 'Barlow Condensed', sans-serif !important;\n    font-size: 28px !important;\n    font-weight: 600 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.5px !important;\n    color: #fff !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    background: none !important;\n    border: none !important;\n  }\n  .mig-wrapper .progress-stats {\n    display: flex !important;\n    gap: 20px !important;\n    font-size: 14px !important;\n    color: rgba(255,255,255,0.7) !important;\n  }\n  .mig-wrapper .progress-stats strong { color: #CDFFB6 !important; }\n  .mig-wrapper .progress-bar-track {\n    height: 10px !important;\n    background: rgba(134, 164, 239, 0.2) !important;\n    border-radius: 999px !important;\n    overflow: hidden !important;\n  }\n  .mig-wrapper .progress-bar-fill {\n    height: 100% !important;\n    background: #86A4ef !important;\n    border-radius: 999px !important;\n    transition: width 0.4s ease !important;\n    min-width: 0 !important;\n  }\n  .mig-wrapper .progress-bar-fill.complete { background: #CDFFB6 !important; }\n\n  \/* \u2500\u2500 Actions Bar \u2500\u2500 *\/\n  .mig-wrapper .actions-bar {\n    display: flex !important;\n    gap: 10px !important;\n    flex-wrap: wrap !important;\n    margin-bottom: 24px !important;\n  }\n\n  \/* \u2500\u2500 Phase Sections \u2500\u2500 *\/\n  .mig-wrapper .phase {\n    background: #fff !important;\n    border: 1px solid #e6e9ec !important;\n    border-radius: 16px !important;\n    margin-bottom: 12px !important;\n    overflow: hidden !important;\n    box-shadow: 0 2px 8px rgba(0,42,69,0.04) !important;\n  }\n  .mig-wrapper .phase-header {\n    display: flex !important;\n    align-items: center !important;\n    gap: 12px !important;\n    padding: 18px 24px !important;\n    cursor: pointer !important;\n    user-select: none;\n    transition: background 0.15s;\n    background: transparent !important;\n  }\n  .mig-wrapper .phase-header:hover { background: #f8fafb !important; }\n  .mig-wrapper .phase-toggle {\n    font-size: 11px !important;\n    color: #86a4ef !important;\n    transition: transform 0.2s;\n    flex-shrink: 0 !important;\n  }\n  .mig-wrapper .phase-toggle.open { transform: rotate(90deg); }\n\n  .mig-wrapper .phase-badge {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    width: 32px !important;\n    height: 32px !important;\n    border-radius: 8px !important;\n    font-size: 14px !important;\n    font-weight: 700 !important;\n    flex-shrink: 0 !important;\n  }\n  .mig-wrapper .phase-badge.planning { background: #f0f4ff !important; color: #86a4ef !important; }\n  .mig-wrapper .phase-badge.prelaunch { background: #fff8e6 !important; color: #d97706 !important; }\n  .mig-wrapper .phase-badge.launch { background: #fef2f2 !important; color: #dc2626 !important; }\n  .mig-wrapper .phase-badge.postlaunch { background: #edfcf0 !important; color: #16a34a !important; }\n\n  .mig-wrapper .phase-info { flex: 1 !important; }\n  .mig-wrapper .phase-info h3 {\n    font-family: 'Inter Tight', sans-serif !important;\n    font-size: 15px !important;\n    font-weight: 700 !important;\n    color: #002A45 !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    background: none !important;\n    border: none !important;\n    text-transform: none !important;\n  }\n  .mig-wrapper .phase-info .phase-count {\n    font-size: 12px !important;\n    color: #7a8ea0 !important;\n  }\n\n  .mig-wrapper .phase-progress-mini {\n    width: 60px !important;\n    height: 6px !important;\n    background: #e6e9ec !important;\n    border-radius: 999px !important;\n    overflow: hidden !important;\n    flex-shrink: 0 !important;\n  }\n  .mig-wrapper .phase-progress-mini-fill {\n    height: 100% !important;\n    background: #86a4ef !important;\n    border-radius: 999px !important;\n    transition: width 0.3s;\n  }\n\n  .mig-wrapper .phase-items { padding: 0 24px 16px !important; }\n  .mig-wrapper .phase-items.hidden { display: none !important; }\n\n  \/* \u2500\u2500 Checklist Items \u2500\u2500 *\/\n  .mig-wrapper .checklist-item {\n    display: flex !important;\n    align-items: flex-start !important;\n    gap: 12px !important;\n    padding: 14px 0 !important;\n    border-bottom: 1px solid #f0f2f5 !important;\n    background: transparent !important;\n  }\n  .mig-wrapper .checklist-item:last-child { border-bottom: none !important; }\n\n  .mig-wrapper .check-box {\n    width: 22px !important;\n    height: 22px !important;\n    min-width: 22px !important;\n    border: 2px solid #d1d9e0 !important;\n    border-radius: 6px !important;\n    cursor: pointer !important;\n    flex-shrink: 0 !important;\n    margin-top: 1px !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    transition: all 0.2s !important;\n    background: #fcfcfc !important;\n    padding: 0 !important;\n  }\n  .mig-wrapper .check-box:hover {\n    border-color: #86a4ef !important;\n    box-shadow: 0 0 0 3px rgba(134, 164, 239, 0.15) !important;\n  }\n  .mig-wrapper .check-box.checked {\n    background: #002A45 !important;\n    border-color: #002A45 !important;\n  }\n  .mig-wrapper .check-box.checked::after {\n    content: '\u2713' !important;\n    color: #CDFFB6 !important;\n    font-size: 13px !important;\n    font-weight: 700 !important;\n  }\n\n  .mig-wrapper .item-content { flex: 1 !important; min-width: 0 !important; }\n  .mig-wrapper .item-title {\n    font-size: 14px !important;\n    font-weight: 600 !important;\n    color: #002A45 !important;\n    transition: color 0.15s;\n  }\n  .mig-wrapper .checklist-item.done .item-title {\n    color: #b0bec5 !important;\n    text-decoration: line-through !important;\n  }\n  .mig-wrapper .item-detail {\n    font-size: 13px !important;\n    color: #7a8ea0 !important;\n    margin-top: 4px !important;\n    line-height: 1.5 !important;\n  }\n  .mig-wrapper .checklist-item.done .item-detail { color: #cfd8dc !important; }\n\n  .mig-wrapper .item-tags {\n    display: flex !important;\n    gap: 6px !important;\n    margin-top: 8px !important;\n    flex-wrap: wrap !important;\n  }\n  .mig-wrapper .tag {\n    display: inline-block !important;\n    padding: 3px 10px !important;\n    border-radius: 6px !important;\n    font-size: 11px !important;\n    font-weight: 700 !important;\n    text-transform: uppercase !important;\n    letter-spacing: 0.3px !important;\n    line-height: 1.4 !important;\n  }\n  .mig-wrapper .tag.critical { background: #fef2f2 !important; color: #dc2626 !important; }\n  .mig-wrapper .tag.important { background: #fff8e6 !important; color: #d97706 !important; }\n  .mig-wrapper .tag.nice { background: #f0f4ff !important; color: #86a4ef !important; }\n  .mig-wrapper .tag.tool-tag {\n    background: #edfcf0 !important;\n    color: #15803d !important;\n    font-weight: 500 !important;\n    text-transform: none !important;\n    letter-spacing: 0 !important;\n    font-size: 11px !important;\n  }\n\n  \/* \u2500\u2500 Completion Banner \u2500\u2500 *\/\n  .mig-wrapper .completion-banner {\n    text-align: center !important;\n    padding: 40px 24px !important;\n    background: #002A45 !important;\n    border-radius: 16px !important;\n    margin-bottom: 24px !important;\n    display: none !important;\n  }\n  .mig-wrapper .completion-banner.show { display: block !important; }\n  .mig-wrapper .completion-banner h2 {\n    font-family: 'Barlow Condensed', sans-serif !important;\n    font-size: 36px !important;\n    color: #CDFFB6 !important;\n    text-transform: uppercase !important;\n    margin: 0 0 8px !important;\n    padding: 0 !important;\n    background: none !important;\n    border: none !important;\n  }\n  .mig-wrapper .completion-banner p { color: rgba(255,255,255,0.7) !important; font-size: 15px !important; margin: 0 !important; }\n\n  .mig-wrapper .hidden { display: none !important; }\n\n  \/* \u2500\u2500 Mobile \u2500\u2500 *\/\n  @media (max-width: 768px) {\n    .mig-wrapper .mig-body { padding: 25px 20px !important; }\n    .mig-wrapper .mig-header { padding: 30px 20px 24px !important; }\n    .mig-wrapper .mig-header h1 { font-size: 26px !important; }\n    .mig-wrapper .option-grid { grid-template-columns: 1fr !important; }\n    .mig-wrapper .option-grid.three-col { grid-template-columns: 1fr !important; }\n    .mig-wrapper .progress-section { padding: 20px !important; position: relative !important; }\n    .mig-wrapper .progress-header { flex-direction: column !important; gap: 8px !important; align-items: flex-start !important; }\n    .mig-wrapper .progress-header h3 { font-size: 22px !important; }\n    .mig-wrapper .phase-header { padding: 14px 16px !important; }\n    .mig-wrapper .phase-items { padding: 0 16px 12px !important; }\n  }\n\n  \/* \u2500\u2500 Print \u2500\u2500 *\/\n  @media print {\n    .mig-wrapper .progress-section, .mig-wrapper .actions-bar, .mig-wrapper .btn-primary, .mig-wrapper .btn-secondary { display: none !important; }\n    .mig-wrapper .phase-items { display: block !important; }\n    .mig-wrapper .phase { break-inside: avoid; }\n    .mig-wrapper { box-shadow: none !important; border: none !important; }\n  }\n<\/style>\n<\/head>\n<body style=\"margin:0; padding:0; font-family:'Inter Tight',sans-serif;\">\n\n<div class=\"mig-wrapper\">\n  <div class=\"mig-header\">\n    <h1>Website Migration Checklist<\/h1>\n    <p>Answer a few questions to generate a checklist tailored to your migration.<\/p>\n  <\/div>\n\n  <!-- WIZARD -->\n  <div id=\"wizard\">\n    <div class=\"mig-body\">\n\n      <div class=\"form-section\">\n        <label>What type of migration are you doing?<\/label>\n        <p class=\"hint\">Select all that apply<\/p>\n        <div class=\"option-grid three-col multi-select\" id=\"migrationTypes\">\n          <button class=\"option-btn\" data-value=\"platform\" onclick=\"toggleMulti(this)\">\n            <span class=\"option-label\">Platform \/ CMS<span class=\"option-desc\">Changing CMS or framework<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"domain\" onclick=\"toggleMulti(this)\">\n            <span class=\"option-label\">Domain Change<span class=\"option-desc\">New domain name \/ rebrand<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"hosting\" onclick=\"toggleMulti(this)\">\n            <span class=\"option-label\">Server \/ Hosting<span class=\"option-desc\">New hosting provider<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"https\" onclick=\"toggleMulti(this)\">\n            <span class=\"option-label\">HTTP to HTTPS<span class=\"option-desc\">Adding SSL \/ TLS<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"redesign\" onclick=\"toggleMulti(this)\">\n            <span class=\"option-label\">Redesign \/ Restructure<span class=\"option-desc\">New look, URLs, or architecture<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"consolidation\" onclick=\"toggleMulti(this)\">\n            <span class=\"option-label\">Consolidation<span class=\"option-desc\">Merging multiple sites<\/span><\/span>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"form-section\">\n        <label>How large is your site?<\/label>\n        <div class=\"option-grid\" id=\"siteSize\">\n          <button class=\"option-btn\" data-value=\"small\" onclick=\"selectSingle(this, 'siteSize')\">\n            <span class=\"option-label\">Small<span class=\"option-desc\">Under 100 pages<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"medium\" onclick=\"selectSingle(this, 'siteSize')\">\n            <span class=\"option-label\">Medium<span class=\"option-desc\">100 \u2013 1,000 pages<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"large\" onclick=\"selectSingle(this, 'siteSize')\">\n            <span class=\"option-label\">Large<span class=\"option-desc\">1,000 \u2013 10,000 pages<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"enterprise\" onclick=\"selectSingle(this, 'siteSize')\">\n            <span class=\"option-label\">Enterprise<span class=\"option-desc\">10,000+ pages<\/span><\/span>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"form-section\">\n        <label>Is organic search a significant traffic source?<\/label>\n        <div class=\"option-grid\" id=\"seoImportance\">\n          <button class=\"option-btn\" data-value=\"critical\" onclick=\"selectSingle(this, 'seoImportance')\">\n            <span class=\"option-label\">Critical<span class=\"option-desc\">SEO is our #1 channel<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"important\" onclick=\"selectSingle(this, 'seoImportance')\">\n            <span class=\"option-label\">Important<span class=\"option-desc\">One of several key channels<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"moderate\" onclick=\"selectSingle(this, 'seoImportance')\">\n            <span class=\"option-label\">Moderate<span class=\"option-desc\">Some organic traffic<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"low\" onclick=\"selectSingle(this, 'seoImportance')\">\n            <span class=\"option-label\">Low \/ None<span class=\"option-desc\">Minimal organic traffic<\/span><\/span>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"form-section\">\n        <label>Do you have an ecommerce component?<\/label>\n        <div class=\"option-grid\" id=\"ecommerce\">\n          <button class=\"option-btn\" data-value=\"yes\" onclick=\"selectSingle(this, 'ecommerce')\">\n            <span class=\"option-label\">Yes<span class=\"option-desc\">Online store \/ transactions<\/span><\/span>\n          <\/button>\n          <button class=\"option-btn\" data-value=\"no\" onclick=\"selectSingle(this, 'ecommerce')\">\n            <span class=\"option-label\">No<span class=\"option-desc\">Content \/ brochure site<\/span><\/span>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <button class=\"btn-primary\" id=\"generateBtn\" onclick=\"generateChecklist()\">\n        Generate My Checklist\n      <\/button>\n    <\/div>\n  <\/div>\n\n  <!-- CHECKLIST OUTPUT -->\n  <div id=\"checklistOutput\" class=\"hidden\">\n    <div class=\"mig-body\">\n\n      <div class=\"completion-banner\" id=\"completionBanner\">\n        <h2>Migration Complete!<\/h2>\n        <p>You've checked off every item. Keep monitoring for the next 30 \u2013 90 days.<\/p>\n      <\/div>\n\n      <div class=\"progress-section\">\n        <div class=\"progress-header\">\n          <h3>Your Migration Progress<\/h3>\n          <div class=\"progress-stats\">\n            <span><strong id=\"completedCount\">0<\/strong> \/ <span id=\"totalCount\">0<\/span> tasks<\/span>\n            <span><strong id=\"percentComplete\">0<\/strong>%<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"progress-bar-track\">\n          <div class=\"progress-bar-fill\" id=\"progressFill\" style=\"width:0%\"><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"actions-bar\">\n        <button class=\"btn-secondary\" onclick=\"resetChecklist()\">\u21bb Start Over<\/button>\n        <button class=\"btn-secondary\" onclick=\"window.print()\">Print<\/button>\n        <button class=\"btn-secondary\" onclick=\"exportChecklist()\">Copy as Text<\/button>\n        <button class=\"btn-secondary btn-xlsx\" onclick=\"exportToExcel()\">Download Excel<\/button>\n      <\/div>\n\n      <div id=\"phasesContainer\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n\/\/ \u2500\u2500 State \u2500\u2500\nlet selections = { types: [], size: null, seo: null, ecom: null };\nlet checkState = {};\n\nfunction toggleMulti(btn) {\n  btn.classList.toggle('selected');\n  const val = btn.dataset.value;\n  if (selections.types.includes(val)) {\n    selections.types = selections.types.filter(v => v !== val);\n  } else {\n    selections.types.push(val);\n  }\n}\n\nfunction selectSingle(btn, groupId) {\n  const group = document.getElementById(groupId);\n  group.querySelectorAll('.option-btn').forEach(b => b.classList.remove('selected'));\n  btn.classList.add('selected');\n  if (groupId === 'siteSize') selections.size = btn.dataset.value;\n  if (groupId === 'seoImportance') selections.seo = btn.dataset.value;\n  if (groupId === 'ecommerce') selections.ecom = btn.dataset.value;\n}\n\n\/\/ \u2500\u2500 Master Checklist Data \u2500\u2500\nconst allItems = {\n  planning: {\n    label: \"Phase 1: Planning & Preparation\",\n    badge: \"planning\",\n    items: [\n      { id: \"p1\", title: \"Define migration scope and document all changes\", detail: \"List every element changing: domain, URLs, platform, design, content, hosting, protocol. Share with all stakeholders.\", priority: \"critical\", conditions: [], tool: \"\" },\n      { id: \"p2\", title: \"Assemble your migration team and assign roles\", detail: \"Include dev, SEO, content, QA, and project management. Ensure clear ownership of each phase.\", priority: \"important\", conditions: [], tool: \"Asana \/ Monday.com \/ Jira\" },\n      { id: \"p3\", title: \"Set a realistic timeline with buffer\", detail: \"Migrations always take longer than expected. Build in 2\u20134 weeks of buffer time.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"p4\", title: \"Create a documented rollback plan\", detail: \"Define exactly how to revert if things go wrong \u2014 DNS rollback, backup restoration, redirect removal. Test the rollback process.\", priority: \"critical\", conditions: [], tool: \"\" },\n      { id: \"p5\", title: \"Export 12+ months of organic traffic data\", detail: \"From Google Analytics, broken down by landing page. This is your baseline for measuring migration impact.\", priority: \"critical\", conditions: [], tool: \"Google Analytics 4\" },\n      { id: \"p6\", title: \"Record current keyword rankings\", detail: \"Snapshot rankings for all target keywords. Export the data so you can compare post-migration.\", priority: \"critical\", conditions: [\"seo:critical\", \"seo:important\"], tool: \"Ahrefs \/ SEMrush \/ Search Console\" },\n      { id: \"p7\", title: \"Export your full backlink profile\", detail: \"Know which pages receive external links so you can prioritise redirect accuracy for those URLs.\", priority: \"critical\", conditions: [\"seo:critical\", \"seo:important\"], tool: \"Ahrefs \/ SEMrush\" },\n      { id: \"p8\", title: \"Capture Core Web Vitals baseline\", detail: \"Record LCP, INP, and CLS scores. You'll compare post-migration to ensure performance hasn't degraded.\", priority: \"important\", conditions: [], tool: \"PageSpeed Insights \/ Lighthouse\" },\n      { id: \"p9\", title: \"Document current indexed page count\", detail: \"Run a site: search and compare with Search Console index coverage.\", priority: \"important\", conditions: [], tool: \"Google Search Console\" },\n      { id: \"p10\", title: \"Export conversion data by page\/section\", detail: \"Document conversion rates, goal completions, and revenue per page. Traffic alone doesn't tell the full story.\", priority: \"important\", conditions: [\"ecom:yes\"], tool: \"GA4 \/ Shopify Analytics\" },\n      { id: \"p11\", title: \"Inventory all third-party scripts and tracking pixels\", detail: \"List every external script: Meta Pixel, LinkedIn Insight Tag, Google Ads, chat widgets, heatmaps, A\/B testing tools. You'll need to re-implement each one.\", priority: \"critical\", conditions: [], tool: \"Google Tag Manager \/ BuiltWith\" },\n      { id: \"p12\", title: \"Run a comprehensive crawl of your existing site\", detail: \"Export all URLs, metadata, status codes, and internal links. This forms the foundation of your redirect map.\", priority: \"critical\", conditions: [], tool: \"Screaming Frog \/ Sitebulb \/ Ahrefs\" },\n      { id: \"p13\", title: \"Build your complete redirect map\", detail: \"Map every old URL to the most relevant new URL. Prioritise by traffic and backlink value. Use 301s only \u2014 never redirect everything to the homepage.\", priority: \"critical\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\", \"type:consolidation\", \"type:https\"], tool: \"Screaming Frog \/ Google Sheets\" },\n      { id: \"p14\", title: \"Include non-HTML assets in redirect map\", detail: \"Don't forget PDFs, images, and downloadable files \u2014 they often drive significant traffic and backlinks.\", priority: \"important\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\"], tool: \"\" },\n      { id: \"p15\", title: \"Lower DNS TTL 48 hours before migration\", detail: \"Reduce TTL so DNS changes propagate faster, minimising the window where some users see old site, others new.\", priority: \"critical\", conditions: [\"type:hosting\", \"type:domain\"], tool: \"DNS provider\" },\n      { id: \"p16\", title: \"Lock down staging environment from search engines\", detail: \"Use robots.txt, noindex tags, password protection, or IP restrictions. Google indexing your staging site is catastrophic.\", priority: \"critical\", conditions: [], tool: \"\" },\n      { id: \"p17\", title: \"Create a content inventory and audit\", detail: \"Identify what content carries over, what gets consolidated, and what gets retired. Flag thin or duplicate content.\", priority: \"important\", conditions: [\"type:consolidation\", \"type:redesign\"], tool: \"Screaming Frog \/ Google Sheets\" },\n      { id: \"p18\", title: \"Audit current Open Graph and social meta tags\", detail: \"Record OG titles, descriptions, and images for key pages. These often get lost in migrations, breaking social sharing.\", priority: \"important\", conditions: [], tool: \"Meta debugger \/ Twitter card validator\" },\n      { id: \"p19\", title: \"Plan for international\/multilingual URLs\", detail: \"If your site has hreflang tags or locale-specific URLs, map these carefully in your redirect plan.\", priority: \"important\", conditions: [\"size:large\", \"size:enterprise\"], tool: \"\" },\n      { id: \"p20\", title: \"Notify key stakeholders of the migration timeline\", detail: \"Inform sales, support, marketing, and partners. Expect temporary disruptions and prepare talking points.\", priority: \"nice\", conditions: [], tool: \"\" },\n      { id: \"p21\", title: \"Map product URLs and category structures\", detail: \"Ecommerce migrations require careful mapping of product pages, category pages, and filtered\/faceted URLs.\", priority: \"critical\", conditions: [\"ecom:yes\"], tool: \"\" },\n      { id: \"p22\", title: \"Announce a content freeze before migration\", detail: \"Stop all content updates, campaign launches, and CMS edits 24\u201348 hours before migration to avoid conflicts and data loss.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"p23\", title: \"Back up your entire existing site\", detail: \"Full backup of files, database, and configuration. Store in multiple locations. Verify the backup is restorable.\", priority: \"critical\", conditions: [], tool: \"UpdraftPlus \/ hosting backup\" },\n      { id: \"p24\", title: \"Review legal pages for URL and domain references\", detail: \"Terms of service, privacy policy, cookie policy, and disclaimers often contain hardcoded domain names that need updating.\", priority: \"important\", conditions: [\"type:domain\"], tool: \"\" },\n    ]\n  },\n  prelaunch: {\n    label: \"Phase 2: Pre-Launch Technical Setup\",\n    badge: \"prelaunch\",\n    items: [\n      { id: \"t1\", title: \"Implement all 301 redirects\", detail: \"Set up every redirect from your map. Test a representative sample before going live.\", priority: \"critical\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\", \"type:consolidation\", \"type:https\"], tool: \"Yoast \/ Redirect Manager \/ .htaccess\" },\n      { id: \"t2\", title: \"Avoid redirect chains and loops\", detail: \"Every redirect should go directly from old URL to new URL. No A\u2192B\u2192C chains. Each chain adds latency and wastes crawl budget.\", priority: \"critical\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\", \"type:consolidation\"], tool: \"Screaming Frog\" },\n      { id: \"t3\", title: \"Migrate and verify all title tags and meta descriptions\", detail: \"Compare metadata between old and new sites for at least your top 100 pages by traffic.\", priority: \"critical\", conditions: [], tool: \"Screaming Frog \/ Sitebulb\" },\n      { id: \"t4\", title: \"Verify heading tag structure (H1\u2013H6)\", detail: \"Ensure each page has a unique, descriptive H1 and logical heading hierarchy.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"t5\", title: \"Transfer structured data \/ schema markup\", detail: \"Migrate all JSON-LD or microdata. Validate with Google's Rich Results Test. Lost schema = lost rich snippets.\", priority: \"important\", conditions: [\"seo:critical\", \"seo:important\"], tool: \"Rich Results Test\" },\n      { id: \"t6\", title: \"Verify Open Graph and Twitter Card meta tags\", detail: \"Ensure OG titles, descriptions, and images render correctly. Test with Meta's and X's debugger tools.\", priority: \"important\", conditions: [], tool: \"Meta Sharing Debugger \/ X Card Validator\" },\n      { id: \"t7\", title: \"Create and validate XML sitemaps\", detail: \"Include all indexable pages. Exclude staging URLs, parameter URLs, and thin content.\", priority: \"critical\", conditions: [], tool: \"Screaming Frog \/ Yoast\" },\n      { id: \"t8\", title: \"Prepare production robots.txt\", detail: \"Allow crawling of all important pages and resources. Remove any staging-environment blocks.\", priority: \"critical\", conditions: [], tool: \"\" },\n      { id: \"t9\", title: \"Validate canonical tags on every page\", detail: \"Each page needs a self-referencing canonical. Ensure no pages reference old or staging URLs \u2014 this is a silent killer.\", priority: \"critical\", conditions: [], tool: \"Screaming Frog\" },\n      { id: \"t10\", title: \"Fix all internal links to point to new URLs directly\", detail: \"Don't rely on redirects for internal navigation \u2014 update all links to use new URL paths.\", priority: \"important\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\"], tool: \"Screaming Frog \/ Better Search Replace\" },\n      { id: \"t11\", title: \"Test mobile experience on real devices\", detail: \"With mobile-first indexing, Google evaluates your mobile site. Test on actual phones and tablets, not just emulators.\", priority: \"important\", conditions: [], tool: \"BrowserStack \/ real devices\" },\n      { id: \"t12\", title: \"Run Lighthouse audits and check Core Web Vitals\", detail: \"Ensure LCP, INP, and CLS meet or exceed your pre-migration baseline.\", priority: \"important\", conditions: [], tool: \"Lighthouse \/ PageSpeed Insights\" },\n      { id: \"t13\", title: \"Set up GA4 and GTM on new site\", detail: \"Verify all events, conversions, and goals fire correctly on the new site.\", priority: \"critical\", conditions: [], tool: \"Google Tag Manager \/ GA4\" },\n      { id: \"t14\", title: \"Re-implement all third-party tracking pixels\", detail: \"Re-add Meta Pixel, LinkedIn Insight Tag, Google Ads tags, chat widgets, heatmaps, and any other scripts inventoried during planning.\", priority: \"critical\", conditions: [], tool: \"Google Tag Manager\" },\n      { id: \"t15\", title: \"Verify cookie consent and GDPR\/privacy compliance\", detail: \"Ensure cookie banner, consent management platform, and privacy controls work on the new site. Update privacy policy URLs.\", priority: \"critical\", conditions: [], tool: \"CookieScript \/ OneTrust \/ Cookiebot\" },\n      { id: \"t16\", title: \"Configure cross-domain tracking for transition\", detail: \"If changing domains, track users across both old and new domains during the transition period.\", priority: \"important\", conditions: [\"type:domain\"], tool: \"GA4\" },\n      { id: \"t17\", title: \"Verify SSL certificate and HTTPS configuration\", detail: \"Ensure certificate covers all subdomains, mixed content warnings are resolved, and HSTS is configured.\", priority: \"critical\", conditions: [\"type:https\", \"type:domain\", \"type:hosting\"], tool: \"SSL Labs\" },\n      { id: \"t18\", title: \"Test checkout and payment flows end-to-end\", detail: \"Process test transactions through every payment method. Verify cart, checkout, and confirmation pages.\", priority: \"critical\", conditions: [\"ecom:yes\"], tool: \"\" },\n      { id: \"t19\", title: \"Verify all forms and interactive elements\", detail: \"Test contact forms, search, login, newsletter signup, and any other interactive features.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"t20\", title: \"Create custom 404 and 500 error pages\", detail: \"Design helpful error pages with navigation, search, and links to key pages. Don't leave users stranded.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"t21\", title: \"Run a full SEO audit on the staging site\", detail: \"Crawl your staging environment with an SEO tool to catch technical issues BEFORE they go live. Fix everything found.\", priority: \"critical\", conditions: [], tool: \"Screaming Frog \/ SEMrush Site Audit\" },\n      { id: \"t22\", title: \"Check accessibility \/ WCAG 2.1 AA compliance\", detail: \"Use the migration as an opportunity to meet accessibility standards. ADA Title II deadlines are active in 2026. Audit colour contrast, alt text, keyboard nav, and screen readers.\", priority: \"important\", conditions: [], tool: \"axe DevTools \/ WAVE \/ Lighthouse\" },\n      { id: \"t23\", title: \"Verify CRM and email marketing integrations\", detail: \"Ensure form submissions, lead capture, and email automation tools (Mailchimp, HubSpot, etc.) are connected and working.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"t24\", title: \"Check image optimisation and alt text\", detail: \"Ensure images are properly compressed, served in modern formats (WebP\/AVIF), and have descriptive alt attributes.\", priority: \"nice\", conditions: [], tool: \"Squoosh \/ ShortPixel\" },\n      { id: \"t25\", title: \"Test site search functionality\", detail: \"Verify internal search returns accurate results and URL patterns are correct.\", priority: \"nice\", conditions: [\"size:large\", \"size:enterprise\"], tool: \"\" },\n      { id: \"t26\", title: \"Validate hreflang tags for international pages\", detail: \"If your site serves multiple languages or regions, verify hreflang implementation on the new site.\", priority: \"important\", conditions: [\"size:large\", \"size:enterprise\"], tool: \"Screaming Frog \/ Ahrefs\" },\n      { id: \"t27\", title: \"Set up server monitoring and alerting\", detail: \"Configure uptime monitoring, error rate alerts, and performance thresholds.\", priority: \"important\", conditions: [], tool: \"UptimeRobot \/ Datadog \/ Pingdom\" },\n      { id: \"t28\", title: \"Migrate product feeds and shopping integrations\", detail: \"Update Google Merchant Center, Facebook Catalog, and any other shopping feeds with new URLs.\", priority: \"critical\", conditions: [\"ecom:yes\"], tool: \"Google Merchant Center\" },\n      { id: \"t29\", title: \"Load test the new server\", detail: \"Simulate expected traffic levels to ensure the new infrastructure can handle the load without degraded response times.\", priority: \"important\", conditions: [\"size:large\", \"size:enterprise\", \"type:hosting\"], tool: \"Apache JMeter \/ k6 \/ GTmetrix\" },\n      { id: \"t30\", title: \"Conduct user acceptance testing (UAT)\", detail: \"Have real users (not just devs) test key journeys: navigation, checkout, forms, search. Fresh eyes catch things automated tests miss.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"t31\", title: \"Pause or update paid ad campaigns\", detail: \"Update landing page URLs in Google Ads, Meta Ads, LinkedIn Ads, etc. Consider pausing campaigns during the switchover window.\", priority: \"critical\", conditions: [\"ecom:yes\", \"seo:critical\", \"seo:important\"], tool: \"Google Ads \/ Meta Ads Manager\" },\n    ]\n  },\n  launch: {\n    label: \"Phase 3: Launch Day\",\n    badge: \"launch\",\n    items: [\n      { id: \"l1\", title: \"Remove all noindex tags and staging robots.txt blocks\", detail: \"Verify that EVERY page on the production site is indexable. This is the #1 launch-day mistake. Check canonicals too.\", priority: \"critical\", conditions: [], tool: \"Screaming Frog quick crawl\" },\n      { id: \"l2\", title: \"Deploy the new site\", detail: \"Execute the migration according to your plan. If changing domains, update DNS records.\", priority: \"critical\", conditions: [], tool: \"\" },\n      { id: \"l3\", title: \"Verify redirects are working in production\", detail: \"Test a representative sample of redirects on the live site. Check high-traffic and high-value pages first.\", priority: \"critical\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\", \"type:consolidation\", \"type:https\"], tool: \"httpstatus.io \/ Screaming Frog\" },\n      { id: \"l4\", title: \"Submit new XML sitemap to Search Console\", detail: \"Upload immediately after launch to help Google discover your new URL structure.\", priority: \"critical\", conditions: [], tool: \"Google Search Console\" },\n      { id: \"l5\", title: \"Use Change of Address tool in Search Console\", detail: \"For domain migrations, this signals to Google that your site has moved and accelerates the transition.\", priority: \"critical\", conditions: [\"type:domain\"], tool: \"Google Search Console\" },\n      { id: \"l6\", title: \"Request indexing for top pages via Search Console\", detail: \"Manually request indexing for your 20\u201350 most important pages to speed up discovery.\", priority: \"important\", conditions: [], tool: \"Google Search Console\" },\n      { id: \"l7\", title: \"Verify analytics and all tracking pixels are live\", detail: \"Confirm GA4, GTM, Meta Pixel, and every third-party script is firing on all pages. Check conversion tracking especially.\", priority: \"critical\", conditions: [], tool: \"Google Tag Assistant \/ Meta Pixel Helper\" },\n      { id: \"l8\", title: \"Monitor server performance and error rates\", detail: \"Watch for elevated response times, 5xx errors, or capacity issues in real time.\", priority: \"critical\", conditions: [], tool: \"Server logs \/ UptimeRobot\" },\n      { id: \"l9\", title: \"Spot-check key pages for correct rendering\", detail: \"Review homepage, top landing pages, and key conversion pages on desktop and mobile. Check images, layout, and functionality.\", priority: \"important\", conditions: [], tool: \"BrowserStack \/ manual testing\" },\n      { id: \"l10\", title: \"Verify robots.txt allows crawling\", detail: \"Fetch your live robots.txt and confirm it permits access to all important pages and resources.\", priority: \"critical\", conditions: [], tool: \"Google Search Console\" },\n      { id: \"l11\", title: \"Test live checkout process\", detail: \"Place a real test order immediately after launch to verify the full purchase flow.\", priority: \"critical\", conditions: [\"ecom:yes\"], tool: \"\" },\n      { id: \"l12\", title: \"Confirm CDN is serving the new site\", detail: \"If using a CDN, purge caches and verify it's serving fresh content from the new origin.\", priority: \"important\", conditions: [\"type:hosting\", \"size:large\", \"size:enterprise\"], tool: \"Cloudflare \/ Fastly \/ AWS CloudFront\" },\n      { id: \"l13\", title: \"Verify cookie consent banner is working\", detail: \"Check that cookie banner appears, consent is recorded, and third-party scripts only fire after consent.\", priority: \"important\", conditions: [], tool: \"\" },\n      { id: \"l14\", title: \"Re-activate paid ad campaigns with updated URLs\", detail: \"Un-pause campaigns and verify ads are pointing to the correct new landing page URLs.\", priority: \"important\", conditions: [\"ecom:yes\", \"seo:critical\", \"seo:important\"], tool: \"Google Ads \/ Meta Ads\" },\n      { id: \"l15\", title: \"Lift the content freeze\", detail: \"Notify the content team that the migration is live and normal publishing can resume.\", priority: \"nice\", conditions: [], tool: \"\" },\n    ]\n  },\n  postlaunch: {\n    label: \"Phase 4: Post-Launch Monitoring\",\n    badge: \"postlaunch\",\n    items: [\n      { id: \"m1\", title: \"Check Search Console daily for crawl errors (Week 1)\", detail: \"Look for spikes in 404s, 5xx errors, and indexing issues. Fix immediately.\", priority: \"critical\", conditions: [], tool: \"Google Search Console\" },\n      { id: \"m2\", title: \"Monitor organic traffic daily vs. baseline (Week 1)\", detail: \"Some fluctuation is normal. A 30%+ drop signals a technical issue needing urgent attention.\", priority: \"critical\", conditions: [], tool: \"GA4 \/ Search Console\" },\n      { id: \"m3\", title: \"Track indexed page count daily (Week 1)\", detail: \"A significant drop in indexed pages means Google is having trouble with your new site.\", priority: \"important\", conditions: [], tool: \"Google Search Console\" },\n      { id: \"m4\", title: \"Monitor server logs for 404 errors\", detail: \"Each 404 from a previously valid URL represents a missing or broken redirect. Prioritise high-traffic 404s.\", priority: \"important\", conditions: [], tool: \"Server logs \/ Screaming Frog Log Analyzer\" },\n      { id: \"m5\", title: \"Verify ad campaign performance post-migration\", detail: \"Check that conversion tracking is accurate and campaign performance hasn't degraded due to URL changes.\", priority: \"important\", conditions: [\"ecom:yes\", \"seo:critical\"], tool: \"Google Ads \/ Meta Ads Manager\" },\n      { id: \"m6\", title: \"Compare keyword rankings against baseline (Week 2)\", detail: \"Are your important keywords recovering? Investigate underperforming pages individually.\", priority: \"critical\", conditions: [\"seo:critical\", \"seo:important\"], tool: \"Ahrefs \/ SEMrush \/ Search Console\" },\n      { id: \"m7\", title: \"Run a fresh crawl and compare with pre-migration data (Compare Crawls)\", detail: \"Look for new broken links, missing metadata, orphaned pages, or unexpected technical issues. Use 'Compare Crawls' features.\", priority: \"important\", conditions: [], tool: \"Screaming Frog \/ SEMrush Site Audit\" },\n      { id: \"m8\", title: \"Check backlink profile for losses\", detail: \"Verify external links are resolving through your redirects. A drop in referring domains means redirect issues.\", priority: \"important\", conditions: [\"seo:critical\", \"seo:important\"], tool: \"Ahrefs \/ SEMrush\" },\n      { id: \"m9\", title: \"Monitor conversion rates and revenue (Weeks 1\u20134)\", detail: \"Compare against your pre-migration baseline. Drops may indicate UX issues, broken forms, or tracking problems.\", priority: \"critical\", conditions: [\"ecom:yes\"], tool: \"GA4 \/ Shopify Analytics\" },\n      { id: \"m10\", title: \"Check bounce rate and engagement on key pages\", detail: \"A spike in bounce rate on previously strong pages may indicate rendering, UX, or content issues on the new site.\", priority: \"important\", conditions: [], tool: \"GA4\" },\n      { id: \"m11\", title: \"Update Google Business Profile with new URLs\", detail: \"If your domain or key page URLs changed, update your GBP listing.\", priority: \"important\", conditions: [\"type:domain\"], tool: \"Google Business Profile\" },\n      { id: \"m12\", title: \"Update social media profiles and bios\", detail: \"Replace old URLs in all social profiles, link-in-bio tools, and pinned posts.\", priority: \"nice\", conditions: [\"type:domain\"], tool: \"\" },\n      { id: \"m13\", title: \"Update email signatures and templates\", detail: \"Replace old URLs in email signatures, automated emails, and newsletter templates.\", priority: \"nice\", conditions: [\"type:domain\"], tool: \"\" },\n      { id: \"m14\", title: \"Reach out to high-value backlink sources\", detail: \"Ask top linking sites to update their links to your new URLs. Direct links beat redirects long-term.\", priority: \"important\", conditions: [\"type:domain\", \"seo:critical\"], tool: \"Ahrefs \/ email outreach\" },\n      { id: \"m15\", title: \"Update business directories and citations\", detail: \"Update NAP (name, address, phone) and URLs in all directory listings.\", priority: \"important\", conditions: [\"type:domain\"], tool: \"\" },\n      { id: \"m16\", title: \"Test social sharing from the live site\", detail: \"Share key pages on Facebook, LinkedIn, and X. Verify OG images, titles, and descriptions render correctly.\", priority: \"important\", conditions: [], tool: \"Meta Sharing Debugger\" },\n      { id: \"m17\", title: \"Continue weekly monitoring for 90 days\", detail: \"Domain migrations can take 3 months to fully recover. Don't let up on monitoring.\", priority: \"important\", conditions: [\"type:domain\"], tool: \"GA4 \/ Search Console \/ Ahrefs\" },\n      { id: \"m18\", title: \"Monitor AI Overview \/ featured snippet presence\", detail: \"Check if your content still appears in AI Overviews and featured snippets post-migration.\", priority: \"nice\", conditions: [\"seo:critical\"], tool: \"SEMrush \/ manual SERP checks\" },\n      { id: \"m19\", title: \"Run a post-migration accessibility audit\", detail: \"Verify WCAG compliance hasn't regressed. Check screen readers, keyboard navigation, and colour contrast on the live site.\", priority: \"nice\", conditions: [], tool: \"axe DevTools \/ WAVE\" },\n      { id: \"m20\", title: \"Document lessons learned\", detail: \"Record what went well, what went wrong, and what you'd do differently. Invaluable for future migrations.\", priority: \"nice\", conditions: [], tool: \"\" },\n      { id: \"m21\", title: \"Schedule redirect cleanup at 6 months\", detail: \"After 6 months, review which redirects are still getting traffic and plan for eventual sunsetting.\", priority: \"nice\", conditions: [\"type:platform\", \"type:domain\", \"type:redesign\"], tool: \"\" },\n    ]\n  }\n};\n\n\/\/ \u2500\u2500 Checklist Generation \u2500\u2500\nfunction itemMatchesConditions(item, types, size, seo, ecom) {\n  if (item.conditions.length === 0) return true;\n  for (const cond of item.conditions) {\n    const [key, val] = cond.split(':');\n    if (key === 'type' && types.includes(val)) return true;\n    if (key === 'size' && size === val) return true;\n    if (key === 'seo' && seo === val) return true;\n    if (key === 'ecom' && ecom === val) return true;\n  }\n  return false;\n}\n\nfunction generateChecklist() {\n  const types = selections.types;\n  const size = selections.size;\n  const seo = selections.seo;\n  const ecom = selections.ecom;\n  if (types.length === 0 || !size || !seo || !ecom) {\n    alert('Please answer all questions before generating your checklist.');\n    return;\n  }\n  checkState = {};\n  const container = document.getElementById('phasesContainer');\n  container.innerHTML = '';\n  let totalItems = 0;\n  for (const [phaseKey, phase] of Object.entries(allItems)) {\n    const filtered = phase.items.filter(item => itemMatchesConditions(item, types, size, seo, ecom));\n    if (filtered.length === 0) continue;\n    totalItems += filtered.length;\n    filtered.forEach(item => { checkState[item.id] = false; });\n    const phaseEl = document.createElement('div');\n    phaseEl.className = 'phase';\n    phaseEl.innerHTML = `\n      <div class=\"phase-header\" onclick=\"togglePhase('${phaseKey}')\">\n        <span class=\"phase-toggle open\" id=\"toggle-${phaseKey}\">\u25b6<\/span>\n        <span class=\"phase-badge ${phase.badge}\">${phaseKey === 'planning' ? '1' : phaseKey === 'prelaunch' ? '2' : phaseKey === 'launch' ? '3' : '4'}<\/span>\n        <div class=\"phase-info\">\n          <h3>${phase.label}<\/h3>\n          <span class=\"phase-count\" id=\"count-${phaseKey}\">0 \/ ${filtered.length} complete<\/span>\n        <\/div>\n        <div class=\"phase-progress-mini\">\n          <div class=\"phase-progress-mini-fill\" id=\"miniprog-${phaseKey}\" style=\"width:0%\"><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"phase-items\" id=\"items-${phaseKey}\">\n        ${filtered.map(item => `\n          <div class=\"checklist-item\" id=\"row-${item.id}\">\n            <div class=\"check-box\" id=\"box-${item.id}\" onclick=\"toggleCheck('${item.id}', '${phaseKey}', ${filtered.length})\"><\/div>\n            <div class=\"item-content\">\n              <div class=\"item-title\">${item.title}<\/div>\n              <div class=\"item-detail\">${item.detail}<\/div>\n              <div class=\"item-tags\">\n                ${item.priority === 'critical' ? '<span class=\"tag critical\">Critical<\/span>' : ''}\n                ${item.priority === 'important' ? '<span class=\"tag important\">Important<\/span>' : ''}\n                ${item.priority === 'nice' ? '<span class=\"tag nice\">Nice to have<\/span>' : ''}\n                ${item.tool ? '<span class=\"tag tool-tag\">' + item.tool + '<\/span>' : ''}\n              <\/div>\n            <\/div>\n          <\/div>\n        `).join('')}\n      <\/div>\n    `;\n    container.appendChild(phaseEl);\n  }\n  document.getElementById('totalCount').textContent = totalItems;\n  document.getElementById('wizard').classList.add('hidden');\n  document.getElementById('checklistOutput').classList.remove('hidden');\n  updateProgress();\n}\n\nfunction togglePhase(phaseKey) {\n  const items = document.getElementById('items-' + phaseKey);\n  const toggle = document.getElementById('toggle-' + phaseKey);\n  items.classList.toggle('hidden');\n  toggle.classList.toggle('open');\n}\n\nfunction toggleCheck(id, phaseKey, phaseTotal) {\n  checkState[id] = !checkState[id];\n  const box = document.getElementById('box-' + id);\n  const row = document.getElementById('row-' + id);\n  box.classList.toggle('checked', checkState[id]);\n  row.classList.toggle('done', checkState[id]);\n  const phaseItems = document.getElementById('items-' + phaseKey).querySelectorAll('.checklist-item');\n  let phaseDone = 0;\n  phaseItems.forEach(el => { if (el.classList.contains('done')) phaseDone++; });\n  document.getElementById('count-' + phaseKey).textContent = `${phaseDone} \/ ${phaseTotal} complete`;\n  document.getElementById('miniprog-' + phaseKey).style.width = `${(phaseDone \/ phaseTotal) * 100}%`;\n  updateProgress();\n}\n\nfunction updateProgress() {\n  const total = Object.keys(checkState).length;\n  const done = Object.values(checkState).filter(Boolean).length;\n  const pct = total > 0 ? Math.round((done \/ total) * 100) : 0;\n  document.getElementById('completedCount').textContent = done;\n  document.getElementById('totalCount').textContent = total;\n  document.getElementById('percentComplete').textContent = pct;\n  const fill = document.getElementById('progressFill');\n  fill.style.width = pct + '%';\n  fill.classList.toggle('complete', pct === 100);\n  document.getElementById('completionBanner').classList.toggle('show', pct === 100);\n}\n\nfunction resetChecklist() {\n  if (!confirm('Start over? Your progress will be lost.')) return;\n  selections = { types: [], size: null, seo: null, ecom: null };\n  document.querySelectorAll('.option-btn').forEach(b => b.classList.remove('selected'));\n  document.getElementById('wizard').classList.remove('hidden');\n  document.getElementById('checklistOutput').classList.add('hidden');\n  document.getElementById('completionBanner').classList.remove('show');\n}\n\nfunction exportChecklist() {\n  let text = \"WEBSITE MIGRATION CHECKLIST\\n\" + \"=\".repeat(40) + \"\\n\\n\";\n  for (const [phaseKey, phase] of Object.entries(allItems)) {\n    const items = document.getElementById('items-' + phaseKey);\n    if (!items) continue;\n    text += phase.label.toUpperCase() + \"\\n\" + \"-\".repeat(30) + \"\\n\";\n    items.querySelectorAll('.checklist-item').forEach(el => {\n      const id = el.id.replace('row-', '');\n      const checked = checkState[id] ? '\u2705' : '\u2b1c';\n      const title = el.querySelector('.item-title').textContent;\n      text += `${checked} ${title}\\n`;\n    });\n    text += \"\\n\";\n  }\n  navigator.clipboard.writeText(text).then(() => {\n    alert('Checklist copied to clipboard!');\n  }).catch(() => {\n    const ta = document.createElement('textarea');\n    ta.value = text;\n    document.body.appendChild(ta);\n    ta.select();\n    document.execCommand('copy');\n    document.body.removeChild(ta);\n    alert('Checklist copied to clipboard!');\n  });\n}\n\n\/\/ \u2500\u2500 SVG to PNG helper \u2500\u2500\nfunction svgToPng(svgString, width, height) {\n  return new Promise((resolve) => {\n    const canvas = document.createElement('canvas');\n    const scale = 2;\n    canvas.width = width * scale;\n    canvas.height = height * scale;\n    const ctx = canvas.getContext('2d');\n    const img = new Image();\n    const blob = new Blob([svgString], { type: 'image\/svg+xml;charset=utf-8' });\n    const url = URL.createObjectURL(blob);\n    img.onload = function() {\n      ctx.drawImage(img, 0, 0, width * scale, height * scale);\n      URL.revokeObjectURL(url);\n      const dataUrl = canvas.toDataURL('image\/png');\n      const base64 = dataUrl.replace(\/^data:image\\\/png;base64,\/, '');\n      resolve(base64);\n    };\n    img.onerror = function() {\n      URL.revokeObjectURL(url);\n      resolve(null);\n    };\n    img.src = url;\n  });\n}\n\n\/\/ \u2500\u2500 DNHQ Logo SVG (white version for dark header) \u2500\u2500\nconst DNHQ_LOGO_SVG = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"353\" height=\"48\" viewBox=\"0 0 353 48\" fill=\"none\"><path d=\"M14.6963 27.1035C17.7087 27.927 20.0632 30.2212 20.9082 33.1572L25.0293 47.4814H11.9551C5.35263 47.4814 4.57366e-08 42.2642 0 35.8291V23.0859L14.6963 27.1035ZM46.2168 4.52344C47.7827 6.49381 48.7157 8.96615 48.7158 11.6514V47.4814H30.0615L46.2168 4.52344ZM36.7607 0C39.5161 0 42.0534 0.909114 44.0752 2.43555L0 18.1816V0H36.7607Z\" fill=\"white\" stroke=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M112.389 17.0717C114.465 17.0718 116.181 17.5636 117.524 18.5589L117.652 18.6511C118.406 19.2095 118.993 19.8895 119.414 20.6896V17.4885H124.985V38.0149C124.985 41.0789 123.959 43.512 121.897 45.2953L121.897 45.295C119.866 47.1039 117.089 48 113.586 48C110.685 48 108.287 47.3842 106.402 46.1407L106.401 46.1401C104.543 44.895 103.435 43.206 103.086 41.0806L103.057 40.9042H108.482L108.518 41.0066C108.743 41.6399 109.214 42.1435 109.952 42.5132L110.104 42.5851L110.106 42.586L110.269 42.6594C111.101 43.0144 112.162 43.1959 113.457 43.1959C115.461 43.1959 116.911 42.7552 117.839 41.9038L117.841 41.9024L117.926 41.8239C118.796 41 119.243 39.754 119.243 38.0567V35.3744C118.774 36.1716 118.114 36.8577 117.266 37.4317L117.264 37.4329C115.837 38.3696 114.095 38.8338 112.047 38.8339C110.083 38.8339 108.358 38.3832 106.877 37.4772L106.875 37.4764C105.425 36.5715 104.295 35.3136 103.485 33.7072L103.485 33.7063C102.675 32.071 102.272 30.1725 102.272 28.0152C102.272 25.8298 102.689 23.9167 103.528 22.2806C104.367 20.6459 105.541 19.374 107.049 18.4693C108.587 17.5362 110.369 17.0717 112.389 17.0717ZM113.756 21.5427C112.088 21.5428 110.75 22.1098 109.727 23.241L109.726 23.2424C108.705 24.3446 108.184 25.9145 108.184 27.9737C108.185 30.0328 108.705 31.6025 109.726 32.7047L109.823 32.8065C110.832 33.8422 112.153 34.3629 113.799 34.3629C115.499 34.3629 116.836 33.8082 117.829 32.7064L117.829 32.7061L117.923 32.5989C118.883 31.4761 119.372 29.9265 119.372 27.9319C119.372 25.937 118.883 24.4014 117.924 23.3053L117.83 23.2006C116.808 22.0973 115.456 21.5427 113.756 21.5427Z\" fill=\"white\"\/><path d=\"M145.119 17.4888H151.061V21.9179H145.119V32.0154C145.119 33.0168 145.396 33.7324 145.922 34.1939L146.025 34.2784C146.559 34.6875 147.378 34.9048 148.511 34.9048C148.988 34.9048 149.406 34.8772 149.766 34.8234C150.158 34.7414 150.521 34.6462 150.856 34.5375L151.061 34.471V38.8592L150.975 38.9013C150.611 39.0787 150.107 39.2067 149.473 39.291L149.473 39.2907C148.837 39.4029 148.131 39.4591 147.357 39.4591C144.657 39.4591 142.629 38.8435 141.306 37.5825L141.303 37.5799C140.011 36.2916 139.378 34.3858 139.378 31.8906V21.9179H135.188V17.4888H139.378V12.7017L145.119 10.6308V17.4888Z\" fill=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M162.343 17.0717C164.419 17.0717 166.149 17.564 167.521 18.5589C168.311 19.116 168.927 19.8008 169.368 20.6108V17.4885H174.939V39.0421H169.368V36.0119C168.883 36.8042 168.208 37.4866 167.347 38.0575L167.345 38.0587C165.891 38.9941 164.164 39.4588 162.172 39.4588C160.152 39.4588 158.385 39.0084 156.875 38.1028L156.872 38.1011C155.438 37.1971 154.319 35.9486 153.515 34.36L153.438 34.2053C152.628 32.542 152.226 30.5883 152.226 28.3486C152.226 26.0806 152.643 24.0987 153.481 22.4075C154.319 20.7176 155.492 19.4035 157.001 18.4705L157.002 18.4699L157.147 18.3837C158.652 17.5078 160.385 17.0717 162.343 17.0717ZM163.711 21.7094C161.984 21.7094 160.634 22.2904 159.641 23.4464L159.64 23.4478C158.646 24.5777 158.138 26.1903 158.138 28.3068C158.138 30.4235 158.646 32.0362 159.64 33.1661L159.734 33.2702C160.718 34.329 162.051 34.8629 163.753 34.863C165.481 34.863 166.832 34.2947 167.824 33.1661C168.818 32.0079 169.326 30.3809 169.326 28.2653C169.326 26.1496 168.804 24.5376 167.783 23.4077L167.782 23.406C166.789 22.2774 165.438 21.7094 163.711 21.7094Z\" fill=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M233.084 17.0717C235.443 17.0718 237.508 17.5487 239.273 18.5077C241.036 19.4375 242.41 20.7346 243.394 22.3978L243.484 22.5546C244.408 24.1837 244.868 26.061 244.868 28.1819C244.868 30.3718 244.363 32.3286 243.351 34.0482L243.352 34.0485C242.399 35.6869 241.079 36.982 239.395 37.9321L239.23 38.0228C237.465 38.9817 235.415 39.4588 233.084 39.4588C230.754 39.4588 228.689 38.9818 226.896 38.0234L226.895 38.0228C225.132 37.065 223.757 35.7397 222.774 34.0485L222.774 34.0474C221.79 32.3278 221.301 30.3713 221.301 28.1819C221.301 25.9926 221.79 24.063 222.775 22.3978L222.868 22.2428C223.845 20.6533 225.189 19.4076 226.897 18.5069C228.69 17.5487 230.754 17.0717 233.084 17.0717ZM233.084 21.5843C231.44 21.5843 230.078 22.1296 228.986 23.2202L228.881 23.3275C227.775 24.4866 227.213 26.0846 227.213 28.1404C227.213 29.5392 227.466 30.7521 227.967 31.7833C228.498 32.7888 229.193 33.5724 230.051 34.139C230.935 34.6761 231.945 34.9463 233.084 34.9463C234.196 34.9463 235.192 34.6759 236.077 34.1376C236.963 33.5707 237.657 32.7876 238.158 31.7833C238.66 30.7521 238.913 29.5392 238.913 28.1404C238.913 26.0846 238.351 24.4866 237.245 23.3275L237.243 23.3261C236.163 22.1653 234.781 21.5843 233.084 21.5843Z\" fill=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M293.876 17.0717C295.953 17.0717 297.683 17.564 299.055 18.5589C299.845 19.116 300.461 19.8008 300.902 20.6108V17.4885H306.472V39.0421H300.902V36.0119C300.416 36.8042 299.742 37.4866 298.88 38.0575L298.878 38.0587C297.424 38.9941 295.698 39.4588 293.705 39.4588C291.686 39.4588 289.918 39.0084 288.408 38.1028L288.405 38.1011C286.972 37.1971 285.853 35.9486 285.049 34.36L284.972 34.2053C284.162 32.542 283.76 30.5883 283.76 28.3486C283.76 26.0806 284.176 24.0987 285.015 22.4075C285.853 20.7176 287.026 19.4035 288.535 18.4705L288.536 18.4699L288.681 18.3837C290.185 17.5078 291.919 17.0717 293.876 17.0717ZM295.244 21.7094C293.518 21.7094 292.167 22.2904 291.175 23.4464L291.173 23.4478C290.18 24.5777 289.672 26.1903 289.672 28.3068C289.672 30.4235 290.18 32.0362 291.173 33.1661L291.268 33.2702C292.251 34.329 293.585 34.8629 295.287 34.863C297.014 34.863 298.365 34.2947 299.358 33.1661C300.352 32.0079 300.859 30.3809 300.859 28.2653C300.859 26.1496 300.338 24.5376 299.316 23.4077L299.315 23.406C298.323 22.2774 296.972 21.7094 295.244 21.7094Z\" fill=\"white\"\/><path d=\"M342.836 17.0717C345.565 17.0717 347.767 17.6457 349.426 18.8087C351.116 19.9458 352.051 21.5283 352.226 23.5443L352.24 23.7092H347.021L347 23.5812C346.865 22.7648 346.436 22.151 345.707 21.7296L345.704 21.7285C344.997 21.3045 344.004 21.0845 342.708 21.0845C341.495 21.0845 340.604 21.2778 340.014 21.644L340.011 21.6451L340.009 21.6466C339.431 21.9797 339.145 22.4711 339.145 23.1406C339.145 23.6446 339.362 24.0744 339.812 24.4372C340.271 24.7783 341.057 25.0915 342.191 25.3677L345.949 26.2003L346.15 26.2461C348.208 26.7292 349.783 27.5448 350.859 28.7034C351.997 29.8979 352.568 31.3098 352.568 32.9317C352.568 34.9403 351.799 36.5206 350.26 37.6553L350.109 37.7637C348.477 38.9 346.203 39.4588 343.307 39.4588C340.266 39.4588 337.823 38.8437 335.993 37.5981L335.992 37.597C334.158 36.3201 333.151 34.5565 332.977 32.3184L332.964 32.1545H338.186L338.204 32.2874C338.34 33.3276 338.843 34.1057 339.713 34.636L339.796 34.6855C340.667 35.1882 341.833 35.4461 343.307 35.4461C344.692 35.4461 345.696 35.2386 346.343 34.845C347.012 34.4278 347.34 33.8506 347.34 33.0984C347.34 32.5528 347.155 32.1225 346.791 31.7933L346.789 31.7913L346.787 31.7893C346.421 31.4326 345.704 31.1208 344.597 30.8719L341.094 30.0805C338.686 29.5776 336.874 28.7918 335.677 27.7103L335.566 27.6022C334.467 26.5073 333.917 25.1558 333.917 23.5571C333.917 21.54 334.707 19.9517 336.288 18.8101C337.892 17.6454 340.08 17.0718 342.836 17.0717Z\" fill=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M331.105 39.0418H325.534V36.0119C325.048 36.8041 324.374 37.4863 323.512 38.0573L323.511 38.0584C322.056 38.9938 320.33 39.4586 318.338 39.4586C316.318 39.4585 314.55 39.0082 313.041 38.1025L313.037 38.1008C311.604 37.1968 310.485 35.9482 309.681 34.3597L309.604 34.205C308.794 32.5417 308.392 30.5881 308.392 28.3484C308.392 26.0804 308.809 24.0985 309.647 22.4072C310.485 20.7173 311.658 19.4032 313.167 18.4702L313.168 18.4696L313.313 18.3834C314.818 17.5075 316.551 17.0715 318.509 17.0715C320.585 17.0715 322.315 17.5637 323.687 18.5587C324.38 19.0471 324.939 19.6336 325.363 20.3167V8.73853H331.105V39.0418ZM319.877 21.7091C318.209 21.7091 316.871 22.2892 315.848 23.4478L315.847 23.449C314.826 24.5788 314.304 26.1909 314.304 28.3065C314.304 30.4222 314.826 32.0342 315.847 33.1641L315.944 33.2685C316.954 34.3297 318.274 34.8627 319.919 34.8627C321.617 34.8627 322.954 34.295 323.947 33.1658L323.948 33.1655L324.042 33.0557C325.002 31.9053 325.491 30.3144 325.491 28.265C325.491 26.1493 324.97 24.5373 323.949 23.4074C322.927 22.2768 321.575 21.7092 319.877 21.7091Z\" fill=\"white\"\/><path d=\"M274.408 17.0717C276.718 17.0717 278.543 17.7196 279.861 19.0317C281.207 20.3151 281.875 22.0237 281.875 24.1405V39.0421H276.133V25.1819C276.133 23.9537 275.825 23.0856 275.241 22.5424L275.238 22.5398C274.649 21.9654 273.796 21.6676 272.656 21.6676C271.691 21.6676 270.815 21.87 270.025 22.273L269.868 22.3563C269.091 22.7856 268.472 23.38 268.01 24.1422L267.919 24.297C267.449 25.1322 267.212 26.1062 267.212 27.2236V39.0421H261.471V25.1819C261.471 23.9555 261.149 23.0882 260.538 22.5446L260.533 22.5398C259.944 21.9654 259.091 21.6676 257.95 21.6676C257.012 21.6676 256.151 21.8698 255.362 22.273L255.206 22.3563C254.376 22.8146 253.712 23.4615 253.212 24.3001C252.743 25.1347 252.506 26.1076 252.506 27.2236V39.0421H246.808V17.4882H252.378V21.0122C253.023 20.058 253.824 19.2543 254.781 18.6028L254.913 18.5143C256.338 17.5514 257.993 17.0718 259.874 17.0717C262.128 17.0717 263.923 17.7063 265.241 18.9902L265.363 19.1088C265.93 19.677 266.365 20.3186 266.671 21.0318C267.345 20.024 268.215 19.184 269.279 18.5129C270.76 17.551 272.472 17.0718 274.408 17.0717Z\" fill=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M75.5455 8.73853C78.9278 8.73854 81.8879 9.35322 84.4214 10.5879L84.6572 10.7051C87.0769 11.9327 88.9592 13.6494 90.2999 15.8545C91.7129 18.1038 92.4162 20.7565 92.4162 23.8068C92.4162 26.858 91.7125 29.5386 90.2996 31.843L90.299 31.8436C88.8869 34.1187 86.9126 35.8873 84.3803 37.1495L84.3806 37.1498C81.8751 38.4129 78.9426 39.0418 75.5881 39.0418H64.0609V8.73853H75.5455ZM69.9306 34.4044H75.5455C77.8615 34.4044 79.8286 33.9501 81.4532 33.0492L81.6043 32.9636C83.1562 32.0683 84.3381 30.841 85.1528 29.2794L85.154 29.2774L85.2343 29.1255C86.051 27.5476 86.4613 25.748 86.4613 23.7235C86.4613 21.6616 86.0241 19.8541 85.1549 18.2964L85.154 18.2947C84.3139 16.7389 83.0827 15.5384 81.4567 14.6913L81.4537 14.6899C79.8581 13.8168 77.8912 13.3759 75.5455 13.3759H69.9306V34.4044Z\" fill=\"white\"\/><path d=\"M100.325 39.0418H94.6262V17.4882H100.325V39.0418Z\" fill=\"white\"\/><path d=\"M133.111 39.0418H127.412V17.4882H133.111V39.0418Z\" fill=\"white\"\/><path d=\"M183.492 39.0418H177.794V8.73853H183.492V39.0418Z\" fill=\"white\"\/><path d=\"M213.836 31.6411V8.73853H219.535V39.0418H212.405L199.229 16.139V39.0418H193.531V8.73853H200.661L213.836 31.6411Z\" fill=\"white\"\/><path d=\"M100.539 14.2928H94.3696V8.1969H100.539V14.2928Z\" fill=\"white\"\/><path d=\"M133.325 14.2928H127.156V8.1969H133.325V14.2928Z\" fill=\"white\"\/><\/svg>`;\n\n\/\/ \u2500\u2500 Excel Export (DNHQ branded) \u2500\u2500\nasync function exportToExcel() {\n  const wb = new ExcelJS.Workbook();\n  wb.creator = 'Digital Nomads HQ - Migration Checklist Generator';\n  wb.created = new Date();\n\n  const DARK_NAVY = '002A45';\n  const ACCENT_BLUE = '86A4EF';\n  const MINT_GREEN = 'CDFFB6';\n  const WHITE = 'FFFFFF';\n  const LIGHT_GRAY = 'f8fafb';\n  const BORDER_GRAY = 'e6e9ec';\n  const CRITICAL_RED = 'dc2626';\n  const CRITICAL_BG = 'fef2f2';\n  const IMPORTANT_AMBER = 'b45309';\n  const IMPORTANT_BG = 'fff8e6';\n  const NICE_BLUE = '86A4EF';\n  const NICE_BG = 'f0f4ff';\n  const PHASE_COLORS = {\n    planning: { bg: 'f0f4ff', text: '86A4EF', label: 'Phase 1' },\n    prelaunch: { bg: 'fff8e6', text: 'b45309', label: 'Phase 2' },\n    launch: { bg: 'fef2f2', text: 'dc2626', label: 'Phase 3' },\n    postlaunch: { bg: 'edfcf0', text: '16a34a', label: 'Phase 4' }\n  };\n\n  const thinBorder = { style: 'thin', color: { argb: BORDER_GRAY } };\n  const borderAll = { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder };\n\n  \/\/ Convert logo SVG to PNG for Excel embedding\n  let logoImageId = null;\n  try {\n    const logoPng = await svgToPng(DNHQ_LOGO_SVG, 353, 48);\n    if (logoPng) {\n      logoImageId = wb.addImage({ base64: logoPng, extension: 'png' });\n    }\n  } catch(e) { \/* silently skip logo if conversion fails *\/ }\n\n  const ws = wb.addWorksheet('Migration Checklist', {\n    properties: { defaultRowHeight: 22 },\n    pageSetup: { paperSize: 9, orientation: 'landscape', fitToPage: true, fitToWidth: 1, fitToHeight: 0 }\n  });\n\n  ws.columns = [\n    { width: 4 },\n    { width: 8 },\n    { width: 48 },\n    { width: 44 },\n    { width: 13 },\n    { width: 12 },\n    { width: 28 },\n  ];\n\n  let row = 1;\n  ws.mergeCells(`A${row}:G${row}`);\n  const titleCell = ws.getCell(`A${row}`);\n  titleCell.value = ''; \/* logo goes here via image *\/\n  titleCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: DARK_NAVY } };\n  ws.getRow(row).height = 52;\n\n  \/\/ Place logo image in the header row\n  if (logoImageId !== null) {\n    ws.addImage(logoImageId, {\n      tl: { col: 0.3, row: 0.15 },\n      ext: { width: 280, height: 38 }\n    });\n  }\n\n  \/\/ Fill remaining header cells with navy background\n  for (let c = 2; c <= 7; c++) {\n    const cell = ws.getCell(1, c);\n    cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: DARK_NAVY } };\n  }\n\n  row++;\n  ws.mergeCells(`A${row}:G${row}`);\n  const titleTextCell = ws.getCell(`A${row}`);\n  titleTextCell.value = 'WEBSITE MIGRATION CHECKLIST';\n  titleTextCell.font = { name: 'Arial', size: 18, bold: true, color: { argb: MINT_GREEN } };\n  titleTextCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: DARK_NAVY } };\n  titleTextCell.alignment = { horizontal: 'left', vertical: 'middle', indent: 1 };\n  ws.getRow(row).height = 40;\n\n  row++;\n  ws.mergeCells(`A${row}:G${row}`);\n  const subCell = ws.getCell(`A${row}`);\n  const migrationType = selections.types.map(t => {\n    const labels = { platform: 'Platform\/CMS', domain: 'Domain Change', hosting: 'Server\/Hosting', https: 'HTTP\u2192HTTPS', redesign: 'Redesign', consolidation: 'Consolidation' };\n    return labels[t] || t;\n  }).join(', ');\n  const sizeLabels = { small: 'Small (<100 pages)', medium: 'Medium (100\u20131K)', large: 'Large (1K\u201310K)', enterprise: 'Enterprise (10K+)' };\n  subCell.value = `Migration: ${migrationType}  |  Site size: ${sizeLabels[selections.size] || selections.size}  |  Generated: ${new Date().toLocaleDateString()}`;\n  subCell.font = { name: 'Arial', size: 10, color: { argb: ACCENT_BLUE } };\n  subCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: DARK_NAVY } };\n  subCell.alignment = { horizontal: 'left', vertical: 'middle', indent: 1 };\n  ws.getRow(row).height = 26;\n\n  row++;\n  ws.getRow(row).height = 8;\n\n  row++;\n  const total = Object.keys(checkState).length;\n  const done = Object.values(checkState).filter(Boolean).length;\n  ws.mergeCells(`A${row}:G${row}`);\n  const progressCell = ws.getCell(`A${row}`);\n  progressCell.value = `Progress: ${done} of ${total} tasks completed (${total > 0 ? Math.round((done\/total)*100) : 0}%)`;\n  progressCell.font = { name: 'Arial', size: 11, bold: true, color: { argb: ACCENT_BLUE } };\n  progressCell.alignment = { horizontal: 'left', vertical: 'middle', indent: 1 };\n  ws.getRow(row).height = 30;\n\n  row++;\n  ws.getRow(row).height = 6;\n\n  for (const [phaseKey, phase] of Object.entries(allItems)) {\n    const types = selections.types;\n    const filtered = phase.items.filter(item => itemMatchesConditions(item, types, selections.size, selections.seo, selections.ecom));\n    if (filtered.length === 0) continue;\n    const pc = PHASE_COLORS[phaseKey];\n    const phaseDone = filtered.filter(item => checkState[item.id]).length;\n\n    row++;\n    ws.mergeCells(`A${row}:G${row}`);\n    const phaseCell = ws.getCell(`A${row}`);\n    phaseCell.value = `${pc.label}: ${phase.label.replace(\/Phase \\d: \/, '')}  \u2014  ${phaseDone}\/${filtered.length} complete`;\n    phaseCell.font = { name: 'Arial', size: 12, bold: true, color: { argb: pc.text } };\n    phaseCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: pc.bg } };\n    phaseCell.alignment = { horizontal: 'left', vertical: 'middle', indent: 1 };\n    phaseCell.border = borderAll;\n    ws.getRow(row).height = 32;\n\n    row++;\n    const headers = ['', '\u2713', 'Task', 'Details', 'Priority', 'Status', 'Recommended Tool'];\n    const headerRow = ws.getRow(row);\n    headers.forEach((h, i) => {\n      const cell = headerRow.getCell(i + 1);\n      cell.value = h;\n      cell.font = { name: 'Arial', size: 9, bold: true, color: { argb: WHITE } };\n      cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: DARK_NAVY } };\n      cell.alignment = { horizontal: i <= 1 ? 'center' : 'left', vertical: 'middle' };\n      cell.border = borderAll;\n    });\n    ws.getRow(row).height = 24;\n\n    filtered.forEach((item, idx) => {\n      row++;\n      const isDone = checkState[item.id];\n      const itemRow = ws.getRow(row);\n      const bgColor = idx % 2 === 0 ? WHITE : LIGHT_GRAY;\n\n      const cellA = itemRow.getCell(1);\n      cellA.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bgColor } };\n      cellA.border = borderAll;\n\n      const cellB = itemRow.getCell(2);\n      cellB.value = isDone ? '\u2713' : '\u2610';\n      cellB.font = { name: 'Arial', size: 14, bold: isDone, color: { argb: isDone ? '16a34a' : '94a3b8' } };\n      cellB.alignment = { horizontal: 'center', vertical: 'middle' };\n      cellB.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bgColor } };\n      cellB.border = borderAll;\n\n      const cellC = itemRow.getCell(3);\n      cellC.value = item.title;\n      cellC.font = { name: 'Arial', size: 11, bold: false, color: { argb: isDone ? '94a3b8' : DARK_NAVY }, strike: isDone };\n      cellC.alignment = { vertical: 'middle', wrapText: true };\n      cellC.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bgColor } };\n      cellC.border = borderAll;\n\n      const cellD = itemRow.getCell(4);\n      cellD.value = item.detail;\n      cellD.font = { name: 'Arial', size: 10, color: { argb: isDone ? 'cbd5e1' : '7a8ea0' } };\n      cellD.alignment = { vertical: 'middle', wrapText: true };\n      cellD.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bgColor } };\n      cellD.border = borderAll;\n\n      const cellE = itemRow.getCell(5);\n      const pLabel = item.priority === 'critical' ? 'CRITICAL' : item.priority === 'important' ? 'IMPORTANT' : 'NICE TO HAVE';\n      cellE.value = pLabel;\n      const pColor = item.priority === 'critical' ? CRITICAL_RED : item.priority === 'important' ? IMPORTANT_AMBER : NICE_BLUE;\n      const pBg = item.priority === 'critical' ? CRITICAL_BG : item.priority === 'important' ? IMPORTANT_BG : NICE_BG;\n      cellE.font = { name: 'Arial', size: 9, bold: true, color: { argb: pColor } };\n      cellE.alignment = { horizontal: 'center', vertical: 'middle' };\n      cellE.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: pBg } };\n      cellE.border = borderAll;\n\n      const cellF = itemRow.getCell(6);\n      cellF.value = isDone ? 'Done' : 'Pending';\n      cellF.font = { name: 'Arial', size: 10, bold: isDone, color: { argb: isDone ? '16a34a' : '94a3b8' } };\n      cellF.alignment = { horizontal: 'center', vertical: 'middle' };\n      cellF.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: isDone ? 'edfcf0' : bgColor } };\n      cellF.border = borderAll;\n\n      const cellG = itemRow.getCell(7);\n      cellG.value = item.tool || '\u2014';\n      cellG.font = { name: 'Arial', size: 10, color: { argb: item.tool ? '15803d' : 'cbd5e1' } };\n      cellG.alignment = { vertical: 'middle', wrapText: true };\n      cellG.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bgColor } };\n      cellG.border = borderAll;\n\n      ws.getRow(row).height = item.detail.length > 60 ? 36 : 26;\n    });\n    row++;\n    ws.getRow(row).height = 8;\n  }\n\n  row += 2;\n  ws.mergeCells(`A${row}:G${row}`);\n  const footerCell = ws.getCell(`A${row}`);\n  footerCell.value = 'Generated by Digital Nomads HQ  \u2022  digitalnomadshq.com.au';\n  footerCell.font = { name: 'Arial', size: 9, italic: true, color: { argb: '7a8ea0' } };\n  footerCell.alignment = { horizontal: 'center', vertical: 'middle' };\n\n  const buffer = await wb.xlsx.writeBuffer();\n  const blob = new Blob([buffer], { type: 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\n  saveAs(blob, 'website-migration-checklist.xlsx');\n}\n<\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a35121 elementor-widget elementor-widget-heading\" data-id=\"0a35121\" data-element_type=\"widget\" id=\"heading3\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Pre-Migration: Get Your House in Order<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fc28ce7 elementor-widget elementor-widget-text-editor\" data-id=\"fc28ce7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>This is where 90% of migration success is decided. Skip the planning and you&#8217;ll be firefighting for months.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cdfa8a0 elementor-widget elementor-widget-heading\" data-id=\"cdfa8a0\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">1. Back Up Everything<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-60da992 elementor-widget elementor-widget-text-editor\" data-id=\"60da992\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>This one&#8217;s non-negotiable. Before you touch anything, <strong>take a complete backup of your website<\/strong>. That means your database, files, media, plugins, themes&#8230; the lot. If something goes sideways during migration, this backup is your safety net.<\/p><p>If you&#8217;re on WordPress, tools like UpdraftPlus or All-in-One WP Migration make this pretty painless. For other platforms, check with your hosting provider or development team.<\/p><p><u><strong>EXPERT TIP:<\/strong> Store your backup somewhere separate from your current hosting environment. If the server goes down during migration, you don&#8217;t want your backup sitting on the same server.<\/u><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-647b669 elementor-widget elementor-widget-heading\" data-id=\"647b669\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">2. Crawl and Audit Your Existing Site<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3bdedaf elementor-widget elementor-widget-text-editor\" data-id=\"3bdedaf\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>You can&#8217;t migrate what you don&#8217;t understand. Run a full crawl of your current site using a tool like Screaming Frog, Sitebulb, or Semrush&#8217;s Site Audit.<\/p><p>What you&#8217;re looking for:<\/p><p><strong>A complete list of all URLs<\/strong> (pages, posts, images, PDFs&#8230; everything currently indexed). Any existing broken links, redirect chains, or crawl errors. Your current site structure and internal linking patterns. Pages that are already performing well in search engines (you <em>really<\/em> don&#8217;t want to lose these).<\/p><p>This crawl data becomes your migration map. It tells you exactly which pages need redirects, which URLs are changing, and where the SEO value lives on your current site.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7a99031 elementor-widget elementor-widget-image\" data-id=\"7a99031\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"382\" src=\"https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Screaming-Frog-URL-Example-1024x489.png\" class=\"attachment-large size-large wp-image-42617\" alt=\"\" srcset=\"https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Screaming-Frog-URL-Example-1024x489.png 1024w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Screaming-Frog-URL-Example-300x143.png 300w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Screaming-Frog-URL-Example-768x367.png 768w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Screaming-Frog-URL-Example-1536x733.png 1536w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Screaming-Frog-URL-Example-2048x978.png 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Here's an example of Screaming Frogs URL Crawl - All URLS Exported<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f7c3119 elementor-widget elementor-widget-heading\" data-id=\"f7c3119\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">3. Plan Your Redirects (Yes, All of Them)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a22a315 elementor-widget elementor-widget-text-editor\" data-id=\"a22a315\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>If your URLs are changing, <strong>you need a 301 redirect plan. Every. Single. Page.<\/strong><\/p><p>We have seen too many websites get redeveloped with the lack of urgency and planning on page redirects. One company I recently assessed lost 60% of their organic traffic in the first 6 months of their new website going live! Not great for business.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9785898 elementor-widget elementor-widget-image\" data-id=\"9785898\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"336\" src=\"https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Client-Losing-60-organic-traffic-1024x430.png\" class=\"attachment-large size-large wp-image-42612\" alt=\"Client Losing 60% organic traffic\" srcset=\"https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Client-Losing-60-organic-traffic-1024x430.png 1024w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Client-Losing-60-organic-traffic-300x126.png 300w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Client-Losing-60-organic-traffic-768x323.png 768w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Client-Losing-60-organic-traffic-1536x645.png 1536w, https:\/\/digitalnomadshq.com.au\/wp-content\/uploads\/2026\/03\/Client-Losing-60-organic-traffic.png 1576w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Business lost 60% of organic traffic.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e66173 elementor-widget elementor-widget-text-editor\" data-id=\"4e66173\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A 301 redirect tells search engines, &#8220;This page has permanently moved here.&#8221; Without them, Google sees your new pages as brand new content and your old pages as dead links. That means lost rankings, lost link equity, and a whole lot of 404 errors.<\/p><p>Here&#8217;s how to approach it:<\/p><p>Map every old URL to its new URL in a spreadsheet. Prioritise your highest-traffic pages and pages with strong backlink profiles. Don&#8217;t redirect everything to the homepage. That&#8217;s lazy, and Google knows it. Test your redirects in a staging environment before going live.<\/p><p><strong>PRO TIP:<\/strong> Let&#8217;s say you&#8217;ve got 500 pages on your current site. If even 20% of those are generating organic traffic, that&#8217;s 100 pages where broken redirects could cost you real business. Map them properly. No shortcuts.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2ce85ca elementor-widget elementor-widget-heading\" data-id=\"2ce85ca\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">4. Set Up a Staging Environment<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-67fad1a elementor-widget elementor-widget-text-editor\" data-id=\"67fad1a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Never migrate straight to your live site. Set up a staging environment where you can build, test, and troubleshoot your new site without affecting your live performance.<\/p><p>Make sure your staging site is blocked from search engines (via robots.txt or password protection). The last thing you need is Google indexing a half-finished version of your new site.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-abb7050 elementor-widget elementor-widget-heading\" data-id=\"abb7050\" data-element_type=\"widget\" id=\"heading4\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">During Migration: Execute the Plan<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-15cd5db elementor-widget elementor-widget-heading\" data-id=\"15cd5db\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">5. Implement Your Redirects<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e64dec elementor-widget elementor-widget-text-editor\" data-id=\"3e64dec\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>With your redirect map ready, it&#8217;s time to implement. Depending on your platform and server, this might be done via .htaccess files, server-level redirects, or a WordPress plugin like Redirection or Rank Math &#8211; As an agency we use Rankmath Pro, we find this most effective for redirects along with additional SEO benefits for scalable implementations.<\/p><p>Double-check every redirect. A single wrong redirect can create chains, loops, or send users to the wrong pages. <strong>Test, test, test.<\/strong><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c377968 elementor-widget elementor-widget-heading\" data-id=\"c377968\" data-element_type=\"widget\" id=\"heading5\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">6. Check Your On-Page SEO<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c64b84f elementor-widget elementor-widget-text-editor\" data-id=\"c64b84f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>During the migration, make sure your on-page SEO elements have carried across:<\/p><p>Title tags and meta descriptions. Header tags (H1, H2, H3 structure). Image alt text. Internal links (update any that point to old URLs). Canonical tags pointing to the correct new URLs. Schema markup and structured data.<\/p><p>It&#8217;s easy to lose these in a redesign, especially if your new site has a different content structure. Don&#8217;t assume your development team has handled this. Check it yourself.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce08ef5 elementor-widget elementor-widget-heading\" data-id=\"ce08ef5\" data-element_type=\"widget\" id=\"heading6\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">7. Update Your XML Sitemap<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-455e818 elementor-widget elementor-widget-text-editor\" data-id=\"455e818\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Generate a new <a href=\"https:\/\/digitalnomadshq.com.au\/blog\/what-is-a-sitemap\/\">XML sitemap<\/a> reflecting your updated site structure and submit it to Google Search Console. This helps search engines crawl and index your new pages faster.<\/p><p>While you&#8217;re at it, review your robots.txt file. Make sure it&#8217;s not accidentally blocking important pages on the new site.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6b73708 elementor-widget elementor-widget-heading\" data-id=\"6b73708\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Post-Migration: Monitor and Fix<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c7828b5 elementor-widget elementor-widget-text-editor\" data-id=\"c7828b5\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The migration isn&#8217;t done when the new site goes live. In fact, this is where the real work starts.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-01330f2 elementor-widget elementor-widget-heading\" data-id=\"01330f2\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">8. Run a Full Post-Migration Crawl<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-59b3609 elementor-widget elementor-widget-text-editor\" data-id=\"59b3609\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Crawl your new site immediately after launch. Compare it against your pre-migration crawl data. You&#8217;re looking for:<\/p><p>Any pages returning 404 errors. Redirect issues (chains, loops, incorrect destinations). Missing or duplicate meta data. Broken internal or external links. Changes in page count (did pages go missing?).<\/p><p><strong>EXPERT TIP:<\/strong> Don&#8217;t just check once and walk away. Crawl again at 48 hours, one week, and one month post-migration. Issues can surface over time as Google re-crawls your site.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-31b3148 elementor-widget elementor-widget-heading\" data-id=\"31b3148\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">9. Monitor Your SEO Performance<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d39dec1 elementor-widget elementor-widget-text-editor\" data-id=\"d39dec1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Keep a close eye on Google Search Console in the weeks following migration. Watch for:<\/p><p>Indexing issues or coverage errors. Drops in impressions or clicks for key pages. Crawl errors flagged by Google. Any manual actions or security issues.<\/p><p>It&#8217;s normal to see a small dip in performance right after a site migration. Google needs time to process the changes. But if you&#8217;re seeing significant drops that don&#8217;t recover within 2 to 4 weeks&#8230; something&#8217;s gone wrong with your redirects, indexing, or site structure.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-107a21f elementor-widget elementor-widget-heading\" data-id=\"107a21f\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">10. Test Everything a Real User Would<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c545773 elementor-widget elementor-widget-text-editor\" data-id=\"c545773\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>This one gets overlooked more than it should. Walk through your new site like a customer would. Test your forms, check your checkout flow, click through your navigation, test on mobile, check page load speeds.<\/p><p>A technically perfect migration means nothing if the site doesn&#8217;t actually <em>work<\/em> for the people using it.<\/p><p><strong>PRO TIP:<\/strong> Use Google PageSpeed Insights and run a Lighthouse audit on your key pages post-migration. Performance issues on the new site (slow load times, layout shifts) can hurt rankings just as much as broken redirects.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-235d18e elementor-widget elementor-widget-heading\" data-id=\"235d18e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">11. Update External Links and Listings<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-71c1d57 elementor-widget elementor-widget-text-editor\" data-id=\"71c1d57\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>If your domain or URL structure has changed, don&#8217;t forget the links you <em>don&#8217;t<\/em> control. Update your Google Business Profile, social media profiles, directory listings, and reach out to sites linking to your old URLs where possible.<\/p><p>Yes, your redirects will catch most of this traffic. But direct links to the new URLs are always stronger for SEO than relying on redirects long-term.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cedba5a elementor-widget elementor-widget-heading\" data-id=\"cedba5a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">The Bottom Line<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-96b6630 elementor-widget elementor-widget-text-editor\" data-id=\"96b6630\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A website migration doesn&#8217;t have to be a disaster. With proper planning, a thorough redirect strategy, and careful post-migration monitoring, you can move your site to a new domain, platform, or hosting provider without losing the SEO performance you&#8217;ve built.<\/p><p><strong>The biggest mistakes we see? Rushed timelines, incomplete redirect maps, and no post-migration monitoring plan.<\/strong> Don&#8217;t be that business.<\/p><p>If you&#8217;re planning a site migration and want expert eyes on the strategy, <strong>we&#8217;re here to help.<\/strong> At Digital Nomads HQ, we&#8217;ve managed migrations across every platform and industry. We know where things go wrong, and more importantly, how to make sure they don&#8217;t.<\/p><p><strong>Let&#8217;s talk.<\/strong><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d76987f e-flex e-con-boxed e-con e-parent\" data-id=\"d76987f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Planning a website migration? Use our step-by-step checklist to protect your SEO rankings, avoid data loss, and nail every stage of the process. From backups to redirects to post-migration testing.<\/p>\n","protected":false},"author":2,"featured_media":42616,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[71],"tags":[72],"class_list":["post-42611","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo","tag-seo"],"acf":[],"_links":{"self":[{"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/posts\/42611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/comments?post=42611"}],"version-history":[{"count":10,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/posts\/42611\/revisions"}],"predecessor-version":[{"id":42624,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/posts\/42611\/revisions\/42624"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/media\/42616"}],"wp:attachment":[{"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/media?parent=42611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/categories?post=42611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalnomadshq.com.au\/wp-json\/wp\/v2\/tags?post=42611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}