No cookies · no consent banner · no sampling

Web analytics that answer
to you, not to an ad network.

GhostPane is a cookieless, self-hosted analytics platform that runs entirely on Cloudflare's edge. One script tag, and every number lands in a database inside your own account — no consent banner, no sampling, no monthly bill.

The entire installation. One tag, 1.7 KB gzipped, deferred.
<script defer data-site="YOUR_SITE_KEY" src="https://ghostpane.com/gp.js"></script>
The dashboard

Everything on one screen, in one query.

No report builder, no segments to define before you can see anything. The numbers below are a live sample of what the dashboard looks like.

Why this exists

Most analytics make you pay twice.

Once in page weight, and again in liability — a consent banner, a data-processing agreement, and a copy of your visitors sitting in someone else's warehouse. This removes both bills.

No cookie, so no banner

Visitors are recognised by a salted hash that is regenerated every day and never stored. Nothing is written to the device, so in most jurisdictions there is nothing to ask consent for.

Faster than the page it measures

The script is deferred, has no dependencies, and is served from the same edge network as your site. There is no third-party connection to open.

Your database, your rows

Everything lands in a D1 database in your own Cloudflare account. Export it as CSV at any time, or query it with SQL. There is nothing to migrate away from.

Every number is a real number

No sampling, ever. A dashboard for a busy month and a quiet month costs the same to load, because the counting already happened.

Live, without a polling bill

Current visitors are held in memory at the edge by the same component that does the counting, so the live view costs no database reads at all.

Bots filtered before they land

Running at the edge means every request arrives with a network-level bot score no page-side script can see. Junk traffic is dropped on the way in, not cleaned up later.

How it works

Count once, read forever.

The expensive part of analytics is aggregation. Most tools do it when you open the dashboard. This does it once, as the traffic arrives — which is why it stays fast and stays inside a free tier.

How a pageview travels through GhostPane A visitor's browser sends one request to the collector Worker at the nearest Cloudflare location, which answers immediately. The event is then passed to the site's aggregator, which stitches sessions and de-duplicates visitors, batches the counters, and writes pre-grouped rows to a D1 database that the dashboard reads. Browser 1.7 KB, deferred Collector nearest edge PoP Aggregator one per site D1 pre-grouped rows Dashboard one query answered here — visitor waits for nothing else hashes the visitor, no cookie sessions · de-duplication · batching 1,000 views → 1 row
The visitor's request is answered at the edge in a couple of milliseconds. Session stitching, visitor de-duplication and the write to the database all happen after the response has already gone back.
What it measures

Depth where it matters, nothing you'd never read.

Pageviews, visitors, visits, bounce rate and real engagement time out of the box, plus every breakdown below. Auto-capture is opt-in per feature — one attribute each — because an event nobody reads is still a row you pay for.

  • AudienceCountry, region, device, browser, OS and language, resolved at the edge with no lookup service.
  • AcquisitionReferrers, channels and full UTM campaign attribution, credited to the visit rather than the click.
  • PagesTop pages, entry pages, exit pages, and time on page from real engagement rather than request gaps.
  • ConversionsSignups, purchases and any custom event, with properties — filterable and breakable down by every dimension above.
  • Scroll depthHow far down the page people actually get, at 25, 50, 75 and 100 per cent.
  • Video & audioPlay, quarter, half, three-quarter and completion for every player on the page.
  • Core Web VitalsLCP, CLS, INP and TTFB from real visitors, as good, needs-improvement or poor.
  • JavaScript errorsUncaught errors and rejected promises, so a broken release shows up here first.
  • Outbound linksWhich links send people away, and where they go.
  • File downloadsPDFs, archives, documents and media, tracked without tagging a single link.
  • Form submissionsWhich forms get submitted. Never the values people typed into them.
  • Real-timeWho is on the site right now, which page they are on, and how they got there.
Side by side

What actually differs.

 GhostPaneGoogle Analytics 4Plausible Cloud
Cookies requiredNoYesNo
Consent banner neededNoYesNo
Data samplingNeverAbove thresholdsNever
Script size (gzipped)1.7 KB~50 KB~1 KB
Where the data livesYour Cloudflare accountGoogleTheir servers
Raw data exportCSV, any rangeBigQuery onlyCSV
Conversions + propertiesYesYesPaid plans
Core Web VitalsYesPartialNo
Video & audio engagementYesManual setupNo
JavaScript error trackingYesNoNo
Real-time visitorsYesYesYes
Self-hostableYesNoYes
Recurring costNoneFree, paid in data$9–19/mo
Have it installed

One payment. Then it is yours.

GhostPane is software you run, not a service you rent. I will set the whole thing up inside your own Cloudflare account — you keep the account, the data and the domain.

$299 one-time

No subscription. No per-pageview fees. No renewal.

  • Installed in your Cloudflare account
  • Custom domain and DNS configured
  • Migration from Google Analytics
  • Tracking snippet added to your site
  • Conversion events wired to your goals
  • 30 days of setup support
Request an install

What it costs to run afterwards

Usually nothing. It is built to fit inside Cloudflare's free tier — Workers, D1 and Durable Objects — and pageviews are counted into pre-grouped rows rather than stored one at a time, so the write budget goes a very long way.

Past roughly a million pageviews a month across all your sites, you would move onto Cloudflare's own usage pricing, which is a few dollars — paid to Cloudflare, not to me.

Prefer to do it yourself?

The whole thing deploys with one command. If you are comfortable with Wrangler and a Cloudflare API token, you do not need me at all.

Questions

Frequently asked

Do I need a cookie consent banner for this?

In most jurisdictions, no. Consent rules like the EU's ePrivacy Directive are triggered by storing or reading information on someone's device. GhostPane stores nothing on the device — no cookie, no localStorage, no fingerprint. Data protection law still applies to the processing itself, and you remain the controller for it, so check your own position if you have a specific obligation.

How does it count unique visitors without a cookie?

It hashes the visitor's IP address and user-agent together with a secret salt that is different for every site and regenerated every day. The salt is derived at the moment of use and never stored, and the raw IP address is never written anywhere. Within a day the same person produces the same id, so sessions and unique counts are real. Across days the salt has changed, so the ids cannot be linked.

Why does my visitor count look different from Google Analytics?

Two reasons, and both mean GhostPane is closer to the truth. It counts a returning visitor once per day rather than linking them across weeks, because the identifier is deliberately re-salted daily. And it filters bots at the edge using Cloudflare's network-level signals before anything is stored, which typically removes traffic GA never noticed.

What does it actually cost to run?

For most sites, nothing. It runs entirely inside Cloudflare's free tier: Workers, D1 and Durable Objects. Because pageviews are counted into pre-grouped rows rather than stored one by one, a busy site writes a fraction of the rows you would expect. There is no per-pageview fee because there is no vendor in the middle.

Can I see which countries or devices a conversion came from?

Yes. Conversions are stored with the full dimension set, so any event can be broken down by country, device, browser, referrer or campaign, and every dashboard filter applies to events as well as pageviews.

Does it work with React, Next.js, Vue, Astro or Angular?

Yes, with the same single script tag. Rather than integrating with any framework's router, the snippet hooks history.pushState and replaceState — the browser primitive all of them are built on — so client-side navigation is counted with nothing to configure. Hash-based routers need one extra attribute.

What happens to my data if I stop using it?

Nothing, because it never left your account. The database is yours, in your Cloudflare dashboard. You can export any range as CSV in one click, or query the D1 database directly with SQL. There is no export request to file and no lock-in to escape.

Get in touch

Tell me about your site.

Send this and I will reply with what the install would involve for your setup, and how long it takes. If it is not a fit, I will say so.

Or email support@ghostpane.com