Add comments to a Ghost site without Ghost members
Ghost's built-in comments require every reader to become a member before they can say a word, and Ghost points anyone who wants anonymous commenting at third-party tools. This guide adds a comment section that works without membership, through either a one-block theme edit or Code Injection, and explains which to choose.
Ghost has shipped native comments since version 5, and they are good at what they are for. They are also gated: "Commenting is limited to logged-in members. If readers want to contribute to the discussion, they need to sign up for a free or paid membership to your site" (Ghost help: commenting, read on 3 September 2026). The same page is candid about the alternative: "If you want to implement anonymous commenting or require other advanced commenting features, see our third-party integrations for other commenting tools."
For a paid newsletter, members-only comments are the right design; the comment section is a perk of subscribing. For a public blog on Ghost, it means the reader who wants to leave one sentence has to create an account first, and most will not. This guide adds a comment section that lets readers comment as guests or sign in with Google, GitHub, X or Facebook, without touching your membership settings. There are two ways to install it, and the choice depends on whether you are willing to edit your theme.
The widget is EchoThread's, a single script under 60 KB gzipped, loaded asynchronously so a Ghost page stays as fast as Ghost made it. Every comment is scored by a machine-learning spam filter before it appears. We build EchoThread, so treat our claims as claims. The shorter, screenshot version of the theme route is the Ghost integration guide, and the earlier Ghost post covers the general case of why and how; this one is specifically about getting out from under the membership requirement.
Before you start
- A Ghost site on 5.x, hosted on Ghost(Pro) or self-managed. You need Administrator access.
- An EchoThread account (create one free), a site added in the dashboard with your Ghost site's domain, and that site's API key.
Route A: edit post.hbs (recommended)
Ghost has no plugin system; post-level markup lives in the theme. Both official themes put the native comments block in post.hbs, guarded by {{#if comments}}. In Source, the current default:
{{#if comments}}
<div class="gh-comments gh-canvas">
{{comments}}
</div>
{{/if}}Casper wraps it in instead, but the guard and the {{comments}} helper are the same. Replace the whole block with:
<div class="gh-comments gh-canvas">
<div id="echothread"
data-api-key="YOUR_API_KEY"
data-page-url="{{url absolute="true"}}"
data-identifier="{{id}}"
data-page-title="{{title}}"></div>
<script src="https://cdn.echothread.io/widget.js" async></script>
</div>Replace YOUR_API_KEY with the key from your dashboard. It is a public key meant to live in page source; it only lets visitors read and post on the domain you registered.
Inside post.hbs the template context is the post, so three Handlebars values fill the attributes. {{url absolute="true"}} is the post's full public address; Ghost's helper docs note that {{url}} alone "outputs the relative url for a post when inside the post scope", and the absolute="true" attribute is what turns it into the full URL the widget needs (Ghost {{url}} helper, read on 3 September 2026). {{id}} is the post's internal object ID, and {{title}} is its title.
You do not need a local Ghost install to do this. Download the active theme from Settings → Design & branding → Theme, edit the one file, zip the folder and upload it back under the same menu. Ghost activates the new version immediately.
Why {{id}} and not the URL
data-identifier is what keeps a discussion attached to a post. Ghost rewrites a post's slug when you edit its title in many workflows, so a thread keyed to the URL would detach every time an editor tightened a headline. The object ID never changes. This is the single strongest reason to prefer the theme route over Code Injection, which cannot read {{id}}.
Route B: Code Injection (no theme edit)
Ghost's Code Injection adds HTML to every page without changing the theme. It lives under Settings → Code injection, with a Site header field injected into and a Site footer field injected before the closing tag; the same two fields exist per post under the post settings sidebar (How to use Code Injection in Ghost, read on 3 September 2026).
Code Injection is plain HTML. Ghost does not run Handlebars helpers inside it, so {{url}} and {{id}} are not available, and the snippet has to work out where it is from the page itself. Paste this into Site footer:
<script>
(function () {
// Official Ghost themes add "post-template" to <body> on post pages.
if (!document.body.classList.contains('post-template')) return;
var content = document.querySelector('.gh-content') || document.querySelector('article');
if (!content) return;
var mount = document.createElement('div');
mount.id = 'echothread';
mount.className = 'gh-canvas';
mount.setAttribute('data-api-key', 'YOUR_API_KEY');
mount.setAttribute('data-page-title', document.title);
content.insertAdjacentElement('afterend', mount);
var s = document.createElement('script');
s.src = 'https://cdn.echothread.io/widget.js';
s.async = true;
document.body.appendChild(s);
})();
</script>The body-class check keeps the widget off your home page, tag pages and about page. .gh-content is the article body wrapper in Source and Casper; if your theme uses another class, change the selector, or fall back to article as the snippet does. With no data-page-url or data-identifier, the widget uses the page URL for both, which is correct as long as your slugs stay put.
To trial on one post before committing, paste the same snippet into that post's own Code injection → Post footer instead of the site-wide field.
Route B is quicker and survives theme updates untouched. Its cost is the identifier: threads are keyed to URLs, so a slug change detaches a discussion. If your editors rarely rename published posts, that is an acceptable trade. If they do, use Route A.
Ghost's own comments after the change
With Route A, Ghost's comments stop rendering as soon as {{comments}} is gone from the template; you can leave the setting alone. With Route B, the native block still renders above yours if commenting is enabled. Either way, the clean finish is Settings → Membership → Commenting → Nobody, which also stops Ghost sending its own comment notification emails once the real discussion has moved.
Your membership settings are otherwise untouched. Members, paid tiers and newsletters keep working exactly as before; the only thing that changes is who is allowed to comment.
Theming
The widget follows the page's light or dark scheme by default. To pin it or match your accent, add attributes to the container (Route A) or extra setAttribute calls (Route B):
data-theme="dark"
data-accent-color="#15171a"
data-font-family="inherit"data-theme accepts light, dark or a hex background, and data-font-family="inherit" uses the theme's font. The full attribute list is in the docs.
Troubleshooting
- Nothing renders. Check the API key in the dashboard, and that the registered domain matches your Ghost site's domain exactly, including
wwwif you use it. - The widget appears on the home page. You used Route B and your theme does not set
post-templateon the body. Check the body classes in your theme'sdefault.hbs, and adjust the check. - Handlebars values print as literal text. You pasted the Route A snippet into Code Injection. Code Injection does not process helpers; use the Route B snippet there.
- Threads detached after renaming posts. Route B keys threads to URLs. Move to Route A, which keys them to
{{id}}, or export and re-import threads against the new URLs.
What it costs
EchoThread's Hobby plan is free for one site, with comments included, no ads and no reader tracking. Sites created from 1 October 2026 include 10,000 page views a month on Hobby; a site created before that date keeps unmetered page views. Paid plans start at $9 a month for three sites and 100,000 page views; see pricing for the full ladder.
If you are weighing Ghost's members-only model against open commenting more broadly, why free commenting systems have drawbacks is the honest version of what you give up either way, and the Disqus alternative without ads post covers the option most Ghost publishers try first.
Discussion
Comments
This thread runs on EchoThread — the same widget you would add to your own site.