Why this exists
Most analytics platforms (Google Analytics, Plausible, etc.) lump AI traffic into “direct” or “referral” buckets — they can’t tell you a visitor arrived from ChatGPT vs. perplexity.ai. Ansvisor’s tracking snippet reads the referrer, classifies AI sources by domain, and gives you a clean breakdown. Connect Google Analytics, Google Search Console and your Cloudflare, Vercel or server logs, and the same page shows what those visits are worth, whether AI is changing your Google traffic, and which AI bots read your pages.Data sources
The AI Traffic Analytics page (/dashboard/traffic, AI Referral Traffic in the sidebar) reads up to four sources. The Data sources strip at the top shows each one’s state:
A section whose source isn’t connected stays on the page with a Needs … tag and a Connect button, rather than hiding. Only admins and managers can connect a source.
On Ansvisor Cloud, while the workspace’s plan has ended (read-only), the snippet and your AI-bot connections are answered but nothing is stored, so your site keeps working and the sender doesn’t retry: a beacon to
POST /track/{trackingCode} gets 204, and POST /bots/ingest gets 200 with { "received": 0, "verified": 0, "stored": 0, "inactive": true }.
Setup
1
Add the tracking snippet
Copy the snippet from the page. It sits at the top until the snippet has sent a visit in the last week; after that, Code in the Data sources strip opens it. It looks like:The page fills in your own address and tracking code, so copy it rather than typing it. To follow AI visitors to signups, demo forms and orders, turn on Conversions from AI visits: the page then shows the tag with them.
2
Paste into your site
Add the script before
</head> on every page you want to track, your 404 page included, so Broken AI links can see visitors who land on a missing page. For Next.js, drop it in your root layout. For WordPress, use a header injection plugin. For static sites, edit the template.3
Connect Google Analytics and Search Console (optional)
Click Connect on either card in the Data sources strip and sign in to Google; access is read-only. If the card then reads Connected · choose a property for this brand, pick the property under Manage (Settings → Integrations). Connections are shared across your organization.Google Analytics’ first numbers arrive in about 15 minutes; up to 14 months of history can take up to 24 hours. Search Console’s can take up to 48 hours, because Google reports about two days late. On a self-hosted server, both read Not set up on this server until the server has its Google connection keys.
4
Wait for first visits
A visit is stored as soon as an AI-referred visitor lands. Reload the page, or change the range, to see new ones.
Date range, changes and export
- Range — 24h, 7d, 30d, 90d, All or Custom. The page opens on the last 24 hours, then on the range you last picked in this browser. Every section follows it.
- Change — each figure is compared with the period of the same length just before. Below 30 visits in either period the change reads Low sample instead of a percentage, and a platform or page with no visits before reads new. All time has no previous period.
- Export — the Export button gives the whole page as Excel (.xlsx), one sheet per section, or CSV (.zip), one CSV per section. Each table also has its own Excel and CSV buttons. A range with more than 100,000 visits is too large to export at once.
How visits are counted
- One visit per session. A reload, or a further link from the same answer, continues the visit rather than counting another. The visits card gives the pageviews beside the visits.
- Snippet or Google Analytics, never both. On days the snippet sent any visit, the page counts the snippet’s; on the other days, Google Analytics’. The two are never added together, and the visits card says how many days came from Google Analytics.
- The visit list is the snippet’s. Google Analytics doesn’t report single visits, so the Recent AI Referral Visits list shows only what the snippet saw.
What you see
The sections run top to bottom in this order.Summary line
One or two sentences above the KPI cards, for example: “Last 7 days: 120 AI-referred visits, 3.2% of all traffic, up 18% on the previous period. ChatGPT sent the most (64), and its visitors convert best (6% of their visits had a key event). 4 pages are cited in AI answers but get no clicks. 12 Google queries with clicks aren’t tracked as prompts.” Each fact appears only when the page can back it: the change needs 30 visits in both periods; the share of traffic and the best-converting platform need Google Analytics (and two platforms with 30 visits and 5 key events each); the untracked queries need Search Console.KPI cards
Trend and platforms
AI Referral Trend
By platform: visits per day, or per hour on the 24-hour range. vs Google clicks: AI visits and Google clicks, each indexed to 100 on its first day with data. Dashed amber lines mark the days actions entered the Action Center or prompts were added. The Google line needs Search Console, and a range of 7 days or longer since Google reports clicks by day.
Platform Breakdown
Each AI platform’s share of the range’s visits.
Referrals by Platform
Visits and change per platform, with Engaged and Key events from Google Analytics.
Top Landing Pages
The pages that receive the most AI visits, with their change and how often tracked AI answers cite them (Cited in answers).
AI Overviews and AI Mode clicks are part of Google organic clicks, and Google doesn’t let them be separated. The Google line counts them all.
Where AI visitors convert
Two tables from Google Analytics:- Top converting pages from AI — landing pages ranked by key events from AI visits, or by revenue when the property reports it, with the rate (shown from 30 visits) and the best platform.
- Which answers bring buyers — the topics of your tracked prompts whose answers cite those converting pages, by the AI platform the visitors came from. It shows which topics bring buyers, not just visits.
Pages
Pages answers which pages get AI visits, which don’t, and why. Its tabs:
Rows carry their next step: Audit page for a page AI cites or a prompt targets, Add prompts for one no prompt points to. On No AI traffic and Cited, not clicked, each row’s … menu also has Send to Action Center, Add prompts and Suggest content, and under the list Audit N cited pages (or Audit N pages) starts Site Audits for the cited pages shown, while Send to Action Center sends the pages shown as one action.
Add prompts suggests questions people ask AI assistants that the page answers, including ones from its Search Console queries, and lets you add your own. The prompts you track from it point to the page, so their answers show whether AI cites it. Each one uses a prompt slot on your plan.
Broken AI links reads what the visitor got:
- Not found (404) or Gone (410), from the status the browser reported;
- Shows a not-found page (200) — a single-page app that answers every address with 200 and shows its own not-found page. It is listed once at least two visits saw it;
- Page title says not found — where the browser reports no status (Safari, for one).
Google Search Console
Is AI changing your Google traffic? Two tables, from Search Console’s own data:- Is AI taking Google clicks? — pages whose impressions rose 15% or more while their CTR fell 20% or more, among pages with at least 100 impressions in the period before. An AI Overview may be answering in place of the click. Positions shows whether you’re cited for a tracked prompt about the page; Add prompts appears when none is about it yet.
- Untracked Google queries — queries with clicks that no tracked prompt covers, most clicked first. Track adds one as a prompt; Track all adds the listed ones that your plan’s prompt slots allow. Admins and managers can track queries. Up to the 5,000 most clicked queries are checked.
AI bots reading your site
From your own Cloudflare, Vercel or any server’s logs. Only verified bots count: the user agent and the operator’s published IP ranges must both match. Today that’s OpenAI’s GPTBot, OAI-SearchBot and ChatGPT-User, Anthropic’s ClaudeBot, Claude-SearchBot and Claude-User, and Perplexity’s PerplexityBot and Perplexity-User.- By bot type — hits, pages read and last seen for Training, Search index and User fetch, with the bots under each.
- Pages AI bots read — hits per page, and when each type last read it.
- Search-bot alert — pages AI answers cited in the last 30 days that no AI search bot read in those 30 days. It starts 30 days after the first AI-bot request, and pauses when the bot data doesn’t cover the last 30 days or the month’s cap was reached.
Connect AI bots
1
Open the dialog
Click Connect on the AI bots card in the Data sources strip.
2
Choose how your site sends AI-bot requests
- Cloudflare Worker (recommended) — a small Worker on your site’s route passes every request through and sends only AI-bot requests, in batches.
- Cloudflare Logpush — Cloudflare sends only the AI bots’ log lines, filtered at its edge. Nothing runs on your requests.
- Vercel Drain — Vercel sends your request logs; Ansvisor keeps the AI bots and drops the rest. Vercel Pro and Enterprise only.
- Any server (webhook) — your own log shipper (Vector, Fluent Bit, Logstash or a script) posts your access log as JSON lines; Ansvisor keeps the AI bots and drops the rest. See Send logs from any server.
3
Create the connection and copy its settings
Click Create connection and follow the numbered steps. Copy the settings right away: the secret in them isn’t shown again. If you lose it, revoke the connection and create a new one.
Send logs from any server
On a server or CDN without a sender of its own, choose Any server (webhook). Create connection shows the endpoint (POST /bots/ingest on the API’s public address) and a header with the connection’s secret, Authorization: Bearer abot_…, shown once. Point an HTTP output of your log shipper at it.
Send one request a line (JSON lines, Content-Type of your choice), or one JSON array, with these fields:
Content-Encoding: gzip). A post sent twice is read once. Lines older than 7 days, or whose time can’t be read, are left out.
Upload a log file
Or upload a log file, in the same dialog, reads an access log once, without a connection to set up. It takes:- the combined log format, Apache’s and nginx’s default:
20.171.207.12 - - [06/Nov/2026:09:15:02 +0000] "GET /pricing HTTP/1.1" 200 5120 "-" "Mozilla/5.0 … GPTBot/1.2 …"; - the common log format, which has no user agent, so its lines are counted but never a bot;
- JSON lines with the webhook’s fields above.
Recent AI Referral Visits
One row per visit, with time, platform, page and country. Search by URL or path, filter by platform, and page through the range ten at a time.Alerts in the Action Center
The nightly signals pass watches AI Traffic and raises these in the Action Center’s Signals:Weekly AI Traffic e-mail
Every Monday (UTC), each brand with AI visits gets an e-mail about the week before (Monday to Sunday, UTC):- three cards: AI visits with the change, the top platform, and the share of traffic (with Google Analytics) or how many pages are cited but not clicked;
- the summary line;
- AI visits by day and by platform;
- Top changes — up to three, broken AI links first, then the platforms and pages whose AI visits moved most;
- Open AI Traffic →, which opens this page.
Conversions from AI visits
Google Analytics’ key events say how many AI sessions converted. To see which pages AI visitors went through on the way to a signup, a demo form or an order, turn on conversions for the brand. The snippet then follows visitors who came from an AI assistant for 30 days from that first visit, and credits each conversion to the assistant that first sent them (first touch). The Content Editor shows what came of it: the Live page tab per page, and the Content plan’s AI results line for the whole site. Conversions are off by default. A brand that doesn’t turn them on keeps the tag it has, and the snippet keeps storing nothing.1
Turn conversions on
In Brand settings → Tracking, under Conversions from AI visits, tick Track conversions from AI visits and choose Consent:
- Wait for the visitor’s consent (recommended): no id is kept and no journey is sent until your site says the visitor agreed. AI visits themselves are counted as before.
- Don’t wait: our own banner covers it: use this only if your cookie banner already asks for analytics storage, or where no consent is needed.
2
Replace the tag
Under Use this tag, copy the tag with the copy button on its code, and use it in place of the one you have, before The first line lets your site call
</head> on every page. It has two lines:ansvisor() before the snippet has loaded: the calls wait for it.The tag carries your choices: data-c="1" turns following on, and data-consent is wait or always. The snippet reads them from the tag, so after you change Consent, copy the tag again. To turn conversions off, untick Track conversions from AI visits and put the tag without them back: until then the snippet still keeps the id in visitors’ browsers, though Ansvisor stores none of their events.3
Say when the visitor agrees
With Wait for the visitor’s consent, call this from your cookie banner once the visitor agrees, and on every page after:When the visitor says no, or takes consent back, call
ansvisor('consent', 'denied'); in both modes, and with Don’t wait on every page after, while they say no (a visitor who comes back from an AI assistant is otherwise given a new id at once): it deletes the id kept in their browser, and nothing more is sent. The snippet takes an id kept earlier as consent given, so without this call a visitor who changes their mind is still followed. Google Consent Mode set with gtag() needs no call; a banner set up in Google Tag Manager does: see Consent.4
Count your conversions
Forms with an email field count on their own (see Forms). For anything else, such as a thank-you page or a purchase, call
ansvisor('conversion', …) from your own code (see Conversion calls). On Shopify, add the Shopify pixel for orders.Consent
With Wait for the visitor’s consent, the snippet keeps the visitor’s events on the page until it knows they agreed, and drops them if they leave first. The id is made on the page the AI assistant sent them to, so they need to agree there: agreeing on a later page doesn’t bring the journey back. It counts as agreeing when:- your site calls
ansvisor('consent', 'granted'); - Google Consent Mode grants
analytics_storagein anupdate, or in adefaultset on the page before the snippet that names no region. A regional default (“denied in the EU”) can’t say which this visitor got, so the snippet waits for an update. A default set after the snippet only ever pauses it; - the visitor already has an id from an earlier page, which means they agreed then, unless a Consent Mode default on the page denies
analytics_storage.
update that takes analytics_storage back deletes the stored id and what waited, as ansvisor('consent', 'denied') does. The page keeps the id in memory, so a grant later on the same page (a banner that reports “denied” until the visitor chooses, or a visitor who changes their mind) still keeps the journey. Calls your site queued before the snippet loaded run consent first. With Don’t wait, the id is kept at once, unless Consent Mode denies analytics_storage or sets a regional default: then the snippet waits for an update.
A cookie banner set up inside Google Tag Manager (a consent template) doesn’t reach the snippet by itself. Add a tag in Tag Manager that runs
ansvisor('consent', 'granted'); once consent is given, and one that runs ansvisor('consent', 'denied'); when it’s refused or taken back.Forms
When a visitor the snippet follows sends a form with an email field (an<input type="email">, or one whose name contains email), it counts as a signup, each form once per page load. Contact and newsletter forms count as signups too, unless you give them their own goal. On the <form> tag:
data-ansvisor-goal="newsletter"names its goal:signup,demo,order,booking,newsletterorcustom. A form with a goal counts even without an email field;data-ansvisor="off"leaves it out;data-ansvisor-label="pricing-demo"names the form; otherwise itsidornamedoes.
autocomplete="new-password" (a signup), so login forms don’t count, unless the form names its goal. Nothing typed in a form is sent. Don’t also call a conversion from your own code for the same form, or it counts twice.
Conversion calls
Shopify
Shopify runs no theme code on its checkout, so orders come from a Customer events pixel:- In Brand settings → Tracking, under Shopify store, copy the pixel with the copy button on its code. For a brand whose Site type isn’t e-commerce, click Show the Shopify pixel first.
- In Shopify admin, open Settings › Customer events › Add custom pixel and name it Ansvisor.
- Under Customer privacy, set Permission to Analytics and Data sale to Data collected does not qualify as data sale.
- Paste the code, save, then Connect it.
theme.liquid.
With Wait for the visitor’s consent, also add the consent script (the second code box under Shopify store) to theme.liquid, after the tag. It passes on the answer from Shopify’s cookie banner, and grants where Shopify needs no consent. Without it, no visitor of the store is followed.
A headless store whose checkout is on another domain can’t link its orders this way.
What it can’t see
- Visitors who refuse cookies, in the EU for example, and visitors who agree only after leaving the page the AI assistant sent them to.
- More than 300 pages from one visitor in 30 days, or more than 10 conversions from one visitor in a day: the rest isn’t stored.
- AI visits that arrive without a referrer or an AI
utm_source: they count as Direct. - Google’s AI Overviews and AI Mode, which stay an estimate.
- Journeys from one subdomain to another,
wwwtoappfor example: each keeps its own id. - Forms inside an iframe (a Typeform or Calendly embed) or a shadow root, forms sent from script with
form.submit(), and posts without a form. Callansvisor('conversion', …)for these. - Conversions after Safari has cleared the id: it does so after seven days of Safari use without a visit to your site.
Supported AI sources
The snippet and the Google Analytics sync count the same AI assistants, from one list (server/src/lib/ai-sources.json):
- ChatGPT (chatgpt.com, chat.openai.com)
- Perplexity (perplexity.ai)
- Claude (claude.ai)
- Gemini (gemini.google.com)
- Copilot (copilot.microsoft.com, copilot.com, and Bing links from Copilot answers)
- Grok, DeepSeek, Meta AI, You.com, Phind, Poe, Google Labs
utm_source names it (ChatGPT adds utm_source=chatgpt.com). A name inside another host doesn’t count.
Google Analytics also counts its own AI Assistant channel, so an assistant that isn’t on the list yet still shows, under its source’s name. The list is versioned: each change is dated in the file, and every stored visit records the version that counted it.
Privacy
The snippet sends nothing for a visitor who didn’t come from an AI assistant on the list above. For an AI-referred visit it sends the page address, the referrer, the AI source, the browser’s user agent, language and screen size, and the page’s HTTP status as the browser saw it. Ansvisor adds the country the request came from. The snippet sets no cookies. Without conversions, it stores nothing in the visitor’s browser. With conversions on, it stores one item,ansvisor_v in the browser’s local storage, for visitors who came from an AI assistant and, unless you chose Don’t wait, agreed: a random id with the source, page and time of their first AI visit. After 30 days it’s no longer used, and the snippet deletes it on the visitor’s next page on your site. It’s also deleted when the visitor withdraws consent. For those visitors the snippet also sends the addresses of the pages they go on to (without their query string; a part of the path that holds an email is stored as [email]), the forms they send (the goal and the form’s name, never what was typed in it) and your conversion calls, each with the random id and the first AI visit. No name, email or IP address is stored with a conversion.
The visitor’s IP address is never stored. To group a visit’s pageviews into one visit, Ansvisor keeps a one-way key made from the IP address, your brand and a random salt that changes every day. Each day’s salt is deleted after two days. From then on, nothing links a key to an address, and one visitor’s days can’t be joined. A visit that runs past midnight (UTC) counts as two.
AI-bot requests, from Cloudflare, Vercel, the webhook or an upload, are stored without IP addresses. An uploaded file isn’t kept: only the verified bots’ requests, and a fingerprint of the file for 7 days so it isn’t read twice.
Common patterns
- Spike on a Friday — usually a viral Reddit/Twitter thread that AI engines indexed and started recommending
- Sudden country shift — Perplexity or Gemini changed regional weighting; not a metric you control
- Specific page surge — one of your articles is being cited as authoritative; lock it in with internal links to defend
- Cited, not clicked keeps growing — answers show your page but give no reason to click; add what the answer can’t (tools, data, examples) and audit the page
- A new broken AI link — an AI engine is citing an address you moved or retired; add the suggested redirect before the visits go elsewhere
Continue: Competitors
Benchmark your AI presence against named rivals.