---
url: https://simpledatalogs.com/docs/guide/web-analytics.md
description: >-
  Visitors, visits, bounce rate, sources, journeys and funnels for your website,
  without cookies, next to your logs and events.
---

# Web analytics

Every environment has a **Sessions** tab. Once a site sends `page_view` events, it shows what Plausible or Fathom show, next to your logs and events.

## Set it up

Add the script tag (see [Plain HTML](/quickstarts/html)) or turn on autocapture in the [JavaScript SDK](/sdks/javascript#autocapture).
Any sender works too: a `page_view` event with a `path` prop, sent from the browser with a public key.

## What you see

| Number | Meaning |
|---|---|
| Users | Distinct visitors in the range (see [Visitors without cookies](#visitors-without-cookies)) |
| Sessions | Runs of activity with no 30-minute gap, without passive ones |
| Active time | Time someone was using the app or site per session: gaps over 5 minutes don't count, and SDKs can send the exact time as `engaged_ms` |
| Passive sessions | Sessions where every event came from the background (`app_state: "background"`), like a sync or an idle menu-bar app |
| Pageviews | `page_view` events |
| Views / visit | Pageviews per visit with at least one page view |
| Bounce rate | Visits with one page view and no other event |
| Live | Visitors with an event in the last 30 minutes |

Below the chart:

* **Pages:** top pages by views, entry pages and exit pages.
* **Sources:** channels, referrers, UTM sources and UTM campaigns.
* **Countries**, and **devices**, operating systems and browsers.
* **Journeys:** the first three pages of each visit, as a flow chart.
* **Funnels:** two to six steps in order, each a page (`/pricing`) or an event name (`signup`). A visitor counts at a step once they did the steps before it within a day.
* **Recent visits:** open one to see its pages and events in order, with times.

Click any row to filter the whole page by it, for example only visits from Google, or only phones. Filters stack; click a filter's chip to remove it.

When every deployment of the environment is an app (iOS, Android, macOS, Windows, Linux or server), the page-only numbers and lists (pageviews, bounce, pages, sources, journeys, browsers) are left out.

To mark background work, send `app_state: "background"` with the event; `"active"` or nothing means someone was using it.

## Visitors without cookies

The script tag stores nothing in the browser. We count visitors on our side instead:

* For each request, ingest hashes the sender's IP address and User-Agent together with your environment and a **salt that changes every day**. Only the hash is kept, never the address.
* The salt of each day is deleted after it, so a visitor can't be followed from one day to the next, even by us.
* A visitor therefore counts once per day. Over 30 days, someone who came on three days counts three times, as in Plausible.
* If your app sets its own `device_id`, `install_id` or `anonymous_id`, that id is used instead, and counts exactly across days.

Requests with a secret key, and server senders like log drains, never get a hash.

## Channels

A visit's channel comes from its first page view: the UTM medium first, then the referrer.

| Channel | When |
|---|---|
| Paid search, Paid social, Paid other | `utm_medium` is `cpc`, `ppc`, `paid`, `paid_social`, `display` … |
| Email | `utm_medium=email` or `newsletter`, or a webmail referrer |
| AI assistants | ChatGPT, Perplexity, Claude, Gemini, Copilot |
| Organic search | Google, Bing, DuckDuckGo, Yahoo, Yandex, Baidu, Ecosia, Brave Search … |
| Organic social | Facebook, Instagram, X, LinkedIn, Reddit, YouTube, Hacker News, Product Hunt … |
| Referral | Any other site |
| Campaign | A UTM source without a referrer |
| Direct | Nothing at all |

## Good to know

* **Bots don't count.** Crawlers, uptime monitors, headless browsers and HTTP libraries are recognized by their User-Agent. Their events stay on the **Logs** and **Dashboard** tabs.
* **Numbers settle within a minute.** Visits are rebuilt from your stored events every minute, so late or retried events are counted once.
* **Retention:** totals, the chart and the unfiltered lists are kept for good. Filters, journeys, funnels and recent visits cover the days your plan keeps raw events.
* **Visitors over long ranges** come from a compact count that can differ from the exact number by well under 1 % on large sites.
* Do Not Track and Global Privacy Control turn the script tag's automatic capture off.
