Site Migration SEO for Vue Apps · Nuxt SEO

[NuxtSEO](https://nuxtseo.com/ "Home")

- [Modules](https://nuxtseo.com/docs/nuxt-seo/getting-started/introduction)
- [Tools](https://nuxtseo.com/tools)
- [Pro](https://nuxtseo.com/pro)
- [Learn SEO](https://nuxtseo.com/learn-seo/nuxt) [Releases](https://nuxtseo.com/releases)

[1.4K](https://github.com/harlan-zw/nuxt-seo)

[Nuxt SEO on GitHub](https://github.com/harlan-zw/nuxt-seo)

Learn SEO

Master search optimization

Nuxt

 Vue

[SEO Checklist](https://nuxtseo.com/learn-seo/checklist) [Pre-Launch Warmup](https://nuxtseo.com/learn-seo/pre-launch-warmup) [Backlinks & Authority](https://nuxtseo.com/learn-seo/backlinks)

[Mastering Meta](https://nuxtseo.com/learn-seo/vue/mastering-meta)

- [Titles](https://nuxtseo.com/learn-seo/vue/mastering-meta/titles)
- [Meta Description](https://nuxtseo.com/learn-seo/vue/mastering-meta/descriptions)
- [Social Sharing](https://nuxtseo.com/learn-seo/vue/mastering-meta/social-sharing)
- [Schema.org](https://nuxtseo.com/learn-seo/vue/mastering-meta/schema-org)
- [Migrating vue-meta](https://nuxtseo.com/learn-seo/vue/mastering-meta/migrating-vue-meta)
- [Rich Results](https://nuxtseo.com/learn-seo/vue/mastering-meta/rich-results)
- [Image Alt Text](https://nuxtseo.com/learn-seo/vue/mastering-meta/alt-text)

[ Controlling Crawlers](https://nuxtseo.com/learn-seo/vue/controlling-crawlers)

- [Robots.txt](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/robots-txt)
- [Sitemaps](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/sitemaps)
- [Robot Meta Tag](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/meta-tags)
- [Canonical Link Tag](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/canonical-urls)
- [HTTP Redirects](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/redirects)
- [Duplicate Content](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/duplicate-content)
- [llms.txt](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/llms-txt)

[ SPA SEO](https://nuxtseo.com/learn-seo/vue/spa)

- [Prerendering](https://nuxtseo.com/learn-seo/vue/spa/prerendering)
- [Dynamic Rendering](https://nuxtseo.com/learn-seo/vue/spa/dynamic-rendering)
- [Hydration & SEO](https://nuxtseo.com/learn-seo/vue/spa/hydration)

[ Routes & Rendering](https://nuxtseo.com/learn-seo/vue/routes-and-rendering)

- [URL Structure](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/url-structure)
- [Pagination](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/pagination)
- [Trailing Slashes](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/trailing-slashes)
- [Query Parameters](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/query-parameters)
- [Hreflang & i18n](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/i18n)
- [404 Pages](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/404-pages)
- [Dynamic Routes](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/dynamic-routes)
- [Internal Linking](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/internal-linking)
- [Rendering Modes](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/rendering)
- [Programmatic SEO](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/programmatic-seo)
- [Security](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/security)

[ SSR Frameworks](https://nuxtseo.com/learn-seo/vue/ssr-frameworks)

- [Nuxt vs Quasar](https://nuxtseo.com/learn-seo/vue/ssr-frameworks/nuxt-vs-quasar)
- [Custom Vite SSR](https://nuxtseo.com/learn-seo/vue/ssr-frameworks/vite-ssr)
- [VitePress SEO](https://nuxtseo.com/learn-seo/vue/ssr-frameworks/vitepress)

[ Launch & Listen](https://nuxtseo.com/learn-seo/vue/launch-and-listen)

- [Getting Indexed](https://nuxtseo.com/learn-seo/vue/launch-and-listen/going-live)
- [Google Search Console](https://nuxtseo.com/learn-seo/vue/launch-and-listen/search-console)
- [Core Web Vitals](https://nuxtseo.com/learn-seo/vue/launch-and-listen/core-web-vitals)
- [Indexing Issues](https://nuxtseo.com/learn-seo/vue/launch-and-listen/indexing-issues)
- [SEO Monitoring](https://nuxtseo.com/learn-seo/vue/launch-and-listen/seo-monitoring)
- [Site Migration](https://nuxtseo.com/learn-seo/vue/launch-and-listen/site-migration)
- [IndexNow](https://nuxtseo.com/learn-seo/vue/launch-and-listen/indexnow)
- [Debugging](https://nuxtseo.com/learn-seo/vue/launch-and-listen/debugging)
- [AI Search Optimization](https://nuxtseo.com/learn-seo/vue/launch-and-listen/ai-optimized-content)

1. [Learn SEO for Vue](https://nuxtseo.com/learn-seo)
2.
3. [Launch And Listen](https://nuxtseo.com/learn-seo/vue/launch-and-listen)
4.
5. [Site Migration](https://nuxtseo.com/learn-seo/vue/launch-and-listen/site-migration)

# Site Migration SEO for Vue Apps

Migrate domains, redesign URLs, or switch frameworks without losing search rankings.

[![Harlan Wilton](https://avatars.githubusercontent.com/u/5326365?v=4)Harlan Wilton](https://x.com/harlan-zw)12 mins read Published Dec 17, 2025 Updated Jan 29, 2026

What you'll learn

- Well-executed migrations recover 90-95% of traffic within 30 days
- Create 1:1 URL mapping spreadsheet before touching production
- Keep redirects for at least one year. longer if they still get hits

Site migrations lose search rankings when done wrong. [Well-executed migrations recover 90-95% of traffic within 30 days](https://www.matthewedgar.net/how-long-keep-redirects/). Poor migrations can take 6-12 months to recover or never reach previous levels.

The difference is planning, proper redirects, and post-migration monitoring.

## [Types of Migrations](#types-of-migrations)

Each migration type affects SEO differently:

![Migration Decision Tree](https://nuxtseo.com/images/learn-seo/vue/migration-decision-tree.svg)

**Domain change** (old.com → new.com): Requires [Change of Address tool in Google Search Console](https://support.google.com/webmasters/answer/9370220) and strict 1:1 URL mapping. Keep redirects for [at least one year](https://www.searchenginejournal.com/google-keep-301-redirects-in-place-for-a-year/428998/).

**Protocol change** (HTTP → HTTPS): Update all canonical tags to HTTPS versions. Forgetting this creates redirect loops. redirects send Google to HTTPS, but canonicals point back to HTTP.

**URL structure change** (/blog/post → /posts/post): Most prone to redirect chains. Map every old URL to exactly one new URL. No intermediates.

**Platform/framework change**: Moving from WordPress to Vue, or Vue to Nuxt. URL structure usually changes. Full redirect mapping required.

**Site redesign with same URLs**: Lowest risk if URLs stay identical. Still validate canonical tags and internal links.

## [Pre-Migration Checklist](#pre-migration-checklist)

Start here before touching production:

1. **Crawl old site completely**: Use [Screaming Frog](https://screamingfrog.co.uk) or similar to export all URLs. You need a full inventory.
2. **Export indexed URLs from Search Console**: Go to Coverage report → Valid → Export. These are URLs Google knows about.
3. **Document current rankings**: Screenshot Search Console Performance for top pages. You'll compare against this.
4. **Create redirect mapping spreadsheet**: Three columns: Old URL | New URL | Status (200, 301, 410). Map every single URL. No exceptions.

For large sites (10,000+ pages), consider [migrating in sections](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes). Test with a small section first, verify traffic holds, then migrate the rest.

## [Redirect Mapping Strategy](#redirect-mapping-strategy)

Mapping is where migrations succeed or fail.

**1:1 mapping** (preferred): Each old URL redirects to exactly one new URL with identical or similar content.

```
/blog/vue-seo-guide → /guides/vue-seo
/products/item-123 → /products/item-123 (unchanged)
```

**Pattern-based redirects**: For systematic URL changes. Use regex or route patterns to redirect entire sections.

```
/blog/:slug → /articles/:slug
/category/:cat/page/:num → /c/:cat?page=:num
```

**Deleted pages**: Don't 404 pages that had traffic or backlinks. Redirect to the most relevant alternative. If truly no alternative exists, return 410 (Gone) instead of 404. signals permanent removal.

## [Implementing Redirects in Vue](#implementing-redirects-in-vue)

SEO requires server-side redirects. Client-side redirects (JavaScript) don't pass PageRank.

### [Express Server](#express-server)

```
import express from 'express'

const app = express()

// Single redirect
app.get('/old-url', (req, res) => {
  res.redirect(301, '/new-url')
})

// Pattern redirect
app.get('/blog/:slug', (req, res) => {
  res.redirect(301, \`/posts/${req.params.slug}\`)
})

// Redirect map for bulk redirects
const redirects = {
  '/old-page-1': '/new-page-1',
  '/old-page-2': '/new-page-2',
  '/company/about': '/about'
}

app.use((req, res, next) => {
  const redirect = redirects[req.path]
  if (redirect) {
    return res.redirect(301, redirect)
  }
  next()
})
```

### [Vite Server](#vite-server)

```
// vite.config.ts
import { defineConfig } from 'vite'

export default defineConfig({
  server: {
    middleware: [
      (req, res, next) => {
        const redirects = {
          '/old-path': '/new-path',
          '/blog': '/posts'
        }

        const redirect = redirects[req.url]
        if (redirect) {
          res.writeHead(301, { Location: redirect })
          res.end()
          return
        }
        next()
      }
    ]
  }
})
```

### [H3 Server (Nitro/Nuxt)](#h3-server-nitronuxt)

```
// server/middleware/redirects.ts
import { defineEventHandler, sendRedirect } from 'h3'

const redirects = {
  '/old-url': '/new-url',
  '/blog': '/posts'
}

export default defineEventHandler((event) => {
  const redirect = redirects[event.path]
  if (redirect) {
    return sendRedirect(event, redirect, 301)
  }
})
```

For large redirect maps (1000+ URLs), load from JSON file:

```
import redirectData from './redirects.json'

export default defineEventHandler((event) => {
  const redirect = redirectData[event.path]
  if (redirect) {
    return sendRedirect(event, redirect, 301)
  }
})
```

## [Avoid Redirect Chains](#avoid-redirect-chains)

[Redirect chains](https://netpeaksoftware.com/blog/top-10-site-migration-mistakes) happen when URL A redirects to B, which redirects to C. This dilutes PageRank and slows crawling.

Common scenario: You have old redirects (A → B) and add new migration redirects (B → C). Result: chain A → B → C.

Fix: Update all redirects to point directly to final destination. Consolidate old and new redirects into single-hop redirects.

```
// Bad: creates chain
// Old redirect: /page-v1 → /page-v2
// New redirect: /page-v2 → /page-v3
// Result: /page-v1 → /page-v2 → /page-v3

// Good: consolidate
const redirects = {
  '/page-v1': '/page-v3', // direct to final
  '/page-v2': '/page-v3'
}
```

Test redirects before launch: Each should return 301 status and resolve in one hop to 200 (OK).

## [Update Canonical Tags](#update-canonical-tags)

When URLs change, canonical tags must point to new URLs. [Canonical pointing to redirect](https://sitechecker.pro/site-audit-issues/canonical-points-redirect/) is a common migration mistake.

After migration, canonical tags should reference new URL structure:

```
<!-- Bad: canonical points to old URL -->
<link rel="canonical" href="https://example.com/old-url">

<!-- Good: canonical points to new URL -->
<link rel="canonical" href="https://example.com/new-url">
```

In Vue with Unhead:

```
useHead({
  link: [
    { rel: 'canonical', href: 'https://example.com/new-url' }
  ]
})
```

Scan staging site before launch to verify all canonicals point to new URLs, not old ones.

## [Post-Migration Steps](#post-migration-steps)

The hour after migration is critical.

1. **Update Search Console property**: For domain changes, use [Change of Address tool](https://support.google.com/webmasters/answer/9370220). This tells Google you've moved.
2. **Submit new sitemap**: Generate sitemap with new URLs. Submit in Search Console. Remove old sitemap from robots.txt.
3. **Request indexing of key pages**: In Search Console, request indexing for homepage and top 10-20 pages. Speeds up discovery.
4. **Monitor coverage report**: Check daily for errors. Look for 404s, soft 404s, redirect errors, or pages not followed.
5. **Watch server capacity**: [Google crawls more after migrations](https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes). Redirects from old URLs trigger crawls of new URLs. Monitor server load.
6. **Check Analytics segmentation**: Set up date comparison in Google Analytics. before migration vs after. Track organic traffic specifically.

Ensure your redirects also work for AI crawlers like `GPTBot` and `PerplexityBot`. If they encounter loops or errors, you'll lose your citations in AI search results as you lose rankings in Google.

## [Recovery Timeline](#recovery-timeline)

![Migration Recovery Timeline](https://nuxtseo.com/images/learn-seo/vue/migration-recovery-gantt.svg)

Expect these phases:

**Week 1-2**: Traffic dip of [10-25% is normal](https://moz.com/blog/website-migration-guide). Google discovers redirects and starts reindexing.

**Week 3-4**: [Small sites recover](https://www.searchenginejournal.com/website-migration-guide/369728/) 90%+ of traffic if migration was clean. Large sites still reindexing.

**Month 2-3**: Most sites reach full recovery. Rankings stabilize. [Typical range is 30-60 days](https://www.localseoguide.com/how-long-does-it-take-to-recover-from-a-domain-migration/).

**Month 4-6**: Large sites (100,000+ pages) continue recovery. [Average across 892 migrations was 523 days](https://www.searchenginejournal.com/site-migration-study-data/484555/). but median is much lower.

**Keep redirects for 1+ year**: [Google recommends at least 12 months](https://www.searchenginejournal.com/google-keep-301-redirects-in-place-for-a-year/428998/). Longer if you still see traffic to old URLs. Never remove redirects that still get hits.

If traffic hasn't recovered after 3 months, audit for:

- Missing redirects (404s in coverage report)
- Redirect chains
- Canonical tags still pointing to old URLs
- Internal links still pointing to old URLs

## [Common Migration Mistakes](#common-migration-mistakes)

**Redirect chains**: As mentioned, these dilute authority. [Consolidate old and new redirects](https://developers.google.com/search/docs/crawling-indexing/301-redirects) into single-hop redirects.

**Forgetting internal links**: Your site's internal links still point to old URLs, triggering unnecessary redirects. Update internal links to point directly to new URLs.

**Not updating canonical URLs**: Canonical tags create loops when they point to redirected URLs. [Update canonicals alongside redirects](https://web.dev/articles/canonicalization).

**Removing redirects too early**: Traffic sources outside your control (old backlinks, bookmarks, third-party sites) use old URLs indefinitely. Keep redirects for years, not months.

**Client-side redirects**: JavaScript redirects (`window.location`) don't pass PageRank. Google may not follow them. SEO requires server-side 301s.

**No redirect testing**: Test redirects on staging before launch. Verify each returns 301 and resolves to 200 in one hop.

**Forgetting mobile/AMP URLs**: If you had separate mobile URLs (m.example.com) or AMP versions, redirect those too.

## [Using Nuxt?](#using-nuxt)

Nuxt applications should use [server middleware for redirects](https://nuxtseo.com/learn-seo/nuxt/controlling-crawlers/redirects).

For full Nuxt migration guides, see [Launch & Listen section](https://nuxtseo.com/learn-seo/nuxt/launch-and-listen).

Site Migration Checklist

- Crawl old site and export all URLs
- Export indexed URLs from Search Console Coverage report
- Create redirect mapping spreadsheet (Old URL → New URL)
- Implement server-side 301 redirects (not client-side)
- Update all canonical tags to new URLs
- Update internal links to point directly to new URLs
- Submit new sitemap and remove old one
- Use Change of Address tool (for domain changes)
- Monitor Coverage report daily for first 2 weeks
- Keep redirects active for at least 1 year

[The 2026 SEO Checklist for Nuxt & Vue Pre-launch setup, post-launch verification, and ongoing monitoring. Interactive checklist with links to every guide.](https://nuxtseo.com/learn-seo/checklist)

---

[SEO Monitoring Set up analytics, rank tracking, and alerts to monitor your Vue site's search performance.](https://nuxtseo.com/learn-seo/vue/launch-and-listen/seo-monitoring) [IndexNow Notify search engines instantly when content changes using IndexNow, Google Indexing API, and RequestIndexing.](https://nuxtseo.com/learn-seo/vue/launch-and-listen/indexnow)

On this page

- [Types of Migrations](#types-of-migrations)
- [Pre-Migration Checklist](#pre-migration-checklist)
- [Redirect Mapping Strategy](#redirect-mapping-strategy)
- [Implementing Redirects in Vue](#implementing-redirects-in-vue)
- [Avoid Redirect Chains](#avoid-redirect-chains)
- [Update Canonical Tags](#update-canonical-tags)
- [Post-Migration Steps](#post-migration-steps)
- [Recovery Timeline](#recovery-timeline)
- [Common Migration Mistakes](#common-migration-mistakes)
- [Using Nuxt?](#using-nuxt)

[GitHub](https://github.com/harlan-zw/nuxt-seo) [ Discord](https://discord.com/invite/275MBUBvgP)

### [NuxtSEO](https://nuxtseo.com/ "Home")

- [Getting Started](https://nuxtseo.com/docs/nuxt-seo/getting-started/introduction)
- [MCP](https://nuxtseo.com/docs/nuxt-seo/guides/mcp)

Modules

- [Robots](https://nuxtseo.com/docs/robots/getting-started/introduction)
- [Sitemap](https://nuxtseo.com/docs/sitemap/getting-started/introduction)
- [OG Image](https://nuxtseo.com/docs/og-image/getting-started/introduction)
- [Schema.org](https://nuxtseo.com/docs/schema-org/getting-started/introduction)
- [Link Checker](https://nuxtseo.com/docs/link-checker/getting-started/introduction)
- [SEO Utils](https://nuxtseo.com/docs/seo-utils/getting-started/introduction)
- [Site Config](https://nuxtseo.com/docs/site-config/getting-started/introduction)
- [Skew Protection](https://nuxtseo.com/docs/skew-protection/getting-started/introduction)
- [AI Ready](https://nuxtseo.com/docs/ai-ready/getting-started/introduction)

### [NuxtSEO Pro](https://nuxtseo.com/pro "Home")

- [Getting Started](https://nuxtseo.com/pro)
- [Dashboard](https://nuxtseo.com/pro/dashboard)
- [Pro MCP](https://nuxtseo.com/docs/nuxt-seo-pro/mcp/installation)

### [Learn SEO](https://nuxtseo.com/learn-seo "Learn SEO")

Nuxt

- [Mastering Meta](https://nuxtseo.com/learn-seo/nuxt/mastering-meta)
- [Controlling Crawlers](https://nuxtseo.com/learn-seo/nuxt/controlling-crawlers)
- [Launch & Listen](https://nuxtseo.com/learn-seo/nuxt/launch-and-listen)
- [Routes & Rendering](https://nuxtseo.com/learn-seo/nuxt/routes-and-rendering)
- [Staying Secure](https://nuxtseo.com/learn-seo/nuxt/routes-and-rendering/security)

Vue

- [Vue SEO Guide](https://nuxtseo.com/learn-seo/vue)
- [Mastering Meta](https://nuxtseo.com/learn-seo/vue/mastering-meta)
- [Controlling Crawlers](https://nuxtseo.com/learn-seo/vue/controlling-crawlers)
- [SPA SEO](https://nuxtseo.com/learn-seo/vue/spa)
- [SSR Frameworks](https://nuxtseo.com/learn-seo/vue/ssr-frameworks)
- [SEO Checklist](https://nuxtseo.com/learn-seo/checklist)
- [Pre-Launch Warmup](https://nuxtseo.com/learn-seo/pre-launch-warmup)
- [Backlinks & Authority](https://nuxtseo.com/learn-seo/backlinks)

### [Tools](https://nuxtseo.com/tools "SEO Tools")

- [Social Share Debugger](https://nuxtseo.com/tools/social-share-debugger)
- [Robots.txt Generator](https://nuxtseo.com/tools/robots-txt-generator)
- [Meta Tag Checker](https://nuxtseo.com/tools/meta-tag-checker)
- [HTML to Markdown](https://nuxtseo.com/tools/html-to-markdown)
- [XML Sitemap Validator](https://nuxtseo.com/tools/xml-sitemap-validator)
- [Schema.org Validator](https://nuxtseo.com/tools/schema-validator)
- [Keyword Idea Generator](https://nuxtseo.com/tools/keyword-generator)
- [Keyword Research](https://nuxtseo.com/tools/keyword-research)
- [SERP Analyzer](https://nuxtseo.com/tools/serp-analyzer)
- [Domain Rankings](https://nuxtseo.com/tools/domain-rankings)

Copyright © 2023-2026 Harlan Wilton - [MIT License](https://github.com/harlan-zw/nuxt-seo/blob/main/license) · [mdream](https://mdream.dev)