Everything people ask,
answered properly.
Full answers rather than teasers — including the ones where the honest answer is "it depends on your jurisdiction" or "check your own position".
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.
Can I move my Google Analytics history across?
Yes. Export a report from GA4 as CSV with Date included — either the daily totals or a breakdown by page, country, device, browser, source or campaign — and it imports straight in. Imported days merge into the same tables as everything measured afterwards, so your twelve-month chart spans the switch. Days that already have data are skipped rather than overwritten, and you are told how many before anything is written.
Can it track revenue, not just conversions?
Yes. Pass an amount when you fire the event and the goal totals it in whatever currency you set, with the average order value beside it. Amounts are stored as whole hundredths rather than as floating point, so a year of sales still adds up to the figure your payment processor has — money summed as a float drifts, and an analytics total that disagrees with the bank by a few cents invites a reconciliation nobody can finish.
Does it have funnels, and are they honest?
Yes to both. A funnel chains goals into an order, and a visit is only counted at a step if it genuinely reached every step before it, in that order, within the same visit — someone who lands on your checkout page and then wanders back to pricing does not count as having progressed. Funnels are computed from row-level data, which means they need the detailed-data setting on and reach back as far as that site's retention window.
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.
Satisfied?
The whole thing installs into your own Cloudflare account in about two minutes.
One payment · runs in your own Cloudflare account · nothing reports back