Methodology

How CueScout maps AI citations

Last updated 2 August 2026

Most tools in this category answer one question: did ChatGPT say your name? That is the easy half. The half that tells you what to do next is where the answer came from — which URLs the engine pulled in, who is named on those pages, and which of those spots you could realistically take.

This page is the method, in the order the code runs it. The last section is the list of things this method cannot see, which I think matters more than the rest of the page. If you are evaluating us against Profound or Peec or anyone else, that section is the one to compare.

The unit of measurement

One prompt, checked against one engine, at one moment. Everything else on the page is built from that row: the answer text, the URLs found in it, whether the brand was mentioned, whether its domain was cited, plus a rank and sentiment when we could get them.

Step 1

Where the prompts come from

A model reads the product name, description, keywords, and tracked competitors, then writes 8 to 12 buyer questions of the kind that actually get typed into an assistant: “best tool for X”, “alternatives to Y”, “how do I…”. We cap the list at 12 and dedupe it.

The generator is instructed never to put the product’s own name in a question. Asking an engine “is CueScout any good” measures nothing except whether the model can read your homepage. The questions have to be the ones a buyer asks before they know you exist. You can edit or replace the whole list; the generated set is a starting point, not the tracked set.

Step 2

Asking the engines

Each prompt goes to search-grounded models from Perplexity and OpenAI, currently Sonar and GPT-4o search preview. Temperature is 0.2 and the answer is capped at 700 tokens. The prompt we send is deliberately boring: it frames the keyword as a user question and asks for specific real products by name, with source links.

Then the detection, which is where we differ from most of the category. A mention is a case-insensitive match of the brand string in the answer text. A citation is the product’s bare domain appearing either in the answer text or in one of the URLs the answer carried. Neither of those is a model call. We never ask an LLM “was this brand recommended?”, because a string match costs nothing per run and cannot hallucinate a competitor into your report.

Two numbers do come from a model: the rank position in a list and the sentiment of the passage. Those run as a second, cheaper call, and only when the brand was actually mentioned. They are the softest figures on the surface and you should treat them that way.

Step 3

Pulling the URLs out

Cited URLs are extracted with a regex over the answer, trailing punctuation trimmed, then deduped. Every URL is reduced to a canonical key that ignores case, trailing slashes, tracking parameters, and #section anchors. Engines cite the same page three ways in three runs; without that key the same article shows up as three sources and inflates every count on the surface.

Bare homepages get dropped unless they are a community platform, since a domain with no path is not a page you can write against. What survives is rolled up into one row per page, carrying every prompt and every engine that cited it. The citation count on a row counts rows, so one prompt checked on three engines that all cite the same article counts as three.

Step 4

Reading the cited pages

Knowing an engine cites a listicle is half a finding. The other half is whether you are on it. So we fetch the page and look, as CueScoutBot/1.0, with published limits:

  • One GET per URL. No link following, no rendering, no JavaScript.
  • HTML only. A PDF or an image tells us nothing about who is named on a list.
  • 1 MiB read cap, 12 second timeout, 25 pages per refresh inside a 90 second budget.
  • A successful read is cached 7 days. A failed one is retried after 3.
  • Requests are forced through a transport that refuses any non-public address. These URLs were chosen by an answer engine, not by us, and the crawler runs next to our database. A cited link to 169.254.169.254 must never become a request we make on a customer’s behalf.

Before matching, script, style, noscript and SVG blocks are stripped and the markup is flattened to text. Skip that and a single analytics config block names half the SaaS market, and every brand reads as present on every page. The brand match itself is on word boundaries rather than substrings, because “Peec” inside “speech” is not a mention, and a false positive here tells someone they are on a list they are not on.

Step 5

Classifying the page

Each cited page gets one of eight types, decided from the URL and host. Ownership wins over page shape, because who owns the page decides what you can do about it. Your domain makes it owned. A tracked competitor’s domain makes it competitor (matched conservatively against the registrable label, since a false positive would send someone off to write a counter-page against a neutral blog).

After that: a fixed host list covers review sites (G2, Capterra, GetApp, Software Advice, TrustRadius, Trustpilot, Product Hunt, AlternativeTo, Wikipedia, Crunchbase, Gartner, SourceForge, Slashdot). Reddit, Hacker News, Quora, Stack Overflow and Stack Exchange are community. Then path shape decides the rest: docs, comparison for a -vs- path, listicle for the “best-”, “top-”, “alternatives”, “roundup”, “shortlist” shapes, and everything left over is an article.

This is deterministic, free, and you can check our work by looking at the URL. It also misses things: a roundup published at /blog/2026/03/notes is filed as an article, because nothing in the URL says otherwise. We took that trade on purpose. A classifier that is wrong in a way you can see beats one that is wrong in a way you can’t.

Step 6

Occupancy and winnability

Occupancy answers “are you in it” for a single page: present, absent, unfavourable (you are in it, and the answer citing it came out negative), or unknown. Unknown covers pages we have not read yet and pages we tried and could not read. A page that refused our crawler is never reported as absence. Absence and ignorance are different facts and only one of them is worth acting on.

Type plus occupancy produces the winnability tier, and the tier carries its own one-line reason on the row, because a judgement you can’t interrogate is one you won’t trust. There are six: own-it (publish a better page and take the answer), get-listed (a third-party list you’re missing from; pitch the author), earn-it (a community thread; write the page that gets cited alongside it), blocked (a directory that needs a profile and reviews, not writing), competitor-owned, and held, which is your own page already being cited. Rows sort by tier, then by how many tracked prompts lean on the page.

One thing is absent from every branch of that table: replying. No tier ever tells you to comment in a thread. We burned four accounts to permanent Reddit bans learning that the honest move for a cited thread is a page of your own, on a domain you control.

Step 7

The score

Each datapoint is worth 0 if the brand was not mentioned, 40 if it was mentioned without a citation, and 80 if the domain was cited. If the answer ranked you, add round(20 / rank), capped at 100. So being cited at position 1 scores 100, cited unranked scores 80, and a bare mention at position 3 scores 47.

The visibility score is the mean of those values across the most recent row for each prompt and engine pair. Mention rate and citation rate are published raw next to it, because a composite hides which half moved, and the two halves have completely different fixes.

What this method cannot see

It is not the real ChatGPT. We query search-grounded models through an API. There is no account, no memory, no chat history, no personalization, no location. A logged-in buyer in Berlin with six months of history may get a different answer than our probe does. What we measure is the model’s default behaviour on a cold question, which is a proxy, and I would rather call it one than pretend otherwise.

Answers move on their own. Temperature 0.2 is not zero, and the underlying search index changes hour to hour. Any single check is one sample. A mention that vanishes between Tuesday and Wednesday is noise until it stays gone; the useful reading is the trend over several weeks.

We only read the first 700 tokens. Answers are capped at that length, so a brand named in the sixth paragraph of a long response, or a source link attached at the very end of one, does not get counted. The cap keeps a full sweep affordable and it biases us toward the top of an answer, which is roughly the part a real user reads. It is still a truncation, and it means our mention rate runs slightly low on engines that ramble.

Large parts of the corpus refuse our crawler. Reddit and most review sites return 403 to CueScoutBot, and those are exactly the pages AI answers lean on hardest. Occupancy for them stays unknown, we show the count of unread rows rather than burying it, and we back off for 3 days instead of hammering.

Some brands cannot be matched at all. A brand name under three characters produces too many false hits to word-match, so every page comes back unknown rather than absent. Competitor detection has the mirror problem: it matches names as strings, so a competitor named after an ordinary English word will over-report.

Cited sources are not necessarily the sources used. We can only see the URLs an engine chose to attach to its answer. Whatever the model absorbed in training, or retrieved and then didn’t link, is invisible to us and to everyone else selling this. That is a real limit on the whole category, not a gap in our implementation.

There is no volume, and no traffic. We cannot tell you how many people asked your tracked question this month, because the engines do not publish it. A citation is not a click. If a vendor shows you AI search volume with a confident number attached, ask them where it came from.

Why so much of it is string matching

Almost every judgement above could have been a model call, and it would have been less code. We didn’t, for two reasons. A deterministic check costs nothing per run, so reading 200 cited pages for a customer is a crawl budget rather than an inference bill. And it cannot invent. The worst outcome for a tool like this is telling a founder they are missing from a list they are actually on, or naming a competitor who was never on the page. String matching fails in boring, visible ways. That is the failure mode we want.

We run all of this on CueScout itself and publish the results, including the bad ones. In July 2026 the engines gave us 0 mentions across 5 category prompts and 0 citations across 22 cited URLs. Watching that number move is the ongoing write-up on the blog.

Run it on your own domain

Steps 1 through 3 run free in the browser with the AI Visibility Checker. The page reading, classification, and winnability tiers are the paid product. Questions about any of it go to support@cuescout.com, which the founder reads.