Skip to content

Cabin Analytics Documentation

Cabin is a privacy-first, carbon-conscious web analytics service. It's lightweight, compliant with all privacy laws, and the ideal cookieless alternative to Google Analytics.

  • No cookies, so no consent banner
  • No data sharing and no ad networks
  • A 1.2 KB script that won't slow your site down
  • Compliant with GDPR, CCPA, and more

Cabin comes in three plans, Free, Plus and Scale, and every one of them includes the full dashboard, AI/MCP access, public dashboards and data export. See plans and limits for what the paid plans add.

This documentation is available in English, Français and Deutsch.

Privacy by Design

Cabin is built from the ground up using Privacy by Design principles. We never store unique identifiers for your visitors, and our non-relational data structure makes it impossible to identify individuals based on their location, browser, OS, or language.

We don't sell or share any data with third parties or ad networks. Your visitors' data remains private and useless to advertising platforms.

Environmental Responsibility

Cabin's tracking script is 1.2 KB gzipped, a fraction of the size of Google Analytics' loader, and that loader then pulls in far more JavaScript behind it. Keeping Cabin that small is a constraint we defend, not a happy accident: you can check the number yourself in your browser's network tab.

Beyond the script, the biggest lever on the emissions of any hosted service is which electricity grid its servers draw from, which is why we track that rather than tuning code around the edges.

What you won't find here is a "100% renewable energy" badge. Every major cloud lets its customers make that claim through certificate accounting, whatever the grid the servers physically sit on, so it wouldn't tell you a single true thing. We'd rather show numbers you can check. The same methodology sits behind your site's carbon estimates, which use The Green Web Foundation's CO2.js.

Data Collection

The Cabin script sends minimal data points, with additional information inferred from the user-agent and request headers.

Sent by script

js
{
    r: 'https://google.com/',   // referrer, without any query string
    w: 2560,                    // screen width
    p: 'https://example.com/',  // path
    t: 255,                     // load time (ms)
    u: 0,                       // # of visits to the domain
    up: 0                       // # of visits to the page
}

The referrer is only sent on the first pageview of a visit, and its query string is stripped before it leaves the browser, so nothing sensitive in a referring URL reaches us.

When a visitor leaves the page, a second small request reports how long they were on it, which is what the dashboard's time-on-page figures are built from.

Inferred from the request

Data pointExample
Timestamp1627589208201
Sourcesocial
CountryGB
Browserchrome
Devicemobile
OSiOS
Languageen
Bouncefalse
utm_sourceinstagram
utm_campaignsummer_sale
utm_mediumpaid_social

Unique Visitors Without Cookies

How does Cabin determine unique visitors without storing identifiers?

Cabin counts unique visitors without identifiers, IP addresses or fingerprinting, using a property of HTTP caching that browsers already have:

When a visitor interacts with Cabin, the request is cached in their browser like any standard web resource. We set a last-modified header in the response to the start of the current day. On subsequent requests, the browser automatically sends this header back to check if the request is still valid. Cabin then increments the last-modified time by one second with each visit.

By calculating the difference between the last-modified time and the day's start, we can determine the number of visits without storing any personal data. The first request indicates a unique visit, while subsequent requests help us track metrics like bounce rate.

You can read more about this on our blog:
How Cabin measures unique visitors without cookies.

Visitor Geolocation

Every web request includes an IP address. Cabin converts this address in transit (within server memory only) to an ISO country code with no further location detail. We store only the country code. The IP address is immediately discarded and never logged.

For where that happens and where your data is stored, see the privacy policy.