Ghost Google Indexing: Complete Guide to Getting Your Ghost Content Into Search Results
Ghost is built for content creators who care about speed, simplicity, and reader experience. Its clean architecture and minimal bloat make it naturally search-friendly, but proper configuration is still essential for reliable indexing. This guide covers everything Ghost-specific you need to know.
In this guide
Ghost is an open-source publishing platform built specifically for professional bloggers, newsletter creators, and content-driven businesses. Unlike general-purpose CMS platforms like WordPress, Ghost is laser-focused on content creation and distribution. This focus means Ghost's architecture is inherently SEO-friendly: server-side rendered HTML with minimal JavaScript, fast page loads with zero plugin bloat, clean semantic markup, and automatic meta tag generation.
Ghost has been gaining significant adoption among independent publishers, media startups, developer blogs, and knowledge-base sites. Its built-in membership and subscription features (free and paid tiers) make it particularly popular for creators who want to monetize their content. However, the membership system introduces a unique indexing challenge: content behind a paywall is not accessible to Googlebot, which means paid content cannot be indexed unless you implement specific workarounds.
Ghost comes in two flavors: Ghost(Pro), the managed hosting service where Ghost handles all server configuration, and self-hosted Ghost, where you install and manage Ghost on your own server. The SEO fundamentals are identical, but self-hosted Ghost requires additional attention to server-level configuration like SSL, reverse proxy settings, and domain management.
This guide covers both Ghost(Pro) and self-hosted installations, walking through every configuration point that affects indexing. Whether you are launching a new Ghost publication, migrating from WordPress, or troubleshooting why your Ghost posts are not appearing in Google, the steps and fixes here are specific to Ghost's architecture and features.
Ghost's Built-In SEO Features
Ghost includes robust SEO features out of the box, with no plugins or extensions needed. The platform automatically generates title tags from your post titles with a configurable pattern (editable in Ghost admin under Settings > General), meta description tags from your post excerpts or custom meta descriptions, canonical URLs on every post and page, an XML sitemap at /sitemap.xml with sub-sitemaps for posts, pages, tags, and authors, structured data (JSON-LD) for Articles including author, publisher, datePublished, and image, Open Graph and Twitter Card meta tags for social sharing, and a robots.txt file that allows all crawlers.
Ghost's HTML output is exceptionally clean. A typical Ghost post page contains the post content in semantic HTML within an <article> element, proper heading hierarchy starting with h1 for the post title, schema.org structured data in the <head>, and minimal JavaScript — Ghost's frontend is primarily server-rendered HTML with optional JavaScript for interactive features like search and comments.
This clean architecture gives Ghost a significant speed advantage. Ghost pages typically load in under 1 second, with Time to First Byte under 100ms on Ghost(Pro) and well under 200ms on properly configured self-hosted installations. Google's crawlers respond positively to fast sites by allocating more crawl budget and processing pages more quickly.
Ghost also supports AMP (Accelerated Mobile Pages) natively through the Amperize library, though AMP adoption has declined significantly. More importantly, Ghost's default mobile performance is excellent enough that AMP provides minimal additional benefit for indexing purposes.
Configuring Meta Tags and Canonical URLs in Ghost
Every post and page in Ghost has dedicated fields for SEO customization. In the post editor, click the gear icon to open the post settings sidebar, then scroll down to the "Meta data" section. Here you can set a custom Meta title (overrides the post title in the <title> tag), a custom Meta description (overrides the auto-generated excerpt), and a custom Canonical URL (overrides the default self-referencing canonical).
The Meta title field is your opportunity to optimize the title that appears in Google search results. While your post title might be creative or long-form ("Why We Rebuilt Our Entire Infrastructure in Rust and What We Learned"), your Meta title should be concise and keyword-optimized ("Rebuilding Infrastructure in Rust: Lessons Learned"). Keep it under 60 characters for full display in search results.
The Canonical URL field is particularly important for republished content. If you publish a post on Ghost that originally appeared on your Medium account, Substack, or another platform, set the Canonical URL to the original publication's URL to avoid duplicate content penalties. Conversely, if Ghost is your original publication and you syndicate to other platforms, those platforms should set their canonical tags pointing back to your Ghost post.
Ghost's tag pages (/tag/tagname/) automatically get title tags in the format "Tag Name - Site Name" with a meta description pulled from the tag's description field (if you set one in the Ghost admin under Tags). Author pages (/author/authorname/) follow the same pattern. These archive pages are included in the sitemap by default, which is appropriate for multi-author publications but may create thin content pages for single-author blogs where the author page is just a duplicate of the main index.
You can also add custom meta tags site-wide through Ghost's Code Injection feature (Settings > Code injection > Site Header). This is useful for adding verification meta tags for Google Search Console, custom structured data, or site-wide robots directives.
The routes.yaml File and URL Structure
Ghost's URL structure is controlled by the routes.yaml file, a powerful configuration file that defines how content is organized and served. By default, Ghost uses a simple URL structure: posts are at /slug/, pages are at /slug/, tag archives are at /tag/slug/, and author archives are at /author/slug/.
The routes.yaml file allows you to customize this completely. You can create custom collections that filter posts by tag, author, or custom attribute and serve them at custom URL paths. For example, you could create separate sections for /news/, /tutorials/, and /reviews/ that each display different tagged posts. You can also create custom taxonomies, redirect old URLs, and define the homepage content.
For indexing, the routes.yaml configuration matters because it determines your URL structure, which Google uses as a signal for site architecture. A well-organized URL structure with logical paths (/tutorials/getting-started, /news/product-update) helps Google understand your content hierarchy.
Changing routes.yaml on a live site requires careful planning. If you restructure URLs, all old URLs will return 404 errors unless you add redirects. Ghost has a built-in redirects.yaml (or redirects.json) file for managing 301 redirects. Upload this file through Settings > Labs > Redirects.
The redirects file supports regex patterns, which makes it more powerful than the redirect tools in Squarespace or Webflow. For example, you can create a redirect pattern like ^/old-section/(.*)$ to /new-section/$1 to redirect an entire section at once. Always test regex patterns carefully before deploying them to production, as a misconfigured redirect can create infinite loops.
For Ghost(Pro) users, routes.yaml and redirects are managed through the Ghost admin interface. For self-hosted Ghost, these files live in your Ghost content directory and can be edited directly via the filesystem or uploaded through the admin.
Members-Only Content and Indexing
Ghost's membership system is one of its defining features. You can gate content behind free membership (email required) or paid subscription tiers. This creates a fundamental tension with SEO: paywalled content is invisible to Googlebot because Google cannot create an account or provide payment credentials.
When a visitor without an active session accesses a members-only post, Ghost can be configured to show nothing (the entire post is hidden), a content preview (first few paragraphs visible, rest hidden behind a CTA), or a paywall message (a prompt to sign up or subscribe). The behavior depends on your theme and your Ghost content settings.
For indexing, the preview behavior is critical. If Google sees only a paywall message with no content, the page has no indexable text and will likely be classified as thin content. If Google sees a content preview with meaningful text, it can index the preview as a representative snippet of the full content.
To configure content previews for members-only posts, use Ghost's content visibility settings. In the post editor, click the gear icon, go to the "Access" section, and choose the visibility level. For posts set to "Members only" or "Paid members only," Ghost hides content below the <!--members-only--> marker (if using the Card editor) or after a configurable number of paragraphs.
Google's Flexible Sampling program allows publishers to show paywalled content to Googlebot by implementing specific structured data. Ghost supports this through custom JSON-LD that includes isAccessibleForFree: false and the hasPart property defining which sections are free and which are paywalled. Implementing this requires custom code in your Ghost theme or through Code Injection.
The practical recommendation for most Ghost publishers: make the first 2-3 substantial paragraphs of every members-only post visible to non-authenticated visitors. This gives Google enough content to index a meaningful snippet and rank the page for relevant queries. Readers who find the post through search then see the preview and are prompted to become members to read the full article. This approach maximizes both indexing and conversion.
Self-Hosted Ghost: Server-Level SEO Configuration
Self-hosted Ghost installations require attention to server configuration that Ghost(Pro) handles automatically. The most critical configuration points for indexing are:
SSL/HTTPS: Ghost must be served over HTTPS for Google to trust and prioritize your site. Self-hosted Ghost typically runs behind a reverse proxy (Nginx, Caddy, or Apache) that handles SSL termination. Use Let's Encrypt for free SSL certificates and configure automatic renewal. Ghost's config.production.json must have the url property set to your HTTPS URL (https://yourdomain.com, not http://). If this URL is wrong, Ghost generates canonical tags and sitemap URLs with the wrong protocol, which breaks indexing.
Reverse proxy configuration: Ghost runs on a Node.js server (typically port 2368) behind a reverse proxy. The proxy configuration must pass the correct Host header to Ghost, or Ghost will generate URLs based on the server's internal hostname instead of your public domain. In Nginx, this means including proxy_set_header Host $http_host; and proxy_set_header X-Real-IP $remote_addr; in your location block.
Server performance: Ghost is extremely fast on its own, but underpowered servers can negate this advantage. Ghost requires at least 1GB of RAM for comfortable operation. On a server with 512MB or less, Ghost can swap to disk during traffic spikes, causing response times to spike above 5 seconds — far too slow for efficient Google crawling. Monitor your server's memory usage and upgrade if Ghost is consistently using more than 80% of available RAM.
Database configuration: Ghost uses MySQL or SQLite as its database. For production sites, MySQL is recommended. A misconfigured MySQL instance with small connection pool or insufficient memory allocation can cause intermittent 500 errors when multiple pages are requested simultaneously (as happens during a Google crawl). Ensure your MySQL configuration allows at least 10 concurrent connections and has adequate buffer pool size.
CDN configuration: Many self-hosted Ghost sites use a CDN (Cloudflare, Bunny, or similar) for caching and performance. Ensure your CDN does not cache HTML pages for too long, or changes to your posts (including meta tag updates) will not be visible to Google for hours. Set HTML caching to short TTL (5-10 minutes) or use cache tags to purge specific pages when content changes.
Ghost Themes and Their Impact on SEO
Ghost themes control the HTML output of your site. The default theme (Casper) is well-optimized for SEO, with proper heading hierarchy, semantic markup, structured data, and responsive design. However, custom themes can introduce SEO issues if the theme developer did not prioritize search engine friendliness.
Common theme-related SEO issues include missing or incorrect structured data — some themes override Ghost's default JSON-LD with their own implementation that may have errors or omit required properties. Broken heading hierarchy — a theme might use h1 for the site title and h2 for post titles, pushing the main content headings to h3 and below. Incorrect canonical tags — themes that implement their own canonical logic instead of using Ghost's built-in {{ghost_head}} helper can generate wrong canonical URLs. Missing meta tags — if a theme does not include the {{ghost_head}} helper in its <head> section, Ghost's automatic meta tags (title, description, canonical, OG tags, structured data) are not output.
Always verify that your Ghost theme includes {{ghost_head}} in the <head> section of the default.hbs template and {{ghost_foot}} before the closing </body> tag. These helpers are essential — they output all of Ghost's automatic SEO tags. If your theme is missing either one, your entire SEO infrastructure is broken.
When switching themes on Ghost, the visual design changes but your content, URLs, and meta data remain intact (as long as the new theme includes the Ghost helpers). However, if the old theme had custom structured data or meta tags in its templates, those will be lost when switching. Before changing themes, audit the old theme's SEO output and ensure the new theme provides equivalent or better SEO features.
For developers building custom Ghost themes, Ghost provides a comprehensive set of Handlebars helpers for SEO: {{meta_title}}, {{meta_description}}, {{canonical_url}}, and the all-in-one {{ghost_head}} helper. Use these helpers rather than hard-coding meta tags to ensure your theme works correctly with Ghost's SEO system.
Step-by-Step Guide
Verify SSL and URL configuration
For Ghost(Pro): your SSL is handled automatically. Verify by visiting your site and confirming the URL bar shows HTTPS with a lock icon. For self-hosted Ghost: check your config.production.json file and verify the "url" property is set to your full HTTPS URL (e.g., https://yourdomain.com). Visit your site and confirm HTTPS works. If SSL is not configured, set up Let's Encrypt through your reverse proxy (Nginx or Caddy). Then visit yourdomain.com/sitemap.xml and verify all URLs in the sitemap use HTTPS. If sitemap URLs show HTTP, your Ghost URL configuration is wrong.
Submit your sitemap to Google Search Console
Add your Ghost site as a property in Google Search Console. For verification, use the HTML tag method: copy the verification meta tag from Google Search Console, then in Ghost admin go to Settings > Code injection > Site Header and paste the meta tag. After verification, go to Sitemaps in Google Search Console and submit yourdomain.com/sitemap.xml. Ghost's sitemap is a sitemap index containing sub-sitemaps for posts, pages, tags, and authors. After submission, verify the sitemap is accepted and check the count of discovered URLs.
Configure meta titles and descriptions for all posts and pages
In the Ghost editor, open each post's settings sidebar (gear icon) and scroll to the "Meta data" section. For every post, write a custom Meta title under 60 characters with your target keyword and a custom Meta description under 155 characters that compels clicks. Do the same for all pages (About, Contact, etc.). For tag pages, go to Tags in the Ghost admin, edit each tag, and add a description — this description is used as the meta description for the tag archive page. For your homepage, set the site meta title and description at Settings > General > Meta data.
Configure content visibility for members-only posts
If you use Ghost's membership features, decide how much content to show to non-authenticated visitors (and therefore Googlebot). For maximum indexability, configure your theme or post settings to show the first 2-3 paragraphs of every members-only post as a free preview. In the post editor, use the <!--members-only--> card divider to mark where free content ends and members-only content begins. Verify by visiting a members-only post in an incognito browser window to see exactly what non-members (and Googlebot) see. If the preview is too short or shows only a paywall message, adjust the divider position.
Set up redirects for any URL changes
If you have changed any post slugs, restructured your routes.yaml, or migrated from another platform, set up 301 redirects. In Ghost admin, go to Settings > Labs > Redirects and upload a redirects.json or redirects.yaml file. The file format supports exact path matching and regex patterns. For example: {"from": "/old-post-slug", "to": "/new-post-slug", "permanent": true}. For regex redirects: {"from": "^/old-section/(.*)", "to": "/new-section/$1", "permanent": true}. After uploading, test each redirect by visiting the old URL and confirming it lands on the correct new URL.
Verify theme SEO output
Visit your Ghost site's homepage and a few posts in a browser. View the page source and verify: (1) the <title> tag matches your configured meta title, (2) a <meta name="description"> tag is present with your configured description, (3) a <link rel="canonical"> tag points to the correct URL, (4) JSON-LD structured data is present in a <script type="application/ld+json"> block, and (5) Open Graph meta tags are present. If any of these are missing, your theme may not include the {{ghost_head}} helper. Edit the theme's default.hbs file and add {{ghost_head}} inside the <head> section.
Use IndexBolt to accelerate indexing of your Ghost content
Ghost blogs often face the chicken-and-egg problem: new publications need search traffic to grow, but Google is slow to index sites without established authority. After completing all technical configuration, submit your published post URLs through IndexBolt. Start with your cornerstone content — the comprehensive, high-value posts that you want ranking first. Then submit new posts as you publish them. Ghost's fast page loads and clean HTML mean Google processes IndexBolt submissions quickly, often indexing Ghost pages within hours of submission.
Common Issues & How to Fix Them
Self-hosted Ghost URL configured with HTTP instead of HTTPS
Cause: The url property in Ghost's config.production.json is set to http://yourdomain.com instead of https://yourdomain.com. Even if your reverse proxy (Nginx/Caddy) terminates SSL and serves the site over HTTPS, Ghost generates all canonical tags, sitemap URLs, and internal links using the configured URL. If it is HTTP, all these references point to the wrong protocol.
Fix: Edit your config.production.json file and change the url property to https://yourdomain.com. Restart Ghost for the change to take effect (ghost restart). Then verify by visiting your sitemap at /sitemap.xml and confirming all URLs use HTTPS. Also check your canonical tags by viewing the page source. If you had the wrong URL for a long time, Google may have indexed HTTP URLs — monitor Google Search Console and let the canonical tags naturally correct this over time.
Members-only content completely invisible to Googlebot
Cause: Members-only posts that show no content preview to non-authenticated visitors are completely invisible to Googlebot. Google sees the page but finds only a paywall message or empty content area, resulting in the page being classified as thin content or not indexed at all. All the content's potential search visibility is lost.
Fix: Configure each members-only post to show a meaningful content preview (2-3 paragraphs minimum) to non-authenticated visitors. Use the <!--members-only--> content divider in the post editor to define where the free preview ends. Update your theme if it does not support content previews for members-only posts. For paid content, consider implementing Google's Flexible Sampling structured data to signal to Google that the content exists but is paywalled.
Ghost theme missing the {{ghost_head}} helper
Cause: A custom Ghost theme that does not include the {{ghost_head}} Handlebars helper in its <head> section will not output any of Ghost's automatic SEO tags: no title tag, no meta description, no canonical URL, no structured data, no Open Graph tags. The site may look fine visually but is severely crippled for search engines.
Fix: Edit the theme's default.hbs (or base.hbs, depending on theme structure) and add {{ghost_head}} inside the <head> section, typically just before the closing </head> tag. Also add {{ghost_foot}} just before the closing </body> tag. Upload the updated theme through Ghost admin > Settings > Design > Change Theme > Upload Theme. After uploading, verify the SEO tags are present by viewing your site's page source.
Route changes in routes.yaml causing mass 404 errors
Cause: Modifying routes.yaml to change URL patterns (e.g., moving blog posts from /post-slug/ to /blog/post-slug/) immediately changes the URLs of all affected content. Without corresponding redirects, every old URL returns a 404. Any external links, bookmarks, or indexed URLs pointing to the old paths break.
Fix: Before changing routes.yaml, export a list of all current URLs from your sitemap. After changing routes.yaml, create a redirects.json file with 301 redirects from every old URL pattern to the new pattern. Use regex redirects for bulk patterns: {"from": "^/(?!blog/)([a-z0-9-]+)/$", "to": "/blog/$1/", "permanent": true}. Upload the redirects file through Settings > Labs > Redirects. Test by visiting old URLs and confirming they redirect to the new locations.
Tag and author archive pages with thin content
Cause: Ghost automatically creates archive pages for every tag and author. On a single-author blog, the author archive page is essentially a duplicate of the main index. Tags with only one or two posts create thin archive pages. These pages are included in the sitemap by default, which means Google discovers and crawls them, but they add no unique value.
Fix: For single-author blogs, add a canonical tag on the author page pointing to the homepage (requires theme customization). For tags with few posts, consider merging them into broader tags to create more substantial archive pages. If you have many thin tag pages, add unique introductory content to each tag's description field in Ghost admin (this appears on the tag page if your theme supports it). Alternatively, add noindex tags to thin archive pages through custom code in the theme's tag.hbs and author.hbs templates.
Pro Tips
Ghost is built for speed and content quality — two things Google values highly. But even the fastest, cleanest blog needs to be discovered before it can rank. IndexBolt bridges the gap between publishing and indexing, pushing your Ghost posts into Google's index within hours. Pair Ghost's technical excellence with IndexBolt's indexing speed for the fastest path from draft to search results.
100 free credits. No credit card required. See results in under 24 hours.
Frequently Asked Questions
Does Ghost have good SEO out of the box?+
Yes, Ghost has excellent built-in SEO. It automatically generates title tags, meta descriptions, canonical URLs, XML sitemaps, JSON-LD structured data, and Open Graph tags. Its server-side rendering and minimal JavaScript result in fast page loads and clean HTML that Google can parse instantly. Most Ghost users do not need any SEO plugins or extensions — the built-in features cover all technical SEO requirements. The main area where manual configuration helps is writing custom meta titles and descriptions for each post.
Can Google index members-only content on Ghost?+
Google cannot access content behind Ghost's membership gate. If a post is set to members-only or paid-members-only, Googlebot sees only what a non-authenticated visitor sees. To make members-only content partially indexable, configure your posts to show a content preview (first 2-3 paragraphs) to non-members. This gives Google enough content to index and rank the page, while readers must become members to access the full article.
Should I use Ghost(Pro) or self-hosted Ghost for better SEO?+
Both options produce identical SEO output — the same HTML, sitemaps, meta tags, and structured data. Ghost(Pro) has the advantage of managed SSL, automatic updates, global CDN, and zero server maintenance, which means fewer opportunities for server-level misconfigurations that could affect indexing. Self-hosted Ghost gives you more control over server headers, caching, and custom redirects. For most users, Ghost(Pro) is the safer choice for SEO because it eliminates server configuration as a variable.
How do I handle URL changes when restructuring my Ghost blog?+
Ghost uses the routes.yaml file for URL structure and the redirects.json (or redirects.yaml) file for managing redirects. Before changing routes.yaml, document all current URLs. After changing the route structure, create 301 redirects in the redirects file for every affected URL. Ghost supports regex redirects, so you can redirect entire URL patterns with a single rule. Upload the redirects file through Settings > Labs > Redirects. Always test redirects after uploading.
Why are my Ghost tag pages not getting indexed?+
Ghost tag archive pages are included in the sitemap by default, but Google may choose not to index them if they have thin content. A tag page with only one or two posts does not provide enough unique content to warrant indexing. Additionally, if the tag's description field in Ghost admin is empty, the tag page has no unique text — just a list of post excerpts that appear elsewhere. Add unique descriptions to your tags, merge thin tags, or add noindex tags to low-value archives through theme customization.
How long does it take for a new Ghost blog post to appear in Google?+
For established Ghost blogs with regular publishing schedules and decent domain authority, new posts can appear in Google within 1-3 days. For newer Ghost publications, it may take 1-4 weeks. Ghost's fast page loads and clean HTML help — once Google crawls the page, it processes and indexes quickly. Using IndexBolt to submit new post URLs can reduce the time to hours, regardless of your blog's authority level.