takt

AI visibility

A site’s AI tab answers two questions that have nothing to do with each other.

  1. Are assistants sending me people? Referral traffic: the human visits that arrive from ChatGPT, Perplexity, Claude, Gemini, Copilot and the rest.
  2. Are AIs reading my site? Crawler activity: GPTBot, ClaudeBot, PerplexityBot and friends, fetching your pages.

The first signal works everywhere, right away. The second one needs server-side tracking, and this page explains why.

Traffic from assistants

When a visitor clicks a link inside an assistant’s answer, their browser passes the referrer along. Takt recognises the host, folds it into a readable label (chatgpt.com becomes ChatGPT, chat.mistral.ai becomes Le Chat) and counts it as its own source.

The Traffic from assistants block shows:

  • visitors, visits and pageviews coming from an assistant;
  • their share of the site’s visitors over the period;
  • the ranking per assistant;
  • the landing pages receiving those visits;
  • the time series over the selected period.

Nothing to install: the recognition also applies to data already collected, so the block is filled on first view if those visits already existed.

An assistant that sends no referrer stays invisible, like any other direct visit. That is the case for native apps and copy-pasted answers: the number is a floor, not a total.

AI crawler activity

A crawler runs no JavaScript. The Takt script never executes for it, so a pure JS install will never see a single crawler hit. That is not a Takt limitation, it is what a crawler is.

Crawler activity shows up when your server sends its own measurements to Takt, forwarding the User-Agent of the incoming request. Takt then recognises the bot and records:

  • its name (GPTBot, ClaudeBot, PerplexityBot…);
  • its operator (OpenAI, Anthropic, Perplexity, Google, Apple, Meta…);
  • its purpose: training (feeding a training corpus), search (feeding a search index) or user_action (a fetch triggered by a human in a conversation);
  • the page read and the last seen time.

Those three purposes tell different stories. A GPTBot takes your content for training, a ChatGPT-User is triggered by a person asking a question: that one is almost a visit.

Crawler hits are stored separately. They never count as visitors, visits or pageviews, they change none of your other numbers, and they are not billed against your event quota.

Turning on server-side tracking

You need a server-to-server call that forwards the real User-Agent of the request. The PHP wrappers do it with withVisitor():

use Vskstudio\Takt\Takt;
use Vskstudio\Takt\Options;

$takt = (new Takt(new Options(domain: 'example.com')))
    ->withVisitor($_SERVER['REMOTE_ADDR'] ?? null, $_SERVER['HTTP_USER_AGENT'] ?? null);

$takt->pageview('/guide');

The same mechanism exists in the Laravel and Symfony bridges, and in the WordPress plugin. The foundation is documented on the PHP page.

Without `withVisitor()`, the User-Agent you forward is your application server's. No crawler will be recognised, and every human visit will be attributed to the server. That is the one mistake that really empties this block.

One measurement point is enough: the route that renders your public pages. No need to instrument the admin or internal API calls, no crawler goes there.

Privacy

A crawler is not a person. The ingestion path for a crawler hit hashes no visitor, geolocates nothing and creates no session: it records the bot name, its operator, the purpose, the host and the path. No personal data is processed, and the DNT / GPC signal does not apply since there is nobody behind the request.

Next

  • The script for the classic JS install.
  • PHP for server-to-server sending.
  • Privacy for what Takt collects, and what it does not.