AI visibility
A site’s AI tab answers two questions that have nothing to do with each other.
- Are assistants sending me people? Referral traffic: the human visits that arrive from ChatGPT, Perplexity, Claude, Gemini, Copilot and the rest.
- 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.
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) oruser_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.
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.
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.