Measurement & analytics · September 2026

How to Measure Whether AI Engines Read Your llms.txt

Publishing /llms.txt is the easy half. Proving anyone read it is the half that decides whether you keep maintaining the file. Here is a three-layer measurement stack — raw logs, crawler behaviour, and AI referral traffic — that separates what actually happened from what your analytics dashboard implies happened.

Why llms.txt Measurement Is Different

Most web measurement assumes a browser: JavaScript loads, a session starts, a referrer gets recorded. AI crawlers do none of that. When OAI-SearchBot fetches your /llms.txt, no GA4 session exists, no cookie is set, and no channel group fires. The only evidence is a line in your access log.

That single fact reorganises the whole reporting problem into three independent questions:

These signals move on different timelines and disagree for months — heavy crawler traffic with zero AI referrals is normal. Report them separately and you will never confuse a crawl with a citation.

Layer 1 — Count Direct llms.txt Fetches

On your own server, the file is one path. Filter for it and group by user agent:

# Did any AI agent request the file?
grep -i "llms.txt" /var/log/nginx/access.log

# Group the hits by crawler identity
grep -i "llms.txt" access.log | awk '{print $1, $12}' | sort | uniq -c | sort -rn

# Include rotated logs from the last month
zgrep -i "llms.txt" /var/log/nginx/access.log.*.gz | grep -iE "GPTBot|OAI-SearchBot|ClaudeBot|PerplexityBot"

What you are looking for is a small number of non-zero hits, not volume. The baseline across the wider web is grim: our breakdown in Which AI Engines Actually Read llms.txt? covers the crawler audits showing that most published files are never requested even once. Two hits a month is a working file; zero after eight weeks means the file is being skipped for a reason — usually placement, an unparsable format, or links the agent cannot resolve.

User-agent strings are trivially spoofed, so confirm identity before reporting: resolve the requesting IP to a hostname, resolve that hostname back to an IP, and compare against the operator's published ranges. If they do not match, it was not that bot.

Layer 2 — Track AI Crawler Hits on Content Pages

llms.txt is a map. Whether agents follow it shows up as requests to the pages it lists. Pull the top paths per crawler token:

# Top pages fetched by AI agents this month
grep -iE "GPTBot|OAI-SearchBot|ClaudeBot|Claude-SearchBot|PerplexityBot" access.log \
  | awk '{print $12}' | sort | uniq -c | sort -rn | head -20

This is the most useful diagnostic in the stack, because it tests curation directly. If the paths agents fetch match the pages you listed in /llms.txt, the file is working as a prioritisation layer. If they keep fetching pages you deliberately left out — category archives, paginated tag pages, thin landing pages — the file is not steering anything yet, and the fix is structural, not a matter of publishing it again.

Layer 3 — Read AI Referral Traffic in GA4

On May 13, 2026, Google added an AI Assistant entry to GA4's Default Channel Group. Sessions whose referrer matches a recognised AI assistant are tagged automatically:

Field Value assigned
Default channel groupAI Assistant
Session mediumai-assistant
Campaign(ai-assistant)

Find it in Reports → Acquisition → Traffic acquisition with Session default channel group as the primary dimension. Two caveats matter before you put the number in a report. First, Google's live Default Channel Group documentation lists ChatGPT, Gemini, Deepseek, Copilot and Grok, and states the channel excludes AI Overviews and AI Mode — so if you want Claude, Perplexity or AI Mode measurement, you still need a custom channel group with a regex on session source above the generic Referral channel. Second, this channel counts humans who clicked through. A busy AI crawler fleet produces exactly zero of these sessions.

Layer 4 — Use Platform-Side Tooling Where You Have It

If your site sits behind Cloudflare, AI Crawl Control exposes a crawler-level view you cannot get from GA4: which AI services are accessing the domain, request patterns over time, whether a crawler respects your robots.txt, and per-crawler enforcement rules. Its Metrics tab also reports a Content Format breakdown — what content types AI systems request versus what your origin serves — and the changelog documents an option that redirects verified AI training crawlers to a page's canonical URL while humans and search crawlers see the original.

Cloudflare's older "Block AI bots" toggle is documented as deprecating on September 15, 2026, so plan a migration if your enforcement depends on it. And these dashboards report what reached the edge — not what an assistant chose to cite. Useful governance, not a truth machine.

A 30-Day Benchmark Table

Put the three signals in one table and review monthly. This is the whole reporting system:

Signal Where to read it What good looks like
llms.txt fetches Access logs, filtered on llms.txt Any non-zero count from a verified AI agent
Crawler hits on listed pages Access logs, grouped by user agent and path Top paths overlap the sections in your file
AI referral sessions GA4 AI Assistant channel, plus a custom channel group Any stable, non-seasonal trickle worth segmenting

Before you spend a quarter tracking it, spend five minutes validating the file itself. Run it through the llms.txt checker to confirm each link resolves, every entry carries a description, and the header block follows the spec. If you are rebuilding from scratch, the generator turns a sitemap into a first draft. A file that fails validation will never produce a log line worth reporting — and no dashboard will tell you why.