Blog

Migrating your website without losing your search visibility

The risk sits in your addresses, not your technology.

How to run a migration without losing rankings, with attention to redirects, markup and load times.


Website migreren zonder SEO-verlies

The biggest risk in a migration sits in your addresses, not in your technology.
A new CMS, different hosting or a new theme costs you no rankings by itself, as long as your addresses, your markup and your load times move with it.
That only goes wrong when a page that sat at the same address for years suddenly lives elsewhere, with nothing connecting the two.
That last part is manual work and the one part of a migration you cannot fix afterwards.

For many Drupal sites, that is exactly what's happening now.
Drupal 10 reaches end of life on 9 December 2026 and 10.6.0 is the last minor release, Drupal 7 has been out of support since 5 January 2025 and Drupal 12 arrives in the week of 7 December 2026.
Anyone migrating this winter is doing it under time pressure, and the redirect plan is usually the first thing to suffer.

The URL inventory comes before everything else

You start with a list of every address that exists today, not the pages you want to keep.
The addresses that bring in traffic are rarely the ones in your menu: a 2019 press release with twenty inbound links carries more weight than your new services page.
Five sources together give you the full picture.

Source What it gives you
XML sitemap What your site thinks it publishes, usually only the pages you want indexed
Full crawl Everything linked internally, including pagination, facets, feeds and PDFs
Search Console, Pages and Performance reports What Google actually knows (Pages report, around three months of history) and which addresses generate clicks (Performance report, sixteen months back)
Server logs Addresses still being requested but no longer linked anywhere
Backlink data External links to pages you had forgotten about yourself

For each address you record status code, canonical, indexability, inbound links and twelve months of traffic.
Don't forget the non-HTML addresses: images, PDFs, feeds and language variants have one too.
Export your indexing data yourself before the migration, because that history is gone afterwards.
This list is your baseline.

The redirect plan: one 301 per old address

Every old address gets exactly one 301 to the closest matching new address.
A 301 tells search engines and AI crawlers that the move is permanent and that the accumulated signals should transfer with it.
A 302 says it's temporary: Google follows it, but doesn't use it as a signal that the new address should become canonical, so for now the old address stays canonical.
Leave that 302 in place long enough and Google usually treats it as permanent anyway, but that costs weeks you don't lose with a 301.

The mapping is a table with three columns: old address, new address and why.
That third column looks unnecessary until someone later asks why three pages were merged into one.
If there's no reasonable equivalent, a 410 is more honest than a redirect to something the visitor wasn't looking for.

In Drupal, the Redirect module handles this and the Migrate API carries over existing path aliases.
At large volumes, the rules belong at web server or CDN level, outside PHP.

What not to do

Four mistakes do most of the damage and all four cost nothing to avoid.

  • Redirecting everything to the homepage. Google treats a mass redirect like that as a soft 404, so you lose exactly the signals you thought you were keeping.
  • Building redirect chains. Every hop costs time and at some point the chain simply stops working.
    Keep it to one hop and update your internal links to the final destination.
  • Carrying the staging environment over. A robots.txt that blocks everything, a noindex in the meta tags or a canonical pointing to your staging domain: the three classic reasons a site drops out of the index after launch.
  • Thinking about redirects only after launch. Then you miss exactly the addresses you didn't know existed, because they aren't in the new CMS.

Checking after launch: status codes, canonicals, sitemap, structured data

On launch day you check four things.
Crawl your full old address list and check that every address lands on a 200 with one hop.
Check that every canonical points to itself, on the right domain and protocol.
The sitemap contains only addresses that return 200, no redirects and no noindex, and your robots.txt points to the right file.

Structured data is the fourth check and the one most often skipped.
Your schema.org markup sits in your theme or in your Metatag configuration, so with a new theme that markup is new and untested.
Watch the properties that hold an address themselves: @id, url, logo and sameAs surprisingly often still point to the old domain after a move.
Validate your key page types with the Rich Results Test and the Schema Markup Validator.

AI visibility needs the same work, but stricter

AI assistants read the same pages as Google, except you don't get a second chance.
On most informational search terms in my field I see an AI Overview above the regular results.
A broken reference doesn't cost you a ranking there, it costs you the mention entirely.

Three things you check separately.
Your schema.org markup needs to be correct at address level, including the sameAs references to external profiles.
An llms.txt is a list of addresses, so after a migration it's out of date by definition.
And check whether your robots.txt still allows the AI crawlers through, because that's exactly the rule that changes by accident.

To be honest about llms.txt: it's a proposal, not a standard, and nobody is obliged to read it.
I keep it up to date because it's half an hour's work.

What you measure to know it went well

Four metrics tell you whether the migration succeeded, and none of the four answer that on day one.

What Where When
Status codes of the old address list Crawler Day 1, day 7, day 30
Number of indexed pages Search Console, Pages report Weekly, for eight weeks
Clicks and impressions per address Search Console, Performance report Per URL, against the same period last year
LCP, INP and CLS Search Console, Core Web Vitals Only after a month, the field data runs on a 28 day window

Expect a temporary dip, even with a clean migration: search engines have to request every old address again, follow the redirect and re-evaluate the new address.
What isn't normal is a dip that hasn't recovered after eight weeks.
Keep your redirects in place for at least a year, and ideally permanently.

When most of this work falls away

If your URL structure doesn't change, most of this article falls away from your project.
An upgrade from Drupal 10 to Drupal 11 within the same site keeps your node IDs and path aliases, so there's nothing to reconnect.
A crawl before and after is enough then.
The distinction between an upgrade and a real migration decides whether this is an afternoon or weeks of work.
With a platform switch such as a move from WordPress to Drupal, almost every path changes, and then this article applies from the first step to the last.

How I approach a migration

I build the inventory and the redirect plan before the first line of migration code, and deliver them as a file you can check yourself.
The technical work, the launch checks and the measurements afterwards follow from there.
More on that on Drupal migration and upgrade and technical SEO and frontend performance.

My rate is 75 to 95 euros per hour or 650 to 800 euros per day, excluding VAT, lower for long engagements and returning clients.
What a migration costs depends mainly on your number of addresses and your custom code, not on your Drupal version.
Still running a Drupal 7 site, start there. Tell me about your situation and I'll give you an honest picture of what's needed within 24 hours.

Frequently asked questions

How do you copy a website?

Copying and migrating are two different things.
A copy is a full export of files and database, to test on a second environment.
A migration moves content over to a new structure, and then your addresses usually do change.
Never put a copy on an indexable environment, since a second findable version is more damaging than none.

Can I build a website using an existing domain name?

Yes, and that's the recommended route.
Your domain carries your findability, so a new site on your existing domain doesn't start from zero.
What you do need to sort out are the addresses underneath it: every old path gets a 301 to its new path.
With a different domain, a change of address in Search Console comes on top of that.

What do I do with an old page that has no new equivalent?

Then a 410 is more honest than a 301 to something the visitor wasn't looking for.
Sending everything to the homepage is the worst option, since Google treats a mass redirect like that as a soft 404, and then you lose exactly the signals you thought you were preserving.
Note in your mapping why you chose a 410, so you don't have to make that call again later.

How long should I keep my 301 redirects in place?

At least a year, and there's no good reason to remove them after that.
Search engines need time to re-request every old address, and external links to old addresses often keep existing for years.
What you do clean up are chains, since after a second migration they need to be flattened to a single hop.

Do I always lose visitors during a migration?

Temporarily, usually yes; structurally, not if the redirect plan is right.
Search engines have to re-request every old address, follow the 301, and re-evaluate the new address, and that takes weeks.
A drop that's still there after eight weeks almost always comes from missing redirects, a noindex left over from the test environment, or an incorrect canonical.

How do I check after launch that my redirects are correct?

Crawl your full list of old addresses and check that each one ends up on a 200 with a single hop, not two or three.
Repeat that same crawl on day 7 and day 30.
Also check that every canonical points to itself on the correct domain and protocol, and that your sitemap only contains addresses that return 200.

A question about this topic?

Briefly describe your situation, and I'll let you know what's going on and what it would cost. No sales pitch.

Privacy policy

Who we are

This policy applies to David Porschmann (freelance web developer).
Contact: support@porschmann.be.

What data we process

Name, email address, company name (optional), and your message or enquiry. When you visit our website, we also process limited technical data (such as IP address and browser type) for security and analytics purposes.

Why we process your data (legal basis)

  • To respond to your enquiry or provide a quotation (consent or pre-contractual necessity).
  • For administration and invoicing during collaboration (contractual necessity).
  • For security and troubleshooting (legitimate interest).

Retention periods

Contact form submissions: maximum of 24 months.
Client records and invoicing: according to legal retention periods.

Sharing with third parties

We do not share your data with third parties, except with processors who help us host the website, send emails, or handle administration. Data processing agreements have been concluded with these partners.

Your rights

Right of access, rectification, erasure, restriction, data portability, and withdrawal of consent.
Email us at support@porschmann.be.

Security

We take appropriate technical and organisational measures to protect your data.

Cookies and analytics

Brief explanation of the tools used (e.g. Matomo, Clarity, GA) and a link to the cookie policy, if applicable.

Contact

Questions about this policy?
support@porschmann.be

More to read