
Short answer: Headless CMS SEO is the work of making a site rank when its content lives in a headless CMS (such as Contentful, Sanity, Strapi or WordPress used headlessly) and a separate front end, often Next.js, Nuxt or Astro, builds the pages. Because no plugin does the job for you, the front end must output server-rendered or static HTML, titles, meta descriptions, canonicals, structured data, sitemaps, robots rules and redirects, all driven by SEO fields in your content models.
This guide is for marketers, developers and founders who are moving to a headless CMS, or already have one and are not sure why some pages are not indexed. I have written it from the checks I run when I audit headless builds: what changes for SEO when you go headless, which rendering mode to pick, how to design content models so editors can manage SEO without a developer, and a launch checklist you can tick off.
What a headless CMS is, in SEO terms
A traditional CMS such as standard WordPress stores content and also builds the HTML pages. A headless CMS only stores and manages content, then hands it out through an API (REST or GraphQL). A separate front end fetches that content and builds the pages, and the same content can also feed an app, a kiosk or an email system.
For SEO, the important consequence is simple: everything that used to be a plugin setting becomes code. Title tags, canonical tags, XML sitemaps, robots meta, redirects, breadcrumbs, hreflang and schema all have to be built into the front end. If nobody writes that code, it does not exist. That is the root of almost every headless SEO problem I see.
| SEO task | Traditional CMS (e.g. WordPress with Yoast) | Headless CMS |
|---|---|---|
| Title and meta description | Plugin fields on each post | SEO fields in the content model, printed by the front end |
| Canonical tag | Added automatically | Built in the page template from a base URL and slug |
| XML sitemap | Generated by a plugin | Generated at build time or by a route that queries the API |
| Redirects | Redirect plugin | Redirect model in the CMS, applied by the framework or hosting |
| Schema markup | Plugin output | JSON-LD built from content fields in the template |
| Rendering | Server-rendered HTML by default | Depends on the framework setting chosen by the developer |
| Previews | Built in | Must be set up, or editors publish blind |
Is a headless CMS good or bad for SEO?
Neither by default. Google does not rank a site higher because it is headless. The architecture gives you more control and, done well, very fast pages. Done badly, it gives you a JavaScript shell with no titles and an empty sitemap. In my experience the outcome depends on whether SEO requirements were in the build brief before development started.
- Where headless helps: fast static or edge-cached pages, clean URL control, structured content that maps neatly to schema, and one source of content for many channels.
- Where it hurts: client-side rendering, missing SEO fields, no preview for editors, redirects forgotten during migration, and every small SEO change needing a developer ticket.
Performance is a real advantage when you use it. Google’s web.dev Vodafone case study is not about headless specifically, but it shows why front-end speed matters commercially: a 31% better LCP went with 8% more sales. A headless front end makes that kind of work easier, because you control every byte the page ships. Measure yours against Core Web Vitals rather than assuming headless is automatically fast.
Rather have an expert do this for you?
Hand it over and get back to running your business.
Choose the right rendering mode for each page type
Rendering is the single most important headless SEO decision. Google’s JavaScript SEO basics explain that Google crawls, then renders, then indexes JavaScript pages, and that server-side or pre-rendering is still recommended because it is faster for users and crawlers, and not every bot runs JavaScript. AI crawlers in particular often read only the raw HTML.
| Mode | How it works | Best for | SEO risk |
|---|---|---|---|
| Static site generation (SSG) | Pages built to HTML at deploy time | Blogs, guides, service pages, docs | Low; stale content if rebuilds fail |
| Incremental static regeneration (ISR) or on-demand revalidation | Static pages rebuilt when content changes or after a set time | Large blogs, product catalogues | Low; check webhooks fire on publish |
| Server-side rendering (SSR) | HTML built on each request | Stock, prices, search results, personalised pages | Low; watch server response time |
| Client-side rendering (CSR) | Browser builds the page with JavaScript | Logged-in dashboards, account areas | High for public pages: empty HTML, slow indexing |
| Dynamic rendering | Bots get pre-rendered HTML, users get JavaScript | Legacy fixes only | Google calls it a workaround; avoid for new builds |
A quick test I use on every headless site: open the page, view source (not the inspector), and search for the main heading and the first paragraph. If they are not in the source HTML, the page relies on client-side rendering and you have a problem to fix. My guides on rendering in SEO and JavaScript SEO go deeper on testing.
Build SEO into your content models
In a headless CMS you design content types (models) with fields. If the SEO fields are not in the model, editors cannot manage SEO. I ask for a reusable “SEO” component attached to every page-level model, with these fields:
- Slug: required, unique, lowercase, validated against a pattern so nobody publishes spaces or capitals.
- SEO title and meta description: with character-count hints, falling back to the headline and summary if left empty.
- Canonical override: empty by default, so the template uses the page’s own URL.
- Robots setting: index or noindex, defaulting to index.
- Social image and alt text: for Open Graph and X cards.
- Author reference and dates: a link to an author entry, plus published and updated dates, so Article schema and bylines are built automatically.
- Internal links as references: link to other entries, not typed URLs, so links update when a slug changes.
Then use the model to drive structure. A “service” model with fields for problem, process, pricing approach and FAQs produces consistent, well-structured pages and makes FAQ and Service schema easy to generate. Plan these fields from your keyword map, so each page type answers the questions searchers actually ask.
Worked example: how a page template turns CMS fields into head tags
This is a simplified Next.js App Router example. The CMS entry has fields seoTitle, metaDescription, slug, noindex and canonicalOverride.
export async function generateMetadata({ params }) {
const page = await getPageBySlug(params.slug);
const url = page.canonicalOverride || `https://example.com/${page.slug}/`;
return {
title: page.seoTitle || page.headline,
description: page.metaDescription || page.summary,
alternates: { canonical: url },
robots: page.noindex ? { index: false } : { index: true, follow: true },
openGraph: { url, images: [page.socialImage?.url] }
};
}Two things I always check in code like this: that a missing slug returns a real 404 status (not a 200 page saying “not found”), and that there is exactly one canonical tag in the final HTML.
Technical SEO you have to build yourself
Sitemaps and robots.txt
Generate the XML sitemap from the CMS, including only published, indexable, canonical URLs, and regenerate it whenever content is published. Serve robots.txt from the front end and point it to the sitemap. Check the output with my XML sitemap validator; empty or staging-URL sitemaps are common on new headless launches.
Status codes and soft 404s
Single-page app routing often returns a 200 status for pages that do not exist. Google’s JavaScript guidance lists this as a soft 404 problem. Make sure unknown slugs return a 404, and removed content returns a 301 to the closest replacement or a 410.
Redirects
Store redirects as entries in the CMS (old path, new path, type) and apply them at the framework or hosting layer, so editors can add them. On migrations, map every old URL before launch. My website migration checklist covers the full process.
Structured data
Build JSON-LD in the template from content fields: Article from author and dates, Product from price and stock, FAQPage from FAQ components, BreadcrumbList from the page’s parent references. Validate with Google’s Rich Results Test, which I explain in my guide to structured data testing.
Hreflang for multilingual sites
Most headless CMSs support locales well. Use locale fields to output reciprocal hreflang tags, following Google’s localized versions guidance, and put them on every language version, with self-references and an x-default where it makes sense.
Edge tools
If the front end is hard to change quickly, some SEO fixes can be applied at the CDN. My guides on edge SEO and Cloudflare Workers for SEO explain when that is sensible and when it just hides a problem.
Mistakes I find on headless sites
- Staging noindex shipped to production: an environment variable that was never switched. Always check the live robots meta and robots.txt on launch day.
- Every page with the same title: the layout file sets a default title and no page overrides it.
- Canonicals pointing to the preview or Vercel domain: built from the wrong base URL variable.
- Links that are not links: navigation built with click handlers instead of
<a href>, so crawlers cannot follow it. - Images from the CMS asset API without dimensions or alt text: causing layout shift and weak image search visibility.
- No editor preview: editors cannot see what they publish, so SEO fields are skipped.
- Sitemaps that only rebuild on deploy: new articles are missing for days.
Headless SEO launch checklist
Headless CMS SEO checklist
- Rendering: every public page is SSG, ISR or SSR; the main content appears in view-source HTML.
- SEO component: slug, title, meta description, canonical override, robots and social image fields exist on every page model.
- Fallbacks: empty SEO fields fall back to headline and summary, never to a site-wide default.
- Canonicals: exactly one per page, using the production domain.
- Status codes: unknown URLs return 404; removed pages 301 or 410.
- Sitemap: generated from published, indexable entries and updated on publish.
- Robots.txt: production version allows crawling and lists the sitemap.
- Redirects: managed as CMS entries; every old URL mapped before migration.
- Structured data: JSON-LD built from fields and validated.
- Internal links: real <a href> links, using entry references rather than typed URLs.
- Images: width, height, alt text and modern formats from the asset pipeline.
- Hreflang: reciprocal tags for every locale, if the site is multilingual.
- Preview: editors can preview drafts with the real template.
- Monitoring: Search Console verified, with page indexing and Core Web Vitals reports checked after launch.
Ticks are saved in your browser, so you can share this with your developer and work through it together.
Frequently asked questions
Is a headless CMS better for SEO than WordPress?
Not automatically. WordPress gives you working SEO basics out of the box through plugins. A headless CMS can match or beat it on speed and control, but only if the front end is built to output everything a plugin would. For a small site with no developer, standard WordPress is usually the safer choice; my comparison of the best CMS for SEO covers the trade-offs.
Can Google index a headless CMS website?
Yes. Google indexes headless sites in the same way as any other site. Problems only appear when pages depend on client-side JavaScript to show content, or when titles, canonicals and sitemaps are missing from the front end.
Which rendering method is best for headless SEO?
Static generation (with on-demand revalidation) for content that changes occasionally, and server-side rendering for content that changes constantly, such as prices or stock. Avoid client-side rendering for any page you want to rank.
Do I still need an SEO plugin with a headless CMS?
Some headless CMSs offer SEO field plugins, which help editors fill in titles and descriptions. They do not output anything on the live site by themselves; the front end still has to read those fields and print the tags.
What should I check first after launching a headless site?
View the source of a few key pages to confirm the content and head tags are present, check robots.txt and robots meta for leftover staging blocks, submit the sitemap in Search Console, and test a random broken URL to confirm it returns a 404.
Sources
- Google Search Central, “Understand the JavaScript SEO basics” (last updated March 2026).
- Google Search Central, “Dynamic rendering as a workaround” (last updated December 2025).
- Google Search Central, “Tell Google about localized versions of your page” (accessed 2026).
- web.dev, “Vodafone: A 31% improvement in LCP increased sales by 8%” (March 2021).
If you are planning a headless build or migration, bring SEO into the brief before development starts. My technical SEO services include headless audits and developer briefs, or you can contact me with your stack and URL.
Request received
Thank you! Saad will contact you within the next 24 hours.
Keep an eye on your phone and inbox.
