Ghost already tells you who subscribed and who opened your last newsletter. It doesn't tell you who read the post, where they came from, or how far they scrolled before they left. Here's the honest split between the two, and how to add the second half in one paste.
One disambiguation before anything else: GhostMetrics has no relation to Ghost, the publishing platform. The name overlap is coincidental — GhostMetrics is a cookieless web analytics tool built by Null Agency, and Ghost is the CMS you're publishing on. They don't talk to each other, and neither one is built by the other's team.
If you just want the paste-and-go steps, jump to the Code injection how-to below.
Ghost is a publishing platform first, and its built-in analytics reflect that. Out of the box, Ghost Admin shows you member growth, subscription counts, and email performance — opens and clicks on the newsletters you send — because those are the numbers a publication runs on day to day.
Newer versions of Ghost also ship web traffic analytics alongside the member and email numbers. Exactly what that covers, and which plans include it, changes as Ghost ships updates — check the current Ghost docs for your version and plan.
What stays constant either way: Ghost's own analytics are scoped to Ghost's own data — your members, your newsletters, your subscribers. That's a genuinely useful, purpose-built view, and if member growth and email engagement are the only numbers your publication runs on, you may not need anything else. The gap shows up the moment you want to know what an anonymous, non-subscribed visitor did on your site before — or instead of — subscribing.
That gap isn't a flaw in Ghost, it's a boundary. A publishing platform's job is to run the publication — posts, members, billing, email delivery — not to fingerprint every anonymous visit for pattern analysis. Ghost draws that line deliberately, and it's the same line most CMSes draw. Self-hosted WordPress has no traffic analytics in core — it's a plugin decision. Newsletter platforms like Substack and Beehiiv report opens, clicks and subscriber growth natively; what each shows about site traffic differs per platform, so check its own docs. Ghost's point of difference is that it lets you add any third-party script at all — a second, purpose-built layer is what covers the rest.
A separate, cookieless analytics script answers a different question than Ghost's member dashboard: not "who subscribed," but "who showed up, and what did they do." That's referrers and source types (search, social, direct, referral), a UTM breakdown for campaigns you're running (source, medium, campaign), scroll depth on long-form posts, and Core Web Vitals — FCP, LCP, CLS, and TTFB from real visitors, not a lab test (note: INP is not one of the metrics captured).
It also adds custom events — the ability to count clicks on one specific button rather than inferring them from a pageview count. On a Ghost site, the obvious candidate is your Portal subscribe link, covered in its own section below.
The rest of the dashboard fills in around those numbers: visitors, pageviews, time on page, top pages, entry and exit pages, geography down to country and city (no IP address, since it's hashed rather than stored), and browser/OS/device breakdown. For a Ghost blog specifically, entry and exit pages are worth watching closely — they tell you which posts are actually pulling in cold traffic versus which ones are just being read by people who were already on the site, a distinction Ghost's own dashboard doesn't draw at all.
None of this touches Ghost's member or newsletter data. A cookieless site tool sees anonymous visits and page-level events; Ghost's own dashboard keeps the identity — who is actually a subscriber — entirely to itself. Run both, and you get the full picture: acquisition and on-site behavior from the site tool, subscriber identity and email engagement from Ghost. For the mechanics of cookieless tracking generally — what "no cookies" actually means technically — see our explainer on cookieless tracking.
The options for adding web traffic analytics on top of Ghost's native member and email stats. Cookies, install path, custom events, self-hosting and pricing model — the five things that actually decide this for a Ghost publisher.
| Option | Cookies | Install on Ghost | Custom events | Self-hostable | Pricing model |
|---|---|---|---|---|---|
| Google Analytics (GA4) | Yes (_ga) — needs consent in EU/UK | Code injection, gtag.js snippet | Yes | No | Free tier; BigQuery export free |
| Plausible | No | Code injection, script tag | Yes | Yes (Community Edition) | No free plan; from $9/mo (10k pageviews); 30-day trial, no card |
| Fathom | No | Code injection, script tag | Yes | No | No free plan; pageview-tiered from $15/mo (up to 100k/mo); 7-day trial |
| Umami | No | Code injection, script tag | Yes | Yes, or Umami Cloud | Free to self-host (infra cost only); Umami Cloud paid — check current pricing |
| GhostMetrics | No | Code injection, one script tag | Yes | No | Free (1 site); Pro $9.99/mo flat |
GA4 via Code injection is the "everyone already knows it" option, and it genuinely wins if you need ad attribution or ecommerce funnels — but it's the only one on this table that sets a cookie and generally needs a consent banner for EU/UK visitors, and its gtag.js snippet runs roughly 150 KB compressed against GhostMetrics' roughly 3 KB (our own measurement, 2026-09-10). Plausible is the EU-residency, open-source pick — code auditable, processing that never leaves the EU, and a self-hostable Community Edition if you want to run it yourself. Fathom has no free tier and prices by monthly pageviews (from $15/month for up to 100,000), but every plan includes at least 50 sites, useful if you run more than one Ghost publication. Umami is open source and free to self-host, at the cost of running the Node.js app and database yourself — or Umami Cloud if you'd rather not. GhostMetrics — ours, full disclosure — is the only hosted, cookieless option here with a free-forever plan (one site, unlimited pageviews) and raw event export on every plan, including free.
Ghost has one standard mechanism for adding any third-party script, and it's the same mechanism whether you're on Ghost(Pro) or running Ghost yourself: Code injection. It works identically for GA4, Plausible, Fathom, Umami, or GhostMetrics — only the snippet changes. Here's the process using GhostMetrics' tag as the concrete example.
<script defer src="https://ghostmetrics.nullagency.io/gm.js" data-site="YOUR-SITE-ID"></script>
<head> of every page it serves — no theme file to edit, and it survives a theme change.Because gm.js is deferred and loaded from Cloudflare's edge, it doesn't block anything else on the page from rendering. If you run a static site alongside or instead of the live Ghost server, the same tag drops into whatever templating layer generates your <head> — see our static-site analytics guide for the framework-specific spots to put it.
Most Ghost themes render the newsletter signup prompt as a link that opens Ghost's built-in Portal overlay via a URL hash — typically something like href="#/portal/signup". That link is a normal anchor tag in your theme's markup, which means you can add a tracking attribute to the exact same element without touching Portal itself.
<a href="#/portal/signup" data-gm-event="portal-signup-click">Subscribe</a>
GhostMetrics' custom events work two ways: declaratively, by adding a data-gm-event="name" attribute to any element (as above — clicks are caught by one delegated listener on the document, so it also works on buttons a theme or a script renders after the page has already loaded), or programmatically, with window.ghostmetrics.track('name', { section: 'pricing' }) from your own code. Either way, the event is recorded with the page path and any UTM already attached to that visitor's session — there's no numeric value or revenue field, and no funnel that follows one visitor across multiple sessions. One Ghost-specific caveat: tag the link in your theme's markup, not anything inside the Portal overlay itself — Portal renders in an iframe, and clicks inside it never reach the listener on your page.
The result shows up as a row in the Custom Events panel — event name, count, and when it last fired. The panel itself doesn't break that down by page or campaign; for "which issue drove the subscribe clicks", export the raw events as CSV or JSON (every plan, including free) and group by utm_campaign. Either way it's a number Ghost's own member dashboard doesn't give you, because Ghost only knows about a click once it turns into an actual subscription. The click itself, including the ones that didn't convert, is where a site-level tool adds information Ghost never had.
If your Ghost publication has European readers, the analytics choice you make is also a consent-banner choice. GA4 sets a _ga cookie by default, and consent is generally required for cookie-based tools in the EU/UK — see our breakdown of GA4 and GDPR for what that requirement actually involves.
A cookieless tool is a different technical shape: no cookies, no localStorage, no IP address stored (GhostMetrics hashes it), no personal data, and no identifier that follows a visitor across sessions. GhostMetrics also honors Global Privacy Control and Do Not Track — when either is set, it collects nothing for that visitor at all. Plausible and Umami are built the same cookieless way; Fathom is too.
None of that is a substitute for your own legal review — whether a specific site needs a consent banner depends on everything else running on the page (ad pixels, embeds, other scripts), not just the analytics tool. What it does mean is that the analytics layer itself isn't the thing forcing the banner, which is the opposite of GA4's default setup. If you're weighing this question in more depth, our piece on GDPR-compliant analytics tools covers it across more platforms than Ghost alone.
None of the above means every Ghost publication needs a second tool bolted on. If your entire editorial loop runs on subscriber growth and email opens — you write, you send, you watch the subscribe count and the open rate move — Ghost's native dashboard already answers the questions you're actually asking. Adding a site analytics layer you never look at is just more dashboards to ignore.
The decision point is usually one specific question you can't currently answer. "Which post brought in the most new, non-subscribed readers this month?" Ghost's member dashboard can't tell you, because it only sees people once they subscribe. "Did the traffic from that guest-podcast mention actually convert into subscribe-link clicks?" Same gap — Ghost sees the eventual subscription, not the click that led to it, and not the visits that didn't convert at all. If a question like that has come up more than once, that's the signal to add the second layer rather than keep guessing from subscriber totals alone.
It's also not an either/or choice in terms of effort. Code injection is one paste, it doesn't touch your theme, and removing it later is just deleting the same line — there's no migration, no data lock-in, and no risk to the member and email data Ghost already owns. Trying it costs a few minutes; the honest downside is a dashboard you decide not to check.
GhostMetrics is cookieless web analytics that drops into Ghost's Code injection field as one script tag — no plugin, no theme edit, no build step, and it works the same on Ghost(Pro) and self-hosted Ghost. The free plan is free forever: one site, unlimited pageviews, real-time dashboard, every dashboard view, full history, no card required.
Publishing more than one site, or want a public shareable dashboard URL? Pro is $9.99/mo flat, unlimited pageviews, unlimited websites (fair-use ceiling of 250), with a 30-day free trial — a card starts the trial, nothing is charged for 30 days, cancel anytime. Raw event export as CSV or JSON is on every plan, including free. It does not read Ghost's member or newsletter data — that stays in Ghost, entirely separate.
Start free — one paste into Code injection See the live demoDisclosure: GhostMetrics is built by Null Agency and we use it on this site, so we're not a neutral party about our own product — we've kept the claims to what the free and paid plans actually do, and pointed to Ghost's own native analytics and other tools where they genuinely fit better. Pricing for third-party products can change; always check the vendor's current pricing page before deciding.