Skip to content

Privacy-first web analytics

Counts footsteps. Never faces.

GhostMetrics tells you which pages people visit, where they came from and what they finish. In Lightweight mode the script leaves nothing on their device and the server keeps no IP address. You get the numbers. Your visitors stay strangers.

Night street of small shops. A geometric ghost slips through a brick wall holding a lantern while glowing footprints lead into a shop and small bars rise beside them.
TALLY ON THE NIGHT SHIFT

We track 0 websites and store more than 0 pageviews.

~2 KB core Lightweight script, minified 0 cookies set by the tracking script 0 IPs stored in Lightweight mode Auto deletion after your plan's retention window

Chapter 1 · The pact

Four rules the ghost keeps

Every ghost story has rules. Ours are written in the code, so you can check them. The steps get taller as they go, because the last one matters most.

  1. RULE 01

    Count footsteps, not faces

    A pageview is a footstep: a path, a referrer, a country, a kind of device. No names, no emails, no profiles stitched across sites.

    Tally studies a line of footprints through a magnifier.
  2. RULE 02

    Pass through, leave nothing

    The Lightweight script sets no cookies and writes nothing to localStorage. It sends one small beacon per page and goes.

    Tally halfway through a wall.
  3. RULE 03

    Carry a lantern, not a camera

    We light up totals and trends. If you switch on session replays in Advanced mode, you choose which parts of the page get hidden from the recording.

    Tally holds a lantern over a small bar chart.
  4. RULE 04

    Forget on schedule

    Every event gets an expiry date when it arrives. Your plan sets the window. After that, the ghost forgets.

    Tally wears a sleep mask over its eyes.

Chapter 2 · X-ray

What the ghost actually carries

Drag the lens across the visitor. Behind the blur there is a person. Through the lens there are only the fields our script really sends, copied from its source.

// POST /pixel-track/{pixel_key} via navigator.sendBeacon
// from pixel-header.js (Lightweight)
{
  "type": "landing_page",
  "url": "https://your.site/pricing?utm_source=newsletter",
  "data": {
    "path": "/pricing",
    "referrer": "https://news.example/",
    "utm": { "source": "newsletter", "medium": null, "campaign": null },
    "resolution": { "width": 1440, "height": 900 },
    "timezone": "Europe/London",
    "theme": "dark"
  }
}
// Advanced mode adds what it needs to tell sessions apart:
// a random visitor ID kept in the browser's localStorage
// (pixel-visitor-and-events.js). No cookie.
// The server masks IP digits as *** unless the admin AND the
// site owner both switch IP storage on (PixelTrack.php:402).
// Heatmaps and session replays only run when enabled per site.
  • [email protected]never sent
  • Ada Lovelacenever sent
  • 81.2.69.142read for country, not keptmasked by default
  • cookie: _id=3f9ano cookie

The browser always shows its IP address to any server it talks to. GhostMetrics reads it once to look up country and city with a local GeoLite2 database. In Lightweight mode it is not written to the database.

Chapter 3 · The lantern

Realtime, without the peeping

This is a toy. Press the button and a pretend visitor walks into a pretend shop. The real Realtime view works the same way: footsteps arrive, bars climb, and nobody gets a name.

Demo dataLast 10 minutes
0
pretend visitors right now

Chapter 4 · The house

Rooms in the haunted house

Each room is a real part of the app. Where a feature needs Advanced mode or a plan that includes it, the room says so.

Pageviews, visitors, sessions

Footsteps

Every page someone opens becomes a footstep. See totals, landing pages, exit pages and how long sessions last.

  • Pages, landing and exit pages
  • Visitors and sessions (Advanced)
  • Date ranges and comparisons

Source: Pageviews.php, Visitors.php, Statistics.php, Annotations.php

Referrers and UTM

Doorways

Which doors people came through: other sites, search, newsletters, social posts and your tagged campaigns.

  • Referrer hosts and paths
  • utm_source, utm_medium, utm_campaign
  • Optional query-string tracking per site

Source: PixelTrack.php:247 to 251, WebsiteUpdate.php:82

Countries and cities

Map room

Country, region and city from a local GeoLite2 lookup on our server. The lookup happens once and the IP is not kept in Lightweight mode.

  • Continent, country, region, city
  • Browser language and timezone

Source: PixelTrack.php:215 to 228

Devices, browsers, OS

Wardrobe

Desktop, tablet or phone, which browser, which operating system, screen size and light or dark theme.

  • Device type, OS, browser
  • Screen resolution
  • Visitor colour theme

Source: PixelTrack.php:231 to 243

Goals and events

Ledger

Mark a page visit, a scroll depth or a custom event as a goal and count how many footsteps reach it. Outbound clicks too.

  • Pageview, scroll and custom goals
  • Outbound link clicks
  • Event children (Advanced)

Source: GoalsAjax.php, pixel-goals.js, pixel-outbound.js

Heatmaps (Advanced)

Warm rooms

See where clicks and scrolls gather on a chosen page. Needs Advanced mode and a plan that includes heatmaps.

  • Click and scroll heatmaps per path
  • Plan limit: websites_heatmaps_limit

Source: Heatmaps.php, pixel-heatmaps.js

Session replays (Advanced)

Echoes

Watch a recorded session to find where a form trips people up. The admin must enable it, the site owner must enable it, and you can name CSS selectors whose text is hidden from the recording.

  • Per-site hide-text selector
  • Plan time and retention limits
  • Off unless switched on

Source: Pixel.php (sessions_replays checks), WebsiteUpdate.php:79

Teams

The haunt

Invite people to a website without sharing a password. Good for agencies and their clients.

  • Team members per website
  • Plan switch: teams_is_enabled

Source: Teams.php, Team.php

Email reports

Night letters

A weekly or monthly summary sent to your inbox, for people who will not open another dashboard. The platform sets the rhythm.

  • Per-website switch
  • Plan switch: email_reports_is_enabled

Source: WebsiteUpdate.php:80, Cron.php email_reports

Custom domains

Your own door

Serve the tracking script from your own domain so it reads as part of your site.

  • Plan limit: domains_limit

Source: Domains.php, DomainCreate.php, Pixel.php:63

API and public stats

Back door

Pull numbers into your own tools with an API key, or publish a read-only stats page with an optional password.

  • Account API keys (plan switch)
  • Public statistics page, optional password

Source: AccountApi.php, ApiDocumentation.php, Statistics.php:40 to 70

Who it haunts for

Small teams with good manners

People who want to know what works on their site and would feel odd keeping files on strangers.

Three people at a studio table laughing over printed bar charts.
AgenciesGive each client a team seat or a public stats page with a password, so reports stop living in screenshots.
A shop owner wraps a parcel at her refill shop counter.
Shop ownersSee which pages sell and where buyers came from, with a regular email instead of another dashboard to check.
A developer thinks at a desk by a window at dusk.
DevelopersPoint the script at your own domain, pull numbers through the API and drop Lightweight mode into a static site.
A ceramics maker tapes a parcel shut with mint tape in his workshop.
Indie makersSet a goal on the thank-you page and count finished orders. The ghost does not need to know who bought the cups.

These photos are AI generated illustrations. They do not show real customers.

Chapter 5 · The graveyard

Where cookie banners go to rest

A small joke about the banners we all click past. It is not legal advice: the GhostMetrics script never sets a cookie, but your site may still need a banner for everything else it runs. Read the small print below.

RIP"We value your privacy"
RIP"Manage our partners"
RIP"Accept all to continue"
RIP"Legitimate interest"

The honest small print. GhostMetrics never sets a cookie from the tracking script. Lightweight mode also skips localStorage. Advanced mode keeps one random ID in localStorage so it can tell sessions apart, and some regulators treat that like a cookie. Whether your site needs a banner depends on everything else you run, so check with whoever advises you on GDPR and PECR.

A moonlit hill of tombstones shaped like pop-up dialogs, bitten cookies in the grass, the ghost holding a lilac flower.

API system

Developer ready

Fully featured & easy to use API system for developers.

  • Websites
  • Website statistics
  • Goal conversions
  • Pageviews
  • Goals
  • Visitors
API Documentation
curl --request POST \ --url 'https://ghostmetrics.uk/api/statistics/1' \ --header 'Authorization: Bearer {api_key}' \ --header 'Content-Type: multipart/form-data' \ --form 'start_date=2026-09-27' \ --form 'end_date=2026-10-27' \ --form 'type=overview'

Chapter 6 · Plans

Pick how much house you need

Plan names, prices and limits come straight from the app. Each plan sets the real switches: websites, monthly footsteps, retention, heatmaps, replays, teams and API access.

Plans are being set up

Pricing is published here as soon as the plans open. You can create an account now and start counting.

Start counting

Questions at the door

Ask the ghost

Does GhostMetrics use cookies?

The tracking script never sets one. Lightweight mode stores nothing on the device at all. Advanced mode keeps a random visitor ID in localStorage.

Do you store IP addresses?

Lightweight mode reads the IP once to find country and city, then drops it. Advanced mode stores it with every digit swapped for an asterisk, unless the platform admin and the site owner both switch full IP storage on.

Can I hide my own visits?

Yes. Add your IP to the site's excluded list and the script will not count you. Known bots can be filtered out too.

Will it slow my site down?

The core Lightweight script is about 2 KB minified, measured from the source files. Goals, scroll goals and outbound click tracking add a little more when you turn them on.

How long do you keep the data?

Each event is stamped with an expiry date the moment it arrives. The window comes from your plan. After that it is deleted.

Can I show my stats to a client?

Turn on the public statistics page for a website and share the link, with or without a password.

The last footstep

Let the ghost keep count

Add one script tag. Watch the bars climb. Nobody gets followed home.

Start counting
Tally points proudly at a rising bar chart.