AI Visibility Topics: Group Prompts to Find Real Gaps
AI visibility topics split one score into the themes buyers ask about. In 7 topics we ranged from 22.5% to 0%, and two topics had no tracked brand at all.
Kazi Khalid Hasan Tamim · BugViso Team
14 min read
AI visibility topics group your tracked buyer prompts by theme, such as pricing, integrations or a product area, so you can see where AI engines name you and where they don't. One overall mention rate averages very different situations. Ours was 7.5%, but by topic it ranged from 22.5% on scan quotas to 0% on three topics. Two of those three topics had no tracked brand named at all.
That last group is the trap: an empty topic can rank you first. By the end of this post you'll know how to group prompts into topics, which three kinds of topic gap exist, how to tell a real gap from a thin sample, and what to do about each. A script prints the topic table from your own answers.
Data used: 35 unbranded buyer prompts in 7 topics × ChatGPT, Gemini, Perplexity and Claude × 2 runs on 2026-10-20 (280 answers, web search on), collected by BugViso's AI Visibility Tracker for bugviso.com (website-audit software) against five anonymised competitors. Topics were drafted from the site and frozen with the prompt set. Intervals are 95% Wilson score intervals.
How to Group Prompts Into Topics
A topic is a buying theme: the reason a buyer is asking, in words the buyer would use. "Pricing and free reports" is a topic. "Feature X v2" isn't, because buyers don't ask about your release names.
Four rules keep topics useful:
- 4 to 8 topics per set. Fewer and each topic averages too much; more and each one is too thin to measure.
- At least 3 prompts per topic. BugViso folds smaller topics into "General" for this reason.
- One topic per prompt. A prompt about "white-label reports pricing" goes in one topic, whichever the buyer is really deciding on.
- Freeze topics with the prompt set. Moving a prompt between topics changes both topics' history.
Our set had 7 topics drawn from the product's buying themes. With 35 unbranded prompts, each topic got 3 to 6 prompts, which is 24 to 48 answers per topic after two runs on four engines. Our guide to building an AI visibility prompt set covers the drafting side.
Our 7 Topics, Measured
Here's the topic table from the script further down, with the topic leaderboard from BugViso's tracker alongside:
| Topic | Prompts | Answers | Our mention rate (95% CI) | Leader | Any tracked brand named | Our topic index, rank |
|---|---|---|---|---|---|---|
| Audit scan quotas and rollover | 5 | 40 | 22.5% (12.3–37.5) | Competitor B, 37.5% | 62.5% | 35.3, 3rd of 6 |
| SEO and technical website checks | 6 | 48 | 10.4% (4.5–22.2) | Competitor A, 64.6% | 77.1% | 26.5, 5th |
| Pricing and free reports | 5 | 40 | 10.0% (4.0–23.1) | Competitor A, 55.0% | 72.5% | 20.2, 4th |
| White-label agency reports | 5 | 40 | 7.5% (2.6–19.9) | Competitor E, 30.0% | 52.5% | 13.8, 6th |
| AI search readiness and crawler access | 6 | 48 | 0.0% (0.0–7.4) | Competitor B, 14.6% | 20.8% | 0.3, 5th |
| Core Web Vitals and performance testing | 5 | 40 | 0.0% (0.0–8.8) | Competitor B, 2.5% | 2.5% | 0.0, 2nd |
| Accessibility and mobile testing | 3 | 24 | 0.0% (0.0–13.8) | none | 0.0% | 1.2, 1st |
Look at the last row. Not one of 24 accessibility answers named a tracked brand, and our topic index still ranks first. The reason: our own site was cited in 2 of those answers, which gives a small citation score when everyone else scores zero. A rank in an empty topic means nothing.
Three Kinds of Topic Gap
Topics fall into three groups by how often any tracked brand is named, and each needs a different response. The "any tracked brand named" column sorts them.
Contested topics: rivals are named, you're behind
Four topics named a tracked brand in more than half of answers (52.5% to 77.1%). Engines answer these questions with vendor names, and the question is whose. In "SEO and technical website checks", Competitor A was named in 64.6% of answers and we were in 10.4%.
These are classic share-of-voice gaps. The fix sits in the sources that shortlist rivals: list pages, comparisons and the pages that cite competitors but not you. Our post on AI citation gap analysis shows how to find them.
Open topics: vendors are rarely named
"AI search readiness and crawler access" named a tracked brand in only 20.8% of answers. The leader, Competitor B, reached 14.6%. Engines mostly answered with explanations and platform documentation, and no vendor owned the topic.
For us this was the most important row. AI search readiness is one of our product's main features, and engines didn't name us once in 48 answers. An open topic is the cheapest one to take: there's no entrenched leader to displace, only a missing reference. It needs clear, citable pages that answer the topic's questions with the product as a worked example.
Topics owned by names you don't track
"Core Web Vitals and performance testing" named a tracked brand in 1 of 40 answers. That doesn't mean nobody won. Google's own free tools did: PageSpeed Insights and Lighthouse each appeared in 37 of 40 answers. In accessibility, open-source checkers filled the same role: the axe-core engine, which our own scans use, was named in 19 of 24 answers.
A topic like this has a leader you aren't tracking, and often one you can't displace. Google's tools are free and come from the company that defines the metrics. The realistic goal is to be named next to them, as the tool that does something they don't, rather than instead of them.
💡 Rule of thumb: before calling a 0% topic a gap, check the "any tracked brand named" rate. Below about 10%, find out which names the answers do contain, and decide whether to track them or reframe the topic's prompts.
When a Topic Difference Is Real
Compare topic intervals, not topic rates. Each topic holds 24 to 48 answers, so intervals are wide.
From the table:
- Scan quotas (12.3–37.5%) vs AI search readiness (0.0–7.4%): real. The intervals don't overlap.
- Scan quotas (12.3–37.5%) vs pricing (4.0–23.1%): not established. The intervals overlap, so "we're stronger on quotas than pricing" isn't proven yet.
- SEO checks vs pricing vs white-label: indistinguishable. All three overlap heavily.
The Wilson score interval is the right tool here because topic rates are small and samples are modest; the textbook normal approximation fails near 0%. A 0 of 24 still allows a true rate up to 13.8%.
BugViso flags any segment with fewer than 20 answers as low confidence. With one run on four engines, a 3-prompt topic has only 12 answers and is flagged. It takes two runs to reach the 24 answers our accessibility topic had.
Coverage Inside a Topic
Within a topic, check how many prompts name you, not just how many answers. A topic rate can come from one strong prompt.
| Topic | Prompts where we were named at least once |
|---|---|
| Audit scan quotas and rollover | 3 of 5 |
| Pricing and free reports | 3 of 5 |
| SEO and technical website checks | 3 of 6 |
| White-label agency reports | 2 of 5 |
| The three 0% topics | 0 of 14 |
Our 22.5% in scan quotas came from 3 of 5 prompts, so it's broad within the topic. A 22.5% from 1 of 5 prompts would be one niche question, not topic strength. The difference between the two metrics is the subject of our post on prompt coverage vs mention rate.
Per engine, all our topic mentions came from ChatGPT, Gemini and Perplexity. Claude named us in no topic. If one engine is missing from every topic, the problem is the engine, not the topics.
What to Do for Each Topic Type
Pick the response by topic type, then rank topics by business value, not by size of gap.
- Open topic central to your product: publish the reference answer. Write pages that answer the topic's buyer questions directly, with numbers and steps, and keep them crawlable. Google says there are no special optimisations needed for its AI features; what counts is a page that answers the question well.
- Contested topic where you're behind: work the sources. Get onto the list pages and comparisons cited in that topic's answers, and publish your own fair comparison.
- Topic owned by untracked names: reposition. Write prompts and pages around what you add to the free tools engines already name. For us, that means "test Core Web Vitals across every page" instead of "test Core Web Vitals".
- Topic where you lead: defend it. Keep the pages engines cite there current, and watch the interval rather than the rate.
For us, the order was clear: AI search readiness first (open, central, 0%), then SEO checks (contested, large, central), and Core Web Vitals reframed rather than fought.
Print the Topic Table for Your Own Answers
This script reads an answer export with a topic column and prints, per topic, your mention rate with a 95% Wilson interval, the leading tracked brand, how often any tracked brand is named, an "unclaimed" flag, and how often each --watch name appears. Use --watch for tools you suspect own a topic without being tracked. Standard library only.
#!/usr/bin/env python3
"""AI visibility by topic: your mention rate with a 95% Wilson interval, the topic leader,
how contested the topic is, and which untracked names own it.
Usage: python3 topic_report.py answers.csv --brand Acme --competitor Globex ... [--watch "Some Tool"]
answers.csv columns: topic, answer, branded (1/0).
"""
import argparse, csv, re
from collections import defaultdict
from math import sqrt
def wilson(k, n, z=1.96):
if not n:
return 0.0, 0.0
p, d = k / n, 1 + z * z / n
c, h = (p + z * z / (2 * n)) / d, z * sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / d
return 100 * max(0.0, c - h), 100 * min(1.0, c + h)
def main():
ap = argparse.ArgumentParser()
ap.add_argument("answers"); ap.add_argument("--brand", required=True)
ap.add_argument("--competitor", action="append", default=[]); ap.add_argument("--watch", action="append", default=[])
ap.add_argument("--min-n", type=int, default=20)
a = ap.parse_args()
rx = {n: re.compile(r"(?<![\w-])" + re.escape(n) + r"(?![\w-])", re.I) for n in [a.brand, *a.competitor, *a.watch]}
by = defaultdict(list)
for r in csv.DictReader(open(a.answers, newline="", encoding="utf-8")):
if r.get("branded") != "1":
by[r.get("topic") or "General"].append(r["answer"])
tracked = [a.brand, *a.competitor]
for t, answers in sorted(by.items(), key=lambda kv: -len(kv[1])):
n = len(answers)
rate = {b: sum(bool(rx[b].search(x)) for x in answers) for b in tracked}
contested = sum(any(rx[b].search(x) for b in tracked) for x in answers)
lo, hi = wilson(rate[a.brand], n)
leader = max(tracked, key=lambda b: rate[b])
flag = " LOW CONFIDENCE" if n < a.min_n else ""
print(f"{t} ({n} answers){flag}")
print(f" {a.brand}: {rate[a.brand]}/{n} = {100 * rate[a.brand] / n:.1f}% (95% CI {lo:.1f}-{hi:.1f}%)")
lead = f"{leader} {100 * rate[leader] / n:.1f}%" if contested else "none"
print(f" leader: {lead} any tracked brand named: {100 * contested / n:.1f}%")
if contested == 0:
print(" UNCLAIMED by tracked brands: ranks here are meaningless; see who the answers do name")
owners = [(w, sum(bool(rx[w].search(x)) for x in answers)) for w in a.watch]
owners = [f"{w} {k}/{n}" for w, k in sorted(owners, key=lambda o: -o[1]) if k]
if owners:
print(" untracked names: " + ", ".join(owners))
print()
if __name__ == "__main__":
main()Two blocks of its output on our answers:
Core Web Vitals and performance testing (40 answers)
BugViso: 0/40 = 0.0% (95% CI 0.0-8.8%)
leader: Competitor B 2.5% any tracked brand named: 2.5%
untracked names: PageSpeed Insights 37/40, Lighthouse 37/40
Accessibility and mobile testing (24 answers)
BugViso: 0/24 = 0.0% (95% CI 0.0-13.8%)
leader: none any tracked brand named: 0.0%
UNCLAIMED by tracked brands: ranks here are meaningless; see who the answers do name
untracked names: Lighthouse 8/24How BugViso Reports AI Visibility Topics
BugViso's AI Visibility Tracker drafts 4 to 8 buying topics from your site when it builds the prompt set, assigns every prompt to one, and makes sure each topic has at least 3 prompts. You can rename topics and move prompts when you review the set; the topics are frozen with the prompt version, so the topic history stays comparable.
Every run computes the full leaderboard per topic, alongside the per-engine and per-intent segments: your index, rank, mention rate and the topic leader, with the number of answers behind it. Segments under 20 answers are flagged low confidence. The report lists your strongest and weakest confident segments by index, so an empty topic where you happen to rank first doesn't show up as a strength. The action plan includes a topic-authority play for the topics where you're weakest. Topic segments are part of every report from the AI visibility tracker.
Topic Mistakes to Avoid
Reading rank in an empty topic. Rank 1 of 6 with 0 mentions is a citation artefact. Check how often any tracked brand is named first.
Splitting topics too fine. Ten topics of 3 prompts each give 12 answers per topic per run, and every one is low confidence. Merge before you measure.
Retopicking mid-contract. Moving prompts between topics breaks both topics' trends. Make the change with a new prompt version and start a new baseline.
Treating every 0% the same. An open topic, a contested one and one owned by free tools each need a different response. Lumping them into "gaps" sends effort to the wrong one.
Frequently Asked Questions
What are topics in AI visibility tracking?
Topics are buying themes that group your tracked prompts, such as pricing, integrations or a product area. Reporting mention rate and rank per topic shows where AI engines name you and where they don't, which a single overall score hides.
How many topics should an AI visibility prompt set have?
Four to eight, with at least three prompts each. With 50 prompts, that gives 6 to 12 prompts per topic and enough answers per run to read each topic with a usable interval.
Why does my brand rank first in a topic where it's never mentioned?
Because no tracked brand is mentioned there either, and a small score from another part, usually your own site being cited, puts you on top. Check how often any tracked brand is named before reading the rank.
How do I find which topics competitors own in AI answers?
Compare each topic's leader and how often any tracked brand is named. Topics named often, with a rival far ahead, are contested gaps. Then list the sources cited in that topic's answers to see where the rival's mentions come from.
What if a topic is dominated by free tools I don't compete with?
Track them with a watch list, then reposition. Write prompts and pages about what you add to those tools, so engines can name you alongside them rather than never.
Fix the Open Topic First
Split the score by topic, sort the topics by how often anyone is named, and spend first on the open topic that matters most to your product; that's where a missing reference costs the most and is cheapest to fix. BugViso's AI visibility tracking reports every run by topic with intervals, so the open lanes show up in the first report.
Written by
Kazi Khalid Hasan Tamim · BugViso Team
Kazi writes BugViso’s guides on website audits, Core Web Vitals, technical SEO, accessibility and AI search. The data in them comes from audits BugViso runs in a real Chromium browser, including our 219-site study of website health.
Summarise with AI
Open this guide in your assistant.
Follow BugViso
New guides and audit data as we publish them.
See where your site stands
Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.