The failure is silent
Going headless does not break SEO. It removes the thing that was quietly doing SEO for you, and the removal produces no error.
For years, a WordPress SEO plugin has been rendering canonical tags, meta robots directives, Open Graph tags, an XML sitemap, structured data and a redirect table into every response. It did this through the theme layer. In a headless architecture, the theme layer is gone.
The plugin is still installed. The admin still shows green indicators. The fields are still filled in. None of it reaches the browser, because nothing is rendering it.
Verify against the response, not the admin
This is the single most useful habit for a headless migration: check the raw HTML of the live front end for every SEO output you expect.
The admin panel reports on stored field values. It has no visibility into what your Next.js or Astro application actually renders. A page can show a perfectly configured canonical URL in wp-admin and ship without a canonical tag at all.
The table on this page is the inventory. Work through it against view-source on the new front end, one route type at a time.
The origin has to be locked down
Headless setups routinely leave the WordPress origin publicly reachable — at cms.example.com, or at the original domain, or behind a hosting provider’s default URL.
Once it is reachable and linked from anywhere, it can be indexed. You now have two copies of the site: a fast new front end and the old WordPress theme output, competing with each other.
Authentication or an IP allowlist is the correct fix. X-Robots-Tag: noindex on the origin host is the minimum. robots.txt alone does not prevent indexing of a URL that has been linked — that is a crawl directive, not an index directive, and the distinction matters here more than almost anywhere else.
Preview deployments
Modern hosting platforms generate a public URL for every branch. Those URLs get pasted into tickets, chat and pull requests. Some of those surfaces are crawlable.
The result is a set of near-duplicate deployments in the index, each of which can outrank production for long-tail queries because they are functionally identical.
Set X-Robots-Tag: noindex at the platform level for every non-production hostname. It is one configuration entry, and every platform supports it.
The upside, stated fairly
Headless is not a compromise. Static generation and edge delivery typically produce better Core Web Vitals than a plugin-heavy WordPress theme, and the control over markup is genuinely better — you can emit exactly the structured data you want rather than what a plugin decides to produce.
The migration risk is entirely about completeness, not about the architecture. Teams who inventory the plugin’s outputs before starting tend to come through cleanly. Teams who discover the list after launch spend a quarter on it.
The general platform-migration method is on the replatform page, and the rendering verification sequence is set out on the technical scope page.
Planning this move?
Send the launch date and what is changing. We will tell you which parts of this page apply to your situation and which do not.
- Reply
- Typically within one business day.
- Hours
- Monday to Friday, 9am–6pm US Eastern.
- First call
- Scoping, not a pitch. No deck.