Most AI visibility reports will sell you a bot-hit graph and call it proof. A hit cannot tell you which buyer question earned a citation. In We Logged 30 Days of AI Bot Traffic. The Useful Number Wasn’t Bot Hits, I counted a month of groas traffic. One site’s month cannot tell you what ChatGPT or Perplexity do with your pages. That is why I am taking a second look: this time, you run the test on your own logs instead of borrowing my numbers.

The question for the next four weeks is specific: which pages do assistants fetch around the time you ask buyer prompts, which answers cite those pages, and which prompts leave you with no useful page to offer? Keep the prompts and method fixed. I used to tell clients a rising crawler line meant rising AI presence. I was wrong.

Setup, week 0: get logs you can trust

Start with the log source. If you sit behind Cloudflare or another CDN, pull edge logs through Security Analytics or Logpush, not origin logs alone. Origin sees the CDN IP rather than the bot IP, and cached responses can miss origin entirely. Keep four fields together for each request:

  • Timestamp
  • Path
  • User agent
  • Source IP

That request row is the unit you verify. Do not begin with a dashboard total and try to reconstruct the evidence later. Set aside a separate row for /robots.txt, too. It may matter to access, but it is not a content page answering a buyer’s question.

Next, separate what the agents are doing. GPTBot, ClaudeBot and PerplexityBot are crawler traffic; Google-Extended is a permission flag, not a logged agent. ChatGPT-User, Claude-User and Perplexity-User are the user-triggered fetchers to watch when you test live answers. OpenAI publishes separate IP files for OAI-SearchBot, GPTBot and ChatGPT-User, while Perplexity distinguishes PerplexityBot from Perplexity-User.

Match the agent token rather than relying on an exact full-string match, then check the source IP against the appropriate vendor file. In one two-week analysis, about 1 in 17 requests claiming an AI-crawler identity was spoofed. Keep failed checks in their own column. A request that calls itself ChatGPT-User is still just a claim until you check it.

Verify the agent; exclude permission checks from page rankings

Anthropic puts its three agents in one bots file and warns that IP lists change. Check against the vendor information available when you review the request; keep robots.txt as your standing permission rule. OpenAI says ChatGPT-User may fetch even where robots.txt would block search, and that such a fetch does not decide search appearance.

The order matters: verify the IP, then remove /robots.txt from your content-page ranking. A permission check can precede a page read. Counting both as pages fetched makes one possible visit look like two content wins.

Google needs a different method. Google-Extended does not appear as a crawler in logs; it is a robots token for Gemini training and grounding. AI Overviews and AI Mode follow Search controls, not that token. For Gemini and AI Overviews, run manual answer checks alongside the log test. Use the same prompts and schedule, then record the answer text, cited URLs and whether your brand appears without a link. Logs can show a verified fetch. Manual checks show what the answer actually said.

Prompt set, weeks 1–4: keep the buyer questions fixed

Write 20 to 30 prompts your buyers might type. Build the set before the first run and divide it into five kinds of question:

  • Problem: “How do I cut emergency call CPA?”
  • Comparison: “X vs Y for small shops”
  • Pricing: “What does Z cost per month?”
  • Best fit: “Best X for Y with 10 vans”
  • Dated: “What changed in [your category] in 2026?”

Keep each prompt word for word for all four weeks. If you edit a question halfway through, a changed answer could reflect your wording rather than anything the engine did. The point is not to produce the cleverest prompt set. It is to give yourself a repeatable one that covers questions with different buyer intent.

Run every prompt in ChatGPT and Perplexity twice a week, on the same days and in the same order. Record the time to the minute, exact prompt, engine, cited URLs and any brand mention without a link. Preserve the answer text for the checks you may need to revisit. For Gemini and AI Overviews, keep the manual checks on that same schedule rather than pretending their absence from this fetch log is a result.

In weeks 3–4, make one deliberate change: publish or refresh a single dated, factual page for one prompt where you are currently absent. Put the relevant fact near the top, include a date on the page and use clean HTML. Keep every other part of the prompt schedule unchanged. One page for one prompt gives you a change you can inspect. It does not give you a laboratory control group or prove that publishing caused a later citation. Call it a useful signal, not a victory lap.

Friday measurements: four counts, no blended score

Review the same four measures every Friday. Keep the raw rows so you can return to any surprising total.

  1. Claimed, verified and user-triggered fetches by path. Show /robots.txt separately and leave it out of content rankings. A crawler visit and a ChatGPT-User visit are different events; do not add them together under “AI visibility.”
  2. Prompt-to-fetch matches. Look for a verified ChatGPT-User or Perplexity-User request to a relevant page within minutes of a scheduled prompt run. Record the time window you use and apply it consistently. The timing makes the request worth investigating; by itself, it does not prove your prompt caused it.
  3. Citation rate by prompt and engine. For each prompt, count runs that cite one of your URLs against all runs of that prompt in that engine. Keep ChatGPT and Perplexity in separate columns so a strong showing in one cannot hide a miss in the other.
  4. Brand mentions without citations. Check answers manually in ChatGPT, Perplexity, Gemini and AI Overviews. Only 6% to 27% of brands mentioned in AI answers were also cited as the source in Semrush data reported by Meev. A name in an answer is useful to know about. It is not a citation.

Expect disagreement between engines. On the same 32 prompts, four engines agreed on shortlists only 7% to 18% of the time and never agreed on the top pick. An October 2026 test of 31 best-agency prompts found ChatGPT sent 57% of citations to brand sites while Perplexity sent 70% to listicles, with higher citation volume. Those are results from those prompt sets, not targets for yours. Do not average two engines into one reassuring visibility percentage. Put the engine on every result and every gap.

Reading the results: four patterns, not four promises

Crawler hits, no user-triggered fetches: a crawler visited the page, but you did not observe a verified live-answer fetch around your scheduled prompts. Do not label that page “chosen” because its crawler line rose. Do not declare it irrelevant forever, either. Your prompt set and four-week window are the boundaries of this result. Check whether another page already attracts relevant fetches before you spend your first rewrite on the busiest crawler URL.

Verified fetch, no citation: a user-triggered agent requested a relevant page near your prompt run, but the answer cited someone else or named a competitor. The request tells you the page was reached; it cannot tell you exactly why the engine passed over its text. Read the answer and your page side by side. Does the passage answer that prompt directly, or make the reader hunt through 2,000 words? When a brand’s own site was cited, it was recommended 96% of the time, versus 18% when it was not cited in one study. That is a reason to track citations separately, not proof that a fetch will become one. If the answer is buried, tighten one page around one prompt, put the direct answer and relevant number in the first 100 words, then rerun that prompt.

One engine fetches; the other does not: keep the split. In the cited best-agency test, ChatGPT favored brand sites more often while Perplexity favored listicles and produced more citations. Your site may show a different pattern. The next action depends on which engine missed the page and what that engine cited instead. Calling the combined result “average AI visibility” throws away the part that could guide an edit.

The new page earns a fetch or citation: inspect the timing, page and prompt together. A verified fetch after publication shows that the path from an answer-time request to your page is possible. A citation is the stronger outcome, but one appearance is still one appearance. Keep running the fixed schedule before you decide the page reliably answers that buyer question. If the page earns neither, record that too. A clean test is allowed to disappoint you.

My working rule is narrower than a sales deck’s: fetch without citation sends me to the passage; repeated absence across the fixed prompts sends me to the gap list. Neither result justifies inventing a universal ranking factor.

Turn the misses into a content-gap list

Give every prompt with no verified fetch and no citation its own row. Rank rows by buyer value, not by whichever topic has the largest traffic estimate. A pricing question from someone ready to buy can matter more than a curiosity question with ten times the impressions. For each row, write down:

  • The exact prompt and engine
  • What the answer cited instead, if anything
  • Whether your brand was mentioned without a link
  • The page you already have, or the page you would need to answer it
  • The next action: revise, build or keep observing

This is where the audit stops being a bot report and becomes an editorial queue. A blog may cover a subject at length yet never give a buyer a direct answer on a single page. Company blog posts accounted for only 6.9% of company-site citations in one 948-prompt pool. In our own logging, the page type that keeps getting fetched is a dated, factual page stating one change, one price or one date. Use that as a page to test, not a guarantee. If you need the log-sorting companion to this prompt schedule, read the server-log test for which pages AI assistants actually fetch.

Lab notebook matching scheduled prompts with verified chatbot page fetches

If you pay for a platform, make it show the evidence behind its score: prompts tested, engine and model per run, cited URLs per answer, and verified fetch counts beside them. Before you trust the display, run three checks:

  1. Rerun five of its prompts yourself and compare the citations.
  2. Ask where IP verification happens. A dashboard counting claimed bot hits repeats the mistake this test is meant to catch.
  3. Confirm that it separates a brand mention from a citation.

A tool that cannot let you inspect prompts, answers and fetches separately is a prettier version of the graph you just threw out. Even with all three visible, a fetch close to a prompt remains a match to investigate, not proof of cause.

Limits: know when four weeks cannot answer the question

This test will not work equally well for everyone. If your site gets under a few hundred visits a month, four weeks may produce too few verified fetches to interpret. If most of your buyers ask inside Gemini or AI Overviews, the manual answer checks may carry the useful result while these logs stay quiet. Answers can also vary by location, account history and week. Repeat a prompt at least three times per engine before you call an absence a gap worth building for. The twice-weekly schedule gives you those repeats without changing the question between runs.

A time match is not a causal claim. Another user may have triggered a nearby fetch; an answer may cite a URL without a fetch you can see in your logs during that run. Mark what you observed, and do not fill the blank with a story. Rerun the full set quarterly rather than treating one month as a permanent map of engine behavior. One month of your own data is more useful than a year of someone else’s benchmarks only if you keep your method visible and your conclusions inside its limits.

Work desk with a checklist ranking buyer prompts and marking those with no observed fetch as gaps

Either outcome changes your next move. Fetches without citations give you passages to inspect and rewrite. Repeated prompts without fetches give you a build queue ordered by buyer value, not traffic. That is the point I missed back in the agency days staring at crawler graphs at 1am: a hit count is not the result. The result is the buyer question, the observed fetch, the answer and the citation, kept distinct enough that you can act on each.

If you would rather not babysit logs and prompt sheets, groas runs search work continuously. But whether you do this yourself or use a platform, stop reporting bot hits as visibility. Report which buyer question earned which citation, and from which engine.

The one-page run sheet

  1. Week 0: Pull edge logs with time, path, agent and IP. Separate crawlers from ChatGPT-User, Claude-User and Perplexity-User; verify IPs against vendor files; keep /robots.txt outside the content ranking.
  2. Weeks 1–2: Run 20 to 30 fixed buyer prompts in ChatGPT and Perplexity twice weekly. Log the exact prompt, time, engine, answer and cited URLs. Run the corresponding manual checks for Gemini and AI Overviews.
  3. Weeks 3–4: Publish or refresh one dated page for one absent prompt. Change nothing else about the schedule; keep recording both the fetches and the answers.
  4. Every Friday: Review claimed versus verified fetches, prompt-to-fetch time matches, citations by prompt and engine, and mentions without links. Put repeated misses on the gap list.

That sheet is the audit. Keep it beside the answers, not beside a bot-hit graph.