AI visibility audits often collapse into a single score. That makes the report easy to scan, but hard to reproduce.
A better technical workflow keeps the raw evidence first, calculates summaries second, and preserves enough context for another analyst to re-run the same test.
This post shows a compact JSON model for that workflow.
1. Store the test, not just the answer
For every prompt, record the exact conditions under which the answer was observed:
{
"run_id": "2026-08-09-us-en-001",
"observed_at": "2026-08-09T18:00:00Z",
"engine": "example-ai-surface",
"market": "US",
"language": "en",
"prompt": "Which tools help measure brand visibility in AI answers?",
"brand": "Corank",
"mentioned": true,
"linked": false,
"position": 3,
"sources": [
{
"url": "https://example.com/resource",
"role": "supporting-evidence"
}
]
}
The important design choice is separating mentioned from linked. An entity can appear without a citation, and a cited source can appear without a direct brand mention. Treating those as different fields prevents a lot of misleading reporting.
2. Define source roles
Not every cited page is doing the same job. A small controlled vocabulary makes later analysis much more useful:
-
definition: explains what a category or method is -
evidence: contains data, research, or a reproducible result -
comparison: helps a user evaluate alternatives -
implementation: shows how to do the work -
entity: confirms who a company or product is -
supporting-evidence: adds context without carrying the main claim
This lets you ask a better question than “Were we cited?” You can ask, “Which source role do competitors own, and which role is missing from our content?”
That gap is often the next linkable asset to build.
3. Normalize URLs before counting
The same source can appear with tracking parameters, fragments, mixed casing, or multiple trailing-slash variants. Normalize before aggregation:
function normalizeSourceUrl(input) {
const url = new URL(input);
url.hash = "";
for (const key of [...url.searchParams.keys()]) {
if (key.startsWith("utm_") || key === "ref") {
url.searchParams.delete(key);
}
}
url.hostname = url.hostname.toLowerCase();
url.pathname = url.pathname.replace(/\/+$/, "") || "/";
return url.toString();
}
Do not remove query parameters blindly. Some parameters identify a genuinely different public resource.
4. Calculate transparent metrics
Once raw observations are saved, summaries become simple and auditable:
const mentionRate =
runs.filter(run => run.mentioned).length / runs.length;
const citationRate =
runs.filter(run => run.linked).length / runs.length;
const sourceRoleCoverage = new Set(
runs.flatMap(run => run.sources.map(source => source.role))
);
Keep the numerator and denominator beside every percentage. “42% visibility” is not meaningful unless the reader can see whether that means 42 of 100 prompts or 5 of 12.
5. Use a fixed prompt set
For trend analysis, freeze a prompt set for a period of time. Re-run it on a schedule, but avoid rewriting the prompts every time the result changes.
A useful prompt set usually mixes:
- category discovery questions
- comparison and alternative questions
- “how do I” workflow questions
- vendor or tool evaluation questions
- branded confirmation questions
Version the set when you intentionally change it. Otherwise, a chart may be measuring prompt drift instead of visibility drift.
6. Turn the evidence gap into an asset
If the table shows that competitors are repeatedly cited for implementation guidance, build an implementation guide. If comparison pages dominate, create a fair, sourced comparison framework. If original data wins citations, publish the methodology and dataset.
The evidence table is not only a report. It is a content roadmap.
For a practical starting point, Corank publishes a free AI visibility audit and guides to answer engine optimization and generative engine optimization.
Final checklist
Before calling a run complete, verify that you preserved:
- the exact prompt
- engine or product surface
- date, market, and language
- mention and link status separately
- normalized source URLs
- source roles
- raw counts behind percentages
- the prompt-set version
That structure makes AI visibility work easier to audit, easier to compare, and much harder to turn into a vanity metric.
Top comments (0)