# What counts

> What Kymo counts as a human event, what it drops, and how events meter against your plan. AI crawler tracking is always free and never counted.

Canonical: https://kymo.in/docs/concepts/counting
Last updated: 2026-10-19

Kymo records three kinds of human event and nothing else that inflates your numbers.

## What counts

A human event is one of:

- **Pageview** — a real page load, or a `history.pushState` navigation in a single-page app.
- **Outbound click** — a click on a link to a different hostname.
- **Goal** — an auto-goal (WhatsApp, `tel:`, `mailto:`, form submit), a key-page view listed in `data-goals`, or a custom goal you fire with `window.kymo(...)`.

Repeated pageviews of the exact same path and query, back to back with no navigation in between, are de-duplicated by `beat.js` and counted once.

## Where a visit came from

The Sources card on Analytics and the Inbound page count visits, not pageviews. A visit's source is decided by its first pageview:

- **A referrer** — the site that linked to you, such as `google.com`.
- **A UTM tag** — no referrer, but the link carried a `utm_source`. The visit counts under that source. ChatGPT adds `utm_source=chatgpt.com` to its links, so those visits count under `chatgpt.com`, the same row as visits with that referrer.
- **Typed or bookmarked** — no referrer and no tag, and the visit started on your homepage.
- **Link, no referrer** — no referrer and no tag, and the visit started on a deeper page. People rarely type a deep address by hand, so this is almost always a link whose referrer was hidden: an app, an email, a chat, or an AI answer. Click the row to see the pages these visits landed on. They are the best clue to what sent them.

Clicks from one of your pages to another never count as a source. They are part of the same visit.

## What does not count

The ingest endpoint drops these before anything is stored:

- **Bots and crawlers.** Any request whose user-agent matches `bot`, `crawl`, `spider`, `slurp`, `headless`, or `lighthouse` is dropped. It is never stored as a human event.
- **Headless browsers posing as Chrome.** A request that claims to be desktop Chrome or Edge on an https page but carries no client hints is dropped. A real Chrome or Edge 90+ always sends them.
- **Prefetches.** A prefetched page does not execute `beat.js` until it is actually rendered, so speculative prefetch does not create a pageview.
- **Your own visits**, if you set the `?kymo=ignore` opt-out, or if the IP is in your site's excluded list.
- **Local development.** `beat.js` no-ops on `localhost`, `127.*`, and `192.168.*`.

## AI crawlers are counted separately, and free

AI crawlers do not run `beat.js` — a crawler does not execute your page's JavaScript. They are tracked through a separate server-side path (`/api/crawl`) and stored as `bot` events, not human events. See [The bot taxonomy](https://kymo.in/docs/concepts/bots).

> **Tip:** AI-crawler tracking is always free. Bot events are never counted against your plan's event limit. Watching GPTBot, ClaudeBot, and PerplexityBot crawl your site costs you nothing.

## Metering against plan limits

Plans are sized by human events per month: Solo up to 10,000, Studio up to 100,000. Only the three human event kinds above count toward that limit. Bot events do not.

> **Warning:** On a limit breach, the dashboard pauses — your data is never lost. Ingestion keeps recording; you simply stop seeing new numbers until you upgrade, at which point the full history is there.
