Ghost SEO
How SEO works on Ghost CMS — the traditional-vs-headless fork, the SEO Ghost builds in automatically, what it leaves to you, gated-content limits, and Ghost Pro vs self-hosted.
Ghost SEO splits in two depending on how you run it. In traditional (Handlebars) mode, Ghost handles core technical SEO automatically — sitemap, canonical tags, meta tags, Open Graph, Twitter Cards, and Article JSON-LD — with zero plugins, and it's fast by default. Run Ghost headless (Content API only) and all of that disappears; the frontend has to rebuild every piece. Either way, Ghost has gaps it never fills (breadcrumb/FAQ schema, hreflang, per-post noindex toggle, IndexNow), and gated members-only content can't be indexed because it's blocked server-side. The single biggest mistake is treating traditional and headless Ghost as the same SEO problem — they aren't.
TL;DR — Ghost is a publishing platform that, in its normal mode, does most of your technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. for you automatically — sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content., meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., social cards, structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. — with no plugin to install. It’s also fast out of the box. The big catch: if you run Ghost “headless” (just as a content source for a separate website), all of that built-in SEO goes away and a developer has to rebuild it. And members-only content can’t show up in Google at all.
What Ghost is
Ghost is a content management system — like WordPress, but built specifically for blogs, newsletters, and paid memberships rather than for every kind of website. You write posts in Ghost, and Ghost publishes them.
The thing that makes Ghost different for SEO is that it can run in two completely different ways:
- The normal way (traditional mode). Ghost runs your whole site — it stores your content and turns it into web pages. This is what most people use.
- The headless way. Ghost becomes just a storage box for content. A separate website (built by a developer with something like Next.js or Astro) pulls the content out and builds the pages itself.
This choice changes everything about Ghost’s SEO, so keep it in the back of your mind.
What Ghost does for you automatically (normal mode)
If you run Ghost the normal way, it quietly handles the technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. basics with no setup:
- A sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing. — an auto-updating list of your pages at
yourdomain.com/sitemap.xmlthat you can hand to Google and Bing. Evidence for this claim Traditional Ghost includes automatic SEO features including XML sitemaps, canonical tags, metadata, and structured data. Scope: Ghost-rendered sites using supported themes; headless frontends must implement their own output. Confidence: high · Verified: Ghost: SEO - Canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content. — these tell search engines which version of a page is the “official” one, so duplicate pagesThe same or very similar primary content reachable at more than one URL. There's no general duplicate content penalty — the real costs are possible signal dilution, the wrong URL getting chosen, and less-efficient crawling. don’t compete.
- Meta titles and descriptions — with sensible fallbacks if you leave them blank.
- Social cards — Open GraphOpen Graph (OG) tags are `<meta>` elements in a page's head, defined by the Open Graph protocol (ogp.me, created by Facebook), that describe a page as a shareable object — its title, description, image, URL, and type. They control how a link preview card looks when the page is shared on Facebook, LinkedIn, Slack, Discord, WhatsApp, and iMessage. They are not a direct Google ranking factor, though Google reads og:title, og:image, and og:site_name as inputs to how a result appears. and Twitter Card tagsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor. so links look good when shared.
- Structured data — the behind-the-scenes Article markupArticle schema (Article, NewsArticle, or BlogPosting) is structured data marking up a written piece's headline, author, and dates — Google labels it the \"Article rich result,\" but it's a better-displayed existing result, not a distinct new card, and it isn't required for Top Stories or Discover eligibility. that helps search engines understand your post.
- Clean URLs and a fast site by default.
In WordPress you’d install a plugin like Yoast to get most of this. In Ghost it’s just there.
What Ghost doesn’t do
Ghost covers the core, not the extras. It won’t add breadcrumb or FAQ structured data, it has no built-in support for multi-language (hreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others.) sites, no per-post “hide from Google” toggle in the menu, and no Yoast-style keyword checklist. Those need code or a third-party tool.
The one thing people get wrong
Members-only content can’t rank. If you put a post behind a paid (or free email) membership, Google literally can’t read it — Ghost hides it from everyone who isn’t logged in, search engines included. The fix is to publish a public preview or teaser that can rank, and use the gated part to convert readers into subscribers. Don’t expect locked posts to bring in search traffic.
Evidence for this claim Ghost members-only posts require member authentication, so their protected body is not publicly available to crawlers. Scope: Ghost access settings for members-only and paid-members-only content. Confidence: high · Verified: Ghost: Content accessWant the full version — the traditional-vs-headless decision, the headless rebuild checklist, gated-content schema, and Ghost Pro vs self-hosted? Switch to the Advanced tab.
TL;DR — Ghost SEOGhost SEO is the practice of optimizing a site built on Ghost CMS. The work splits in two: in traditional (Handlebars) mode Ghost handles core technical SEO automatically; run headless and you must rebuild all of it in the frontend. forks on one decision: traditional (Handlebars) mode vs. headless (Content API). Traditional Ghost ships core technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. automatically — sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., self-referencing + custom canonicals, meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., OG/Twitter cardsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor., and Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. — with no plugin, and it’s fast by default. Go headless and all of that disappears; the frontend has to rebuild every piece, and Ghost’s speed advantage evaporates because the framework now owns performance. Both modes share gaps Ghost never fills (breadcrumb/FAQ/Product schemaProduct schema (schema.org/Product) is structured data that tells search engines a page's product name, price, availability, and reviews so it can appear in Shopping-style rich results. It's separate from a Google Merchant Center feed, though Google reconciles the two., hreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others., per-post noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed., IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it., a redirectA redirect sends browsers and crawlers from a requested URL to a different one. An HTTP redirect specifically is a 3xx status code paired with a Location header; meta refresh and JavaScript redirects achieve a similar navigation without being a 3xx response themselves. Permanent redirects (301/308) are Google's signal the target should be canonical; temporary ones (302/303/307) aren't. UI), and gated members-only content is blocked server-side so it can’t be indexed. Don’t conflate the two modes — they’re different problems.
The fork in the road
Ghost is a Node.js (Express) CMSA content management system (CMS) is software that lets users create, manage, and publish digital content — like blog posts and pages — without writing raw code. WordPress, Drupal, and Joomla are the most common open-source CMS platforms. with a decoupled core: an API plus an optional Handlebars frontend. That architecture is the whole SEO story.
- Traditional mode — Ghost serves HTML through its Handlebars themes. Every
built-in SEO feature applies, generated automatically via the theme’s
{{ghost_head}}helper. - Headless mode — Ghost is “a full headless CMSA content management system that separates the content repository from the presentation layer, delivering content via API to any front-end framework rather than rendering HTML server-side itself. It doesn't specify the rendering mode, hosting, cache, preview security, or publishing workflow — those are separate decisions. which is completely agnostic of any particular front end or static site framework.” You query the Content API or Admin API from a separate frontend (Next.js, Astro, Nuxt, SvelteKit), and SEO becomes 100% that frontend’s responsibility.
The choice of mode is the single biggest determinant of Ghost’s SEO footprint. Everything below is organized around it. (For the framework-agnostic version of the headless side, see SEO for a Headless CMSA headless CMS decouples content storage and editing (the backend) from how that content is rendered and delivered (the frontend), serving content over an API instead of a built-in templated 'head'. Its SEO outcomes come almost entirely from how the separate frontend renders pages..)
What traditional Ghost handles automatically
In traditional mode Ghost does the core technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. with zero configuration:
- SitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing.. Auto-generated at
/sitemap.xml, updated on publish/unpublish, covering posts, pages, tags, and authors. “Ghost automatically creates and updates an XML sitemapAn XML sitemap is a UTF-8 file listing the canonical URLs on your site (with optional lastmod) so search engines can discover and prioritize them. It's a discovery and diagnostic aid, not a guarantee of indexing — and Google ignores its priority and changefreq tags. for your website.” Evidence for this claim Ghost automatically creates and updates an XML sitemap. Scope: Traditional Ghost publication output. Confidence: high · Verified: Ghost: SEO - Canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content.. A self-referencing
rel=canonicalon every post and page — “Ghost adds canonical tags across your site to tell search engines which version of a page they should consider the ‘official’ one.” Since March 2019 you can also set a custom canonical per post in the editor’s metadata panel, or via the Admin APIcanonical_urlfield — built for “guest posts, multiple versions of the same page or when you need to curate a list of links to external sources.” Evidence for this claim Ghost outputs canonical tags and supports a custom canonical URL for a post or page. Scope: Traditional Ghost and the post/page metadata configuration. Confidence: high · Verified: Ghost: Canonical URLs - Meta title/description. Custom fields that fall back to the post title and excerpt when left blank.
- Open GraphOpen Graph (OG) tags are `<meta>` elements in a page's head, defined by the Open Graph protocol (ogp.me, created by Facebook), that describe a page as a shareable object — its title, description, image, URL, and type. They control how a link preview card looks when the page is shared on Facebook, LinkedIn, Slack, Discord, WhatsApp, and iMessage. They are not a direct Google ranking factor, though Google reads og:title, og:image, and og:site_name as inputs to how a result appears. + Twitter Cards. Auto-generated from post metadata and the feature image.
- Structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. (JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal.). “Ghost automatically includes structured data in
all posts and pages” — Article schemaArticle schema (Article, NewsArticle, or BlogPosting) is structured data marking up a written piece's headline, author, and dates — Google labels it the \"Article rich result,\" but it's a better-displayed existing result, not a distinct new card, and it isn't required for Top Stories or Discover eligibility. with publisher, author, headline,
datePublished,dateModified, image, and keywords. - Clean URLs + custom routing. Slug-based URLs by default, fully customizable via
routes.yaml. - robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere.. A default file that disallows the
/ghost/admin path and allows everything else.
This is genuinely more than a stock WordPress install gives you — Ghost lists “XML sitemaps, canonical tags, optimised URLs, microformats, Facebook Open Graph tags, support for Twitter cards and clean semantic markup” as built-in, no plugin required.
What Ghost never does — in either mode
Ghost covers the core and stops there. It does not generate:
- Advanced schema — breadcrumb, FAQ, HowTo, Product, Recipe, or Video markup. Article schema only. Anything else is manual code injection or theme work.
- HreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others. / international SEOInternational SEO is the practice of optimizing a site so search engines understand which countries and/or languages it targets, and serve the right version to each user. It spans URL structure, hreflang, and on-page localization. — no native support. Multi-language Ghost needs a third-party service (Weglot, ConveyThis) or theme-level implementation, and hreflang is notoriously error-prone.
- A per-post noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. toggle in the UI — you need code injection.
- Keyword optimization guidance. This is deliberate. Asked about adding Yoast-style tools, the Ghost team argued that “one of the downsides of using Yoast’s KW optimisation suggestions is that is encourages us to write meta data for machines instead of humans,” and on the broader advanced-SEO wishlist (breadcrumb schema, hreflang, noindex controls) said flatly: “This isn’t on our radar at the moment.”
- IndexNow — no native support; wire it via a custom webhook on publish if you want Bing/others notified instantly.
- A redirect-management UI — redirects live in
redirects.yaml(self-hosted) or Ghost Pro’s redirect manager; there’s no plugin ecosystem to lean on.
Headless Ghost: the SEO you have to rebuild
Go headless and Ghost stops being an SEO system — it’s a content API. Everything in the “handles automatically” list above is now the frontend’s job:
- Sitemap — generated at build time or by a serverless function hitting the Content API.
- Canonical tags — injected by the frontend framework, ideally absolute URLs
from one
SITE_URL. - Meta + OG/Twitter tags — rendered via the framework’s head management
(Next.js
generateMetadata, Astro’s<head>, NuxtuseSeoMeta). - Structured data (JSON-LD) — now entirely custom.
- robots.txt — served by the frontend.
- 301/302 redirectsA 302 (\"Found\") is a temporary redirect: it forwards users to a new URL while telling search engines the original URL should stay in the index. It's a weak canonicalization signal, not the zero-equity dead end of SEO folklore. — handled in the frontend or the CDN layer.
- Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. — Ghost’s speed advantage disappears; the framework and renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode now dominate performance.
The one thing that carries over: the Content API still returns the editorial
metadata you typed into Ghost’s editor — meta_title, meta_description,
og_title, og_description, og_image, twitter_title, twitter_description,
twitter_image, and canonical_url. The data is available; rendering it is on
you. This is the headless-CMS SEO problem in general, and it’s really a
JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. problem — if your frontend
defaults to client-side rendering, GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. has to queue the page for a later
render wave. AI-crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. rendering varies by provider, so render on the server or
at build time (SSR/SSG) to maximize coverage.
Ghost can return all the editorial fields through its API while the public frontend still omits them from initial HTML. Compare the delivered document with a browser render; traditional Handlebars Ghost normally does not need this rendering check.
Test a headless route with my free Render Gap Analyzer Free
- Test a public post from each headless page template.
- Check content, real links, metadata, canonical, and structured data in the initial response.
- Move critical output to SSG or SSR, retest, then confirm Google’s view with URL Inspection.
The initial HTML contains about eight words while the rendered page contains about 112. The finding says most content is added by JavaScript.
Gated content and what Google can see
Ghost supports three visibility levels: public, members-free (email required), and members-paid (subscription). The crucial point for SEO is that gated content is blocked server-side, not by sniffing the user agentA user agent is the HTTP request header a client (browser, crawler, or bot) sends to identify itself. For crawlers, a short user-agent token — a substring of that string — is what robots.txt rules actually target.. As Ghost’s own team put it: “Google can’t crawl protected content on your page, because that’s only ever available to logged in members.” Google gets exactly the same restricted view a logged-out reader gets.
Two realistic strategies:
- Public preview. Show an intro / first few paragraphs publicly and gate the rest. Ghost has a native public-preview feature for this — the public portion does the ranking work.
- Metered access. Third-party implementations allow N free articles before requiring registration.
If you do gate content, Google supports paywalled markup — NewsArticle with
isAccessibleForFree: false and a hasPart/cssSelector describing the gated
region — but Ghost doesn’t generate this automatically; it’s manual code
injection. And the hard rule either way: don’t cloak. Showing Googlebot the full
article while readers hit a paywall violates Google’s guidelines and risks a manual
action. The honest framing is that public content ranks and gated content converts —
don’t expect locked posts to bring search traffic.
Ghost Pro vs self-hosted
The SEO software is identical on both — same Ghost, same features. The difference is infrastructure control:
- Ghost Pro — managed hosting with a built-in CDN, automatic SSL, and backups.
The CDN helps TTFBTime to First Byte — the time from the start of a request to when the first byte of the response arrives. It's a diagnostic metric (not a Core Web Vital) and a major input to FCP and LCP; ≤0.8 s is good. and Core Web VitalsWeb Vitals is Google's initiative (launched May 2020) for unified page-experience quality signals. Core Web Vitals — LCP, INP, and CLS — are the subset used in ranking; the rest (TTFB, FCP, TBT, Speed Index) are diagnostic, not ranking factors. for distributed audiences. The catch:
you can’t directly override
robots.txt— you have to contact support. That’s a real constraint for headless or private-mode setups. - Self-hosted — full control of the server, headers, caching,
robots.txt, server-level redirects, and your own CDN (Cloudflare is the common pick). More flexibility for advanced technical SEO, more to manage.
Neither is “better for SEO” inherently — Ghost Pro buys you a CDN, self-hosting buys you control.
Common pitfalls
- Thin tag/author archives. Ghost auto-creates
/tag/slug/and/author/slug/pages. Granular tags or single-post authors generate thin pages — consider noindexing the low-value ones. - Preview-URL indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.. Older Ghost versions could leak draft preview URLs to Googlebot via third-party scripts loading on preview pages (since fixed in core — see GitHub issue #9749). Verify preview pages aren’t indexed on older installs.
/ghost/accidentally exposed. Confirm the defaultrobots.txtdisallow on the admin path hasn’t been overridden.- Duplicate contentThe same or very similar primary content reachable at more than one URL. There's no general duplicate content penalty — the real costs are possible signal dilution, the wrong URL getting chosen, and less-efficient crawling. from custom collections.
routes.yamlcollections can create alternate URL paths for the same content. Ghost canonicalizes its default structure; custom routing can create duplicates if you don’t manage canonicals explicitly. - Missing custom canonical on syndicated/guest posts. If you republish content
from elsewhere, set
canonical_urlper post (editor or API) to point at the original — the feature only exists since March 2019. - Headless pre-launch indexing. A public headless frontend deployed before launch
without its own
robots.txtcan get indexed prematurely. Ghost’s own “private” mode sendsDisallow: /, but that protects the Ghost instance, not your separate frontend.
Ghost vs WordPress, briefly
Ghost gives you more SEO out of the box with zero configuration and is faster by default (Ghost’s own benchmark claims it’s “up to 1,900% faster than WordPress” — treat that as a vendor figure, but the direction is real: minimal JS, strong CWV baseline). WordPress’s ceiling is higher with the right plugins — schema, redirect managers, programmatic SEOProgrammatic SEO (pSEO) is the practice of generating many pages from a single template plus a data source to target large sets of similar queries. It's powerful when each page genuinely answers its query with unique data, and spam when it just stamps a thin template across a shallow dataset. — but its plugin-heavy norm often hurts performance. Ghost suits publishers who want to write without SEO-plugin overhead; WordPress suits complex sites needing advanced schema or large integrations. “Faster, therefore ranks better” is an oversimplification — Core Web Vitals is one factor among many, and headless Ghost’s speed depends entirely on the frontend, not Ghost.
AI summary
A condensed take on the Advanced version:
- Ghost SEOGhost SEO is the practice of optimizing a site built on Ghost CMS. The work splits in two: in traditional (Handlebars) mode Ghost handles core technical SEO automatically; run headless and you must rebuild all of it in the frontend. forks on one decision: traditional (Handlebars) mode vs. headless (Content API). The mode is the single biggest determinant of Ghost’s SEO footprint.
- Traditional Ghost ships core SEO automatically, no plugin: sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing. at
/sitemap.xml, self-referencing canonicals (+ custom canonical per post since March 2019), meta title/description with fallbacks, OG/Twitter cardsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor., Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal., clean URLs, and arobots.txtthat disallows/ghost/. It’s also fast by default. - Headless Ghost loses all of it. The Content API still returns the metadata fields, but the frontend must rebuild sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., canonicals, meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., structured data, robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere., redirectsA redirect sends browsers and crawlers from a requested URL to a different one. An HTTP redirect specifically is a 3xx status code paired with a Location header; meta refresh and JavaScript redirects achieve a similar navigation without being a 3xx response themselves. Permanent redirects (301/308) are Google's signal the target should be canonical; temporary ones (302/303/307) aren't. — and Ghost’s speed advantage disappears. Render SSR/SSG, not CSR (AI-crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. support varies by provider).
- Gaps in both modes: no breadcrumb/FAQ/Product schemaProduct schema (schema.org/Product) is structured data that tells search engines a page's product name, price, availability, and reviews so it can appear in Shopping-style rich results. It's separate from a Google Merchant Center feed, though Google reconciles the two., no hreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others., no per-post noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. toggle, no IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it., no redirect UI. Some are deliberate — Ghost rejects Yoast-style keyword tools as “writing for machines.”
- Gated content can’t be indexed — it’s blocked server-side, so Google sees what a logged-out reader sees. Use a public preview to rank; gate the rest to convert. Don’t cloak.
- Ghost Pro vs self-hosted: identical SEO features; Pro adds a CDN but locks
robots.txtbehind support; self-hosting gives full control. - Pitfalls: thin tag/author archives, preview-URL indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. on old versions,
duplicate contentThe same or very similar primary content reachable at more than one URL. There's no general duplicate content penalty — the real costs are possible signal dilution, the wrong URL getting chosen, and less-efficient crawling. from custom
routes.yamlcollections, missing custom canonicals on syndicated posts.
Official documentation
Primary-source documentation from the search engines and from Ghost itself.
- Understand JavaScript SEO Basics — applies directly to headless Ghost: the crawl → render → indexStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. pipeline and why CSR content is seen late.
- Enable Subscription and Paywalled Content —
NewsArticle+isAccessibleForFree+hasPart/cssSelectorfor gated content. - Block Search Indexing with noindex — the
noindexmeta tag andX-Robots-Tagheader for previews and the admin path. - Sitemaps Overview — what to submit; Ghost auto-generates one in traditional mode.
Bing / Microsoft
- Bing Webmaster Tools — Submit Sitemaps — submit Ghost’s
/sitemap.xmldirectly. - IndexNow / indexnow.org — the push protocol Ghost has no native support for; wire it to a publish webhook.
Ghost (official)
- Ghost Help — SEO — the canonical list of what Ghost handles automatically.
- Ghost Developer Docs — Architecture — Ghost as a headless CMSA headless CMS decouples content storage and editing (the backend) from how that content is rendered and delivered (the frontend), serving content over an API instead of a built-in templated 'head'. Its SEO outcomes come almost entirely from how the separate frontend renders pages., agnostic of any frontend.
- Ghost Docs — URLs & Routing —
routes.yaml, collections, and custom URL structureURL structure is how the parts of a web address — scheme, domain, path, query string, and fragment — are organized and formatted. It mostly affects crawling, usability, and how engines understand a page, not rankings directly.. - Ghost Changelog — Custom Canonical URLs — the March 2019 per-post canonical feature.
- Ghost Resources — SEO for Membership Websites — Ghost’s own take on gated-content SEO.
Quotes from the source
On-the-record statements from Ghost’s docs and team. Each link is a deep link that jumps to the quoted passage on the source page.
Ghost — built-in SEO features
- “Ghost automatically creates and updates an XML sitemapAn XML sitemap is a UTF-8 file listing the canonical URLs on your site (with optional lastmod) so search engines can discover and prioritize them. It's a discovery and diagnostic aid, not a guarantee of indexing — and Google ignores its priority and changefreq tags. for your website to help search engines understand the structure of your site and find all of its content.” — Ghost Help Docs. Jump to quote
- “Ghost adds canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content. across your site to tell search engines which version of a page they should consider the ‘official’ one. This helps prevent problems with duplicate contentThe same or very similar primary content reachable at more than one URL. There's no general duplicate content penalty — the real costs are possible signal dilution, the wrong URL getting chosen, and less-efficient crawling..” — Ghost Help Docs. Jump to quote
- “Ghost automatically includes structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. in all posts and pages. This helps search engines understand the content and context of your pages.” — Ghost Help Docs. Jump to quote
Ghost — headless architecture
- “Ghost is a full headless CMSA headless CMS decouples content storage and editing (the backend) from how that content is rendered and delivered (the frontend), serving content over an API instead of a built-in templated 'head'. Its SEO outcomes come almost entirely from how the separate frontend renders pages. which is completely agnostic of any particular front end or static site framework.” — Ghost Developer Docs. Jump to quote
Ghost — gated content and crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor.
- “Google can’t crawl protected content on your page, because that’s only ever available to logged in members.” — Kym, Ghost team, Ghost Forum. Jump to quote
Ghost — custom canonical URLsHow search engines pick one canonical URL among duplicates and consolidate signals onto it. (March 2019)
- The feature lets you “implement custom canonical links directly in the Ghost editor for guest posts, multiple versions of the same page or when you need to curate a list of links to external sources.” — Ghost Changelog. Jump to quote
Ghost — on advanced SEO features (team response)
- “one of the downsides of using Yoast’s KW optimisation suggestions is that is encourages us to write meta data for machines instead of humans.” — Ghost team, Ghost Forum. Jump to quote
- On a wishlist of advanced SEO features (breadcrumb schema, hreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others., noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. controls): “This isn’t on our radar at the moment.” — Ghost team, Ghost Forum. Jump to quote
Ghost — performance (vendor benchmark)
- “Independent tests have found Ghost to be up to 1,900% faster than WordPress.” — Ghost vs WordPress page. Jump to quote
Two checklists: traditional Ghost + headless Ghost
Traditional Ghost — verify post-launch
-
/sitemap.xmlresolves and is submitted to Google Search ConsoleA free Google service that reports how a site performs in Google Search and surfaces problems with how Google crawls, indexes, and serves it. It's first-party data straight from Google — but you don't need it to appear in results. and Bing Webmaster ToolsThe free, first-party consoles search engines give site owners — Google Search Console and Bing Webmaster Tools — to see how their pages are crawled, indexed, and ranked, and to fix problems. The legacy name is 'webmaster tools.'. -
robots.txtstill disallows/ghost/and isn’t blocking anything you want indexedStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.. - Canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content. render on posts/pages; syndicated or guest posts have a
custom
canonical_urlset. - Meta titles/descriptions are set (or the title/excerpt fallbacks are acceptable).
- OG/Twitter cardsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor. preview correctly when a post is shared.
- Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. validates in the Rich ResultsRich results (formerly 'rich snippets') are enhanced search listings — stars, images, prices, breadcrumbs, video thumbnails, and more — that Google and Bing build from structured data. They're a display feature, not a ranking factor, and eligibility never guarantees they'll show. Test.
- Thin
/tag/and/author/archives are reviewed — noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. the low-value ones. - Members-only posts have a public preview if you want them to attract search traffic.
- Any advanced schema you need (breadcrumb, FAQ, Product) is added via code injection — Ghost won’t generate it.
Headless Ghost — full implementation checklist
- Frontend renders content as SSR or SSG, not CSR (raw HTML maximizes AI-crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. coverage).
- SitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing. generated from the Content API and kept fresh.
- Canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content. rendered as absolute URLs from one
SITE_URLat the renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. layer. - Meta title/description/OG/Twitter pulled from the Content API fields and mapped
into the
<head>. - JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. rebuilt in the frontend.
-
robots.txtserved by the frontend and does not block.js/.css. - 301/302 redirectsA 302 (\"Found\") is a temporary redirect: it forwards users to a new URL while telling search engines the original URL should stay in the index. It's a weak canonicalization signal, not the zero-equity dead end of SEO folklore. handled in the frontend or CDN layer.
- Preview/branch deploys return a host-level
noindexheader. - Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. measured — Ghost’s speed advantage is gone; the framework owns it now.
- IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it. wired to the publish webhook for Bing and others.
The mental models
1. The mode is the product. Before any Ghost SEOGhost SEO is the practice of optimizing a site built on Ghost CMS. The work splits in two: in traditional (Handlebars) mode Ghost handles core technical SEO automatically; run headless and you must rebuild all of it in the frontend. conversation, answer one question: is this traditional or headless? Traditional Ghost is a near-complete SEO system. Headless Ghost is a bare content API. Almost every Ghost SEO question resolves to which one you’re on.
2. “Headless means rebuild everything.” Every automatic traditional-mode behavior — sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., canonicals, meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., OG cards, JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal., robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere. — is now a deliberate build step in your frontend. The Content API hands you the data; renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. it is on you. If something’s “missing” in a headless build, it usually means a built-in behavior was never re-implemented.
3. Ghost covers the core, not the extras. In both modes, Ghost gives you Article schemaArticle schema (Article, NewsArticle, or BlogPosting) is structured data marking up a written piece's headline, author, and dates — Google labels it the \"Article rich result,\" but it's a better-displayed existing result, not a distinct new card, and it isn't required for Top Stories or Discover eligibility. and stops. Breadcrumb, FAQ, HowTo, Product, hreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others., per-post noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed., IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it. — none are built in. Plan for code injection or third-party tools if your niche needs them.
4. Public ranks, gated converts. Members-only content is invisible to search engines by design. Don’t fight it — use a public preview to do the ranking and the gate to do the converting. Never cloak to show Google more than readers see.
5. Pro vs self-hosted is an infrastructure decision, not an SEO-feature one.
The SEO software is identical. Choose on control: Ghost Pro gives you a CDN but locks
robots.txt; self-hosting gives you full server control and your own CDN.
Ghost SEO — cheat sheet
Traditional vs headless: what you get
| Feature | Traditional (Handlebars) | Headless (Content API) |
|---|---|---|
| XML sitemapAn XML sitemap is a UTF-8 file listing the canonical URLs on your site (with optional lastmod) so search engines can discover and prioritize them. It's a discovery and diagnostic aid, not a guarantee of indexing — and Google ignores its priority and changefreq tags. | ✅ Auto at /sitemap.xml | ❌ Build it yourself |
| Canonical tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content. | ✅ Auto + custom per post | ❌ Render in frontend |
| Meta title/description | ✅ With fallbacks | ⚠️ API returns data; you render it |
| OG / Twitter cardsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor. | ✅ Auto | ⚠️ API returns data; you render it |
| Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. | ✅ Auto | ❌ Rebuild it |
| robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere. | ✅ Default (disallows /ghost/) | ❌ Serve from frontend |
| Speed / Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. | ✅ Fast by default | ⚠️ Depends on your framework |
Never built in (either mode)
- Breadcrumb / FAQ / HowTo / Product / Recipe / Video schema → code injection
- HreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others. / international SEOInternational SEO is the practice of optimizing a site so search engines understand which countries and/or languages it targets, and serve the right version to each user. It spans URL structure, hreflang, and on-page localization. → Weglot, ConveyThis, or theme work
- Per-post noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. toggle → code injection
- IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it. → custom webhook on publish
- RedirectA redirect sends browsers and crawlers from a requested URL to a different one. An HTTP redirect specifically is a 3xx status code paired with a Location header; meta refresh and JavaScript redirects achieve a similar navigation without being a 3xx response themselves. Permanent redirects (301/308) are Google's signal the target should be canonical; temporary ones (302/303/307) aren't. UI →
redirects.yaml(self-hosted) or Ghost Pro’s manager
Gated content rules
- Members-only content is blocked server-side → not indexable.
- Use the public preview feature to expose a rankable teaser.
- Paywalled schema (
NewsArticle+isAccessibleForFree: false) is not auto — code injection. - Never cloak (full content to GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer., paywall to users) → manual-action risk.
Pro vs self-hosted
- Same SEO features on both.
- Ghost Pro: CDN included;
robots.txtchange requires contacting support. - Self-hosted: full control of robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere., headers, redirects, your own CDN.
Sample Ghost posts from the sitemap
Download the relevant sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing. first, extract a representative URL list to urls.txt,
then inspect what the theme or headless frontend publishes:
while IFS= read -r url; do
html=$(mktemp)
status=$(curl -sSL -o "$html" -w '%{http_code}' "$url")
canonical=$(grep -Eio '<link[^>]+rel=["'"']canonical["'"'][^>]*>' "$html" | head -1)
robots=$(grep -Eio '<meta[^>]+name=["'"']robots["'"'][^>]*>' "$html" | head -1)
printf '%s\t%s\t%s\t%s\n' "$status" "$url" "$canonical" "$robots"
rm -f "$html"
done < urls.txtInclude public, gated, tag, author, and recently redirected examples. This checks the public output without putting a Ghost Content API key into the script.
Patrick's relevant free tools
- Google Index Checker — Check one URL’s observable indexability blockers, or reconcile sitemap, crawl, and supplied Search Console evidence across a URL set before verifying Google’s actual state in URL Inspection.
- Canonicalization Checker — Audit HTML and HTTP canonical signals, test the canonical target, and identify observable conflicts that can cause Google to choose a different URL.
- SEO Incident Simulator — Practice thirty deterministic technical SEO incident investigations — indexability, crawl controls, redirects, sitemaps, markup, caching, DNS, bot verification, rendering, hreflang, and faceted navigation — with clearly labeled fixture evidence and Find → Fix → Verify handoffs.
Tools for Ghost SEO
- URL InspectionA Google Search Console feature that reports how Google sees one specific URL on a property you own. By default it shows the last-indexed snapshot; a separate \"Test live URL\" mode fetches the current version. (Google Search ConsoleA free Google service that reports how a site performs in Google Search and surfaces problems with how Google crawls, indexes, and serves it. It's first-party data straight from Google — but you don't need it to appear in results.) — see how a Ghost page was crawled and rendered. Essential on headless builds for catching CSR gaps where content didn’t make it into the rendered HTML.
- Rich ResultsRich results (formerly 'rich snippets') are enhanced search listings — stars, images, prices, breadcrumbs, video thumbnails, and more — that Google and Bing build from structured data. They're a display feature, not a ranking factor, and eligibility never guarantees they'll show. Test — confirm Ghost’s auto Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. (traditional) or your custom JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. (headless) is present and valid after any theme or renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. change.
- Bing Webmaster ToolsMicrosoft's free portal for monitoring and improving how a site appears in Bing search — the peer to Google Search Console, plus IndexNow instant indexing, richer backlink data, and keyword volumes. Because Bing's index also feeds Microsoft Copilot, it doubles as a window into AI-search visibility. — submit Ghost’s sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., watch indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., and where IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it. submissions land.
- Screaming Frog SEO Spider — crawl the site to surface thin tag/author archives, redirect chainsA → B → C instead of A → C. Each hop loses link equity and adds latency., and (on headless) raw-vs-rendered HTML differences.
- Ahrefs Site Audit — surfaces broken canonicals, missing metadata, and
indexability issues across the whole site; useful for spotting duplicate contentThe same or very similar primary content reachable at more than one URL. There's no general duplicate content penalty — the real costs are possible signal dilution, the wrong URL getting chosen, and less-efficient crawling.
from custom
routes.yamlcollections. - Ghost editor metadata panel — the per-post place to set custom title, description, OG/Twitter overrides, and the custom canonical URL.
Ghost SEO mistakes to avoid
Concrete mistakes people actually make running Ghost — prevention, not diagnosis.
Treating traditional and headless Ghost as the same SEO problem. Why it’s wrong: traditional Ghost ships a sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., canonicals, meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., OG/Twitter cards, and Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. automatically; headless Ghost is a bare content API with none of that. Advice written for one mode is often actively wrong for the other. What to do instead: before touching anything, confirm which mode you’re on, then follow the matching checklist above.
Expecting members-only content to bring in search traffic. Why it’s wrong: Ghost blocks gated content server-side, so Google gets exactly the same restricted view a logged-out visitor gets — there’s no content to indexStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.. What to do instead: publish a public preview or teaser using Ghost’s native public-preview feature and let that piece do the ranking work; use the gate to convert readers who arrive through it.
Cloaking to work around the gate.
Why it’s wrong: showing GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. the full article while readers hit a paywall
violates Google’s guidelines and risks a manual action — it’s not a clever
workaround, it’s a policy violation.
What to do instead: if you need gated content to be discoverable, use Google’s
paywalled-content markup (NewsArticle with isAccessibleForFree: false and a
hasPart/cssSelector for the gated region) — added via code injection, since
Ghost doesn’t generate it — rather than serving different HTML to the crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index..
Republishing or guest-posting content without setting a custom canonical.
Why it’s wrong: Ghost’s default canonical is self-referencing, so a syndicated or
guest post left as-is tells search engines it is the original, competing with the
source.
What to do instead: set the per-post canonical_url in the editor’s metadata panel
(or via the Admin API) to point at the original — the feature has existed since
March 2019.
Shipping a headless frontend that renders content client-side. Why it’s wrong: GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. has to queue CSR pages for a later render pass, while AI-crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. contracts vary by provider — content that only exists after a client-side fetch can be invisible to HTML-only fetchers. What to do instead: render on the server or at build time (SSR/SSG) in whatever framework pulls from the Content API, and verify with GSCA free Google service that reports how a site performs in Google Search and surfaces problems with how Google crawls, indexes, and serves it. It's first-party data straight from Google — but you don't need it to appear in results.’s URL Inspection toolA Google Search Console feature that reports how Google sees one specific URL on a property you own. By default it shows the last-indexed snapshot; a separate \"Test live URL\" mode fetches the current version. that the rendered HTML actually contains the content.
Assuming Ghost Pro gives you the same infrastructure control as self-hosting.
Why it’s wrong: the SEO software is identical on both, but Ghost Pro doesn’t let
you directly edit robots.txt — you have to contact support, which is a real
constraint if you need a fast robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere. change for a headless or private-mode
setup.
What to do instead: factor that support-ticket lag into any launch plan on Ghost
Pro, or self-host if you need to change robots.txt yourself on short notice.
Which Ghost SEO path applies to you?
The branch that matters most is traditional vs. headless — and, inside headless, whether the frontend renders server-side. Answer honestly; the wrong branch leads to work that doesn’t apply to your setup.
What does my Ghost setup need for SEO?
Ready-to-copy prompts for Ghost SEO tasks
Paste the specified input into an AI assistant and check the output against the guidance above before acting on it.
1. Audit a headless Ghost frontend for missing SEO fields. What to paste in: the rendered HTML of one page from your headless frontend (view source or the DOM after JS runs), plus the Content API response for that same post.
I'm running Ghost as a headless CMS. Here is the Content API response for a post,
followed by the final rendered HTML of that post's page on my frontend.
[paste Content API JSON response]
[paste rendered HTML]
Compare them and tell me which of these are present in the rendered HTML and
correctly populated from the API data: canonical tag, meta title, meta description,
Open Graph tags, Twitter Card tags, and Article JSON-LD structured data. List
anything missing or mismatched.What to expect back: a field-by-field checklist flagging any of the six items that
are absent from the rendered HTML or don’t match the API’s meta_title,
canonical_url, etc. — confirm any flagged gap manually before fixing it.
2. Draft Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. for a headless Ghost post. What to paste in: the Content API fields for one post (title, excerpt, published date, updated date, author, feature image URL, canonical URLHow search engines pick one canonical URL among duplicates and consolidate signals onto it.).
Using this Ghost Content API data for a blog post, write valid Article JSON-LD
structured data I can inject into my headless frontend's <head>. Include
headline, datePublished, dateModified, author, publisher, and image.
[paste post JSON: title, excerpt, published_at, updated_at, primary_author, feature_image, canonical_url]What to expect back: a single <script type="application/ld+json"> block — validate
it in Google’s Rich ResultsRich results (formerly 'rich snippets') are enhanced search listings — stars, images, prices, breadcrumbs, video thumbnails, and more — that Google and Bing build from structured data. They're a display feature, not a ranking factor, and eligibility never guarantees they'll show. Test before shipping, since the model can mis-map a
field or omit a required property.
3. Check a syndicated/guest post for a missing custom canonical.
What to paste in: the post’s slug, its canonical_url field (or “not set”), and the
URL of the original source it was republished from.
This is a guest post or syndicated republish on my Ghost site. Here's the post
slug, its current canonical_url setting, and the URL of the original source.
Slug: [slug]
Current canonical_url: [value or "not set"]
Original source URL: [URL]
Tell me whether the canonical is set correctly to point at the original, and if
not, what canonical_url value I should set in the Ghost editor's metadata panel.What to expect back: a yes/no on whether the canonical is correct, plus the exact URL to paste into the custom canonical field if it isn’t.
Test yourself: Ghost SEO
Five quick questions on how SEO works on Ghost CMSA content management system (CMS) is software that lets users create, manage, and publish digital content — like blog posts and pages — without writing raw code. WordPress, Drupal, and Joomla are the most common open-source CMS platforms.. Pick an answer for each, then check.
Resources worth your time
My related writing
- The Beginner’s Guide to Technical SEO — where platform and CMSA content management system (CMS) is software that lets users create, manage, and publish digital content — like blog posts and pages — without writing raw code. WordPress, Drupal, and Joomla are the most common open-source CMS platforms. SEO fit in the bigger picture.
- JavaScript SEO Issues & Best Practices — the renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. side that headless Ghost turns into; renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. modes, metadata, JS canonicals, and the robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere.
.js/.cssrule. - Robots.txt and SEO: Everything You Need to Know — relevant to Ghost’s default
/ghost/disallow and the Ghost Pro robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere. constraint.
My speaking
- How Search Works (SlideShare) — crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor., rendering, indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., and ranking — the pipeline gated and headless Ghost content has to survive. (Standing disclaimer: “This is my understanding of systems… not going to be 100% complete or accurate.”)
From around the industry
- Ghost Help — SEO — Ghost’s own list of what it handles automatically; the canonical primary source.
- Ghost Developer Docs — Architecture — Ghost as a headless CMSA headless CMS decouples content storage and editing (the backend) from how that content is rendered and delivered (the frontend), serving content over an API instead of a built-in templated 'head'. Its SEO outcomes come almost entirely from how the separate frontend renders pages. and how the decoupled API/frontend split works.
- Using Ghost as a Headless CMS with Next.js (Draft.dev) — a concrete walkthrough of the headless setup whose SEO you’d have to rebuild.
- Ghost Blog SEO: my experiences and results (Norbert Hires) — a practitioner’s first-party data and honest limitations from running Ghost.
- Schema markup in Ghost (Bright Themes) — how to add the advanced schema Ghost doesn’t generate.
- Breadcrumbs in Ghost (Bright Themes) — implementing breadcrumb schema Ghost leaves out.
- Taking Control of Structured Data in Ghost (ashryan.io) — overriding and extending Ghost’s default JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal..
- r/TechSEO — the community for crawl/index/render debugging that headless Ghost questions land in.
Ghost SEO
Ghost SEO is the practice of optimizing a site built on Ghost CMS. The work splits in two: in traditional (Handlebars) mode Ghost handles core technical SEO automatically; run headless and you must rebuild all of it in the frontend.
Related: Headless CMS SEO, JavaScript SEO
Ghost SEO
Ghost is an open-source, Node.js content management system built for professional publishing. Its SEO story splits cleanly along one axis: how you run it.
In traditional mode — Ghost serving its own Handlebars-based frontend — most technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. is built in and requires no plugin. Ghost auto-generates an XML sitemapAn XML sitemap is a UTF-8 file listing the canonical URLs on your site (with optional lastmod) so search engines can discover and prioritize them. It's a discovery and diagnostic aid, not a guarantee of indexing — and Google ignores its priority and changefreq tags. at /sitemap.xml, adds a self-referencing canonical tagA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content. to every page (with a per-post custom-canonical override since March 2019), produces meta titles/descriptions, Open GraphOpen Graph (OG) tags are `<meta>` elements in a page's head, defined by the Open Graph protocol (ogp.me, created by Facebook), that describe a page as a shareable object — its title, description, image, URL, and type. They control how a link preview card looks when the page is shared on Facebook, LinkedIn, Slack, Discord, WhatsApp, and iMessage. They are not a direct Google ranking factor, though Google reads og:title, og:image, and og:site_name as inputs to how a result appears. and Twitter Card tagsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor., and Article JSON-LD structured dataJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal.. URLs are clean and slug-based, and the default robots.txt disallows the /ghost/ admin path. Ghost is also fast by default — minimal JavaScript and good Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. out of the box.
In headless mode — Ghost used purely as a content backend via the Content API or Admin API, with a decoupled frontend like Next.js, Astro, or Nuxt — all of those built-in features go away. The sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., canonicals, meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding., and robots.txt become the frontend developer’s job to rebuild. The Content API does return the editorial metadata fields (meta_title, meta_description, og_*, twitter_*, canonical_url), but the frontend has to render them.
The biggest mistake in Ghost SEO is conflating the two modes — they are completely different problems. A separate constraint applies to both: members-only (gated) content is blocked server-side, so search engines can’t index it; that’s a deliberate trade-off, not a bug.
Related: Headless CMS SEO, JavaScript SEO
Build-time retrieval analysis plus live signals for this exact article. The automatic chunk report includes a deterministic readiness score and is ready without a model download.