Skip to content
Concepts

What counts

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.

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.