AI Citation Gap Analysis: Sources That Cite Rivals, Not You
AI citation gap analysis finds the sources AI engines cite when they recommend rivals but not you. Real data from 280 answers, a script and an outreach plan.
An AI citation gap analysis finds the third-party pages AI engines cite in answers that recommend your competitors but not you. Those pages are your shortest path into the shortlist. In 280 real unbranded answers, 102 named a competitor and not our brand. They cited 226 third-party domains, and 190 of them never appeared in an answer that did name us.
That list of 190 is a to-do list. Each domain is a page that an engine trusted enough to cite while recommending someone else. This playbook shows how to build the list, rank it, and turn it into outreach and content work.
Data used: 35 unbranded prompts × ChatGPT, Gemini, Perplexity and Claude × 2 runs on 2026-10-20, with web search on, collected by BugViso's AI Visibility Tracker for bugviso.com (website-audit software) against five anonymised competitors. Third-party sites are described by type, not named.
Anatomy of a Citation Gap
Engines build shortlists from what they retrieve. When a buyer asks "which website audit tools let unused scans roll over", the engine searches, reads a handful of pages, and names the brands those pages support. A citation gap is a page that:
- Is cited in an answer that names at least one competitor, and
- Isn't cited in any answer that names you.
If a page shows up in answers that name both you and a rival, you're already in it, so it isn't a gap. If it shows up only where rivals win, that page is helping them and not you.
Reproduce the Diagnosis: How Big the Gap Is
Across the 280 unbranded answers in our two runs:
| Outcome | Answers | Share |
|---|---|---|
| Named a competitor, not us (gap answers) | 102 | 36.4% |
| Named us | 21 | 7.5% |
| Named no tracked brand | 157 | 56.1% |
Gap answers outnumbered our wins about five to one. They weren't spread evenly across engines:
| Engine | Gap answers (of 70) |
|---|---|
| Gemini | 36 |
| Claude | 35 |
| ChatGPT | 16 |
| Perplexity | 15 |
Gemini and Claude recommend from lists more than the other two (engine comparison), so they generate most of the gap.
What the gap answers cite
Counting each domain once per answer, the 102 gap answers held 463 citations:
| Source type | Share of gap citations |
|---|---|
| Other third-party pages (roundups, guides, docs, other vendors) | 74.3% |
| Competitor sites | 16.8% |
| Review sites | 5.4% |
| Forums | 1.7% |
| Directories | 0.6% |
| News | 0.6% |
| Our own site | 0.4% |
Competitor sites you can't change. The other 83% of gap citations are third-party pages you can influence, and most of those (74.3% of all gap citations) are ordinary web pages: comparison posts, tool roundups, tutorials, hosting and vendor blogs.
The gap is engine-specific
Of the 190 gap-only domains, 169 were cited by one engine, 19 by two, and 2 by three. That matches what we found in the cross-engine citation study: engines read largely separate parts of the web. A gap source usually closes the gap on one engine, so rank sources by engine as well as by count.
Where in the buyer journey the gap opens
Split by the intent stage of each prompt:
| Intent stage | Unbranded answers | Gap answers | Answers naming us | Gap per win |
|---|---|---|---|---|
| Learn | 80 | 22 (28%) | 0 | — |
| Consider | 120 | 58 (48%) | 11 | 5.3 |
| Purchase | 80 | 22 (28%) | 10 | 2.2 |
The consider stage holds more than half of all gap answers. That's where buyers compare vendors, and where engines lean hardest on roundups and comparison pages. If you can only work one slice of the gap, filter the list to consider-stage prompts first. The purchase stage is closer to even, because specific price and feature questions reach the brand's own pages.
The Top Gap Sources
This is the head of the gap list from the script below, with domains replaced by what kind of site they are:
| Gap source (type) | Gap answers | Engines |
|---|---|---|
| Tool-roundup blog | 7 | 2 |
| SEO education blog | 6 | 3 |
| Audit-tool vendor | 5 | 2 |
| Hosting provider blog | 4 | 1 |
| Tutorial and course site | 4 | 2 |
| Audit-tool vendor | 4 | 3 |
| Audit-tool vendor | 4 | 2 |
| Tech blog | 3 | 2 |
| Free SEO tools site | 3 | 1 |
| Software review marketplace | 3 | 1 |
| AI-SEO tool vendor | 3 | 2 |
| GEO tool vendor | 3 | 1 |
Two observations:
- The head is short and the tail is long. The top source appeared in 7 gap answers. Most of the 190 appeared once. Work from the top, where one page influences several answers on several engines.
- Other vendors' comparison pages are gap sources. Smaller vendors publish "best tools" pages that list established competitors and themselves. Engines cite them. You can't get into a rival's page, but you can publish your own honest comparison.
Build the Gap List from Your Own Answers
Export unbranded answers as CSV: engine, answer, cited_urls (space-separated), and branded if you have it. Pass your brand, your domain, the competitors, and their domains so their own sites are excluded:
#!/usr/bin/env python3
"""Find the sources AI engines cite when they recommend competitors but not you.
Usage: python3 citation_gap.py answers.csv --brand "Acme" --domain acme.com --competitor "Globex" ...
answers.csv columns: engine, answer, cited_urls (space-separated URLs); branded rows (branded=1) are skipped.
"""
import argparse, csv, re
from collections import Counter, defaultdict
from urllib.parse import urlparse
FORUMS = ("reddit.", "quora.", "stackexchange.", "stackoverflow.", "community.", "forum")
REVIEWS = ("g2.", "capterra.", "trustradius.", "trustpilot.", "getapp.", "softwaresuggest.", "producthunt.")
def domain(u):
h = (urlparse(u).hostname or "").lower()
return h[4:] if h.startswith("www.") else h
def kind(d):
if any(x in d for x in FORUMS): return "forum"
if any(x in d for x in REVIEWS): return "review"
if d.endswith((".gov", ".edu")) or d in ("w3.org", "web.dev", "developer.mozilla.org"): return "reference"
return "other"
def main():
ap = argparse.ArgumentParser()
ap.add_argument("csv"); ap.add_argument("--brand", required=True); ap.add_argument("--domain", required=True)
ap.add_argument("--competitor", action="append", default=[]); ap.add_argument("--top", type=int, default=15)
ap.add_argument("--competitor-domain", action="append", default=[])
a = ap.parse_args()
rx = lambda n: re.compile(r"(?<![\w-])" + re.escape(n) + r"(?![\w-])", re.I)
brand_rx, comp_rx = rx(a.brand), [rx(c) for c in a.competitor]
skip = {a.domain.lower(), *(d.lower() for d in a.competitor_domain)}
gap, yours = Counter(), set()
engines = defaultdict(set)
n_gap = n_all = 0
with open(a.csv, newline="", encoding="utf-8") as f:
for r in csv.DictReader(f):
if r.get("branded") == "1":
continue
n_all += 1
ds = {domain(u) for u in r["cited_urls"].split()} - {""}
if brand_rx.search(r["answer"]):
yours |= ds
elif any(c.search(r["answer"]) for c in comp_rx):
n_gap += 1
for d in ds - skip:
gap[d] += 1
engines[d].add(r["engine"])
print(f"unbranded answers: {n_all} naming a competitor but not {a.brand}: {n_gap}")
only = {d: c for d, c in gap.items() if d not in yours}
print(f"distinct third-party domains in those answers: {len(gap)} never cited when you are named: {len(only)}")
print(f"\n{'domain':<36}{'answers':>8}{'engines':>9} type")
for d, c in sorted(only.items(), key=lambda x: (-x[1], x[0]))[: a.top]:
print(f"{d:<36}{c:>8}{len(engines[d]):>9} {kind(d)}")
if __name__ == "__main__":
main()python3 citation_gap.py answers.csv --brand "Acme" --domain acme.com \
--competitor "Globex" --competitor "Initech" \
--competitor-domain globex.com --competitor-domain initech.io --top 20On our data, the header lines read:
unbranded answers: 280 naming a competitor but not BugViso: 102
distinct third-party domains in those answers: 226 never cited when you are named: 190Notes on the script:
- Subdomains count separately.
support.globex.comisn't skipped by--competitor-domain globex.com. Add it explicitly, or extendskipto match suffixes. Hosts come fromurllib.parse.urlparse, which lower-cases them for you. - The
kind()labels are a starting heuristic. Extend theREVIEWSandFORUMStuples for your industry. Anything unmatched is "other", so read the top of the list yourself. - Matching is by exact name. Add aliases and domains your buyers use, as described in our brand mention detection guide.
Step-by-Step: From Gap List to Action
1. Rank by missed answers, then by engines
A source cited in 7 gap answers across 2 engines beats one cited once. Break ties by how many engines cite it: a source three engines trust is worth more than a single-engine source.
2. Open the actual cited URLs
Domain counts point you to the site; the cited URL tells you the page. Read each page and note what it says about the competitors, what criteria it ranks by, and whether your category is covered at all.
3. Sort into four plays
| Gap source type | Play | Effort |
|---|---|---|
| Roundup / "best tools" post | Ask to be considered on the criteria the post already uses; send facts, not pitches | Low–medium |
| Educational guide or tutorial | Offer a better example, data or a tool that fits the guide's steps | Medium |
| Review marketplace | Make sure you're listed, with complete and current details and real reviews | Medium |
| Vendor comparison page | You can't join a rival's page; publish your own honest comparison page with clear criteria | Medium–high |
A short outreach note that works
Page owners update roundups when it helps their readers, not as a favour. Keep the note factual and specific to their page:
Subject: A correction and an addition for "<page title>"
Hi <name>,
Your guide to <topic> ranks tools by <criteria the page uses>. One detail is out of date:
<competitor or category fact> is now <correct fact, with a link to the source>.
If it's useful for the same criteria, <your brand> does <specific, checkable capability>
at <price/plan>. Details: <link to the page that states it>.
Thanks for keeping the guide current,
<name, role>Lead with a correction or a missing fact about the topic the page covers, and only then mention yourself. Page owners are working toward helpful, people-first content, so frame the note around their readers. Never offer payment for a placement, and never ask for wording that misrepresents a competitor.
4. Fix your own pages first
Engines cited our own site in 21 of 21 unbranded answers that named us. Google's guidance on AI features and your website makes the same point from the other side: the pages that get shown are the ones that are indexable and helpful. When you do get named, it's usually because your own page supports the claim. Make sure your pages state category, audience, prices and differentiators in plain text, so a gap source that mentions you has something to point to. Writing content AI assistants quote covers the format.
5. Re-measure per engine
Track whether the gap closes on the engine that cited the source. One week of runs is rarely enough. Use pooled weeks and intervals.
How BugViso Finds Citation Gaps
BugViso's AI Visibility Tracker computes source gaps, which it calls citation pathways, on every run:
- For every third-party domain (review, forum, news, reference, directory or other) cited in successful unbranded answers, it counts the answers citing it, how many name your brand, and which rivals are named where you aren't.
- A gap is a source cited in at least one answer naming a rival but not you. The top 10 are ranked by missed answers, with the most-cited URLs, the engines and example prompts.
- Source coverage is the share of answers citing a third party that name your brand. It's one of three signals in the report's diagnosis, next to entity clarity (accuracy) and authority signals.
On our first run, the tracker reported source coverage of 8.4% (named in 10 of 119 answers that cite third-party sources), rated weak. Its top 10 gaps were nine third-party pages and one review site, each cited by one to four engines. The action plan then turns gaps into steps, including a play that triggers when a competitor's citation share is at least twice yours. See it on the AI visibility tracker page.
Traps and Edge Cases
Counting competitor sites as gaps. 16.8% of gap citations pointed at competitors' own sites. They're unwinnable and inflate the list. Exclude them, including their subdomains.
Mixing branded prompts in. Branded answers cite your own site 97.5% of the time and dilute the gap with irrelevant sources. Gap analysis is unbranded-only.
Chasing one-off sources. Most gap domains appeared once. A single citation can be retrieval noise: our answer consistency data shows only about a fifth of repeat answers cite the same domains. Prioritise sources that recur across runs.
Asking for links instead of accuracy. The page owner cares about being right for their readers. Lead with what the page gets wrong or leaves out about your category, with evidence.
Treating the gap as the whole problem. 157 of 280 answers named no tracked brand at all. For those prompts, the issue is that no source answers with brands. A clear category page or comparison of your own can fill that space.
FAQ
What is an AI citation gap?
A source that AI engines cite in answers recommending your competitors, but never in answers that recommend you. In our data, 190 third-party domains were gap sources across 102 answers.
How do I find which sites ChatGPT cites for my competitors?
Ask ChatGPT unbranded buyer questions with web search on, record the cited URLs, and keep the answers that name a competitor but not you. The domains cited there, minus those also cited when you're named, are your gaps.
Which citation gaps should I fix first?
The ones cited in the most gap answers and by the most engines. Start with roundups and guides you can influence, and skip competitors' own sites.
Are review sites the biggest citation gap?
Not in our data: they were 5.4% of gap citations. Ordinary third-party pages (roundups, guides, tutorials, vendor blogs) were 74.3%. Check your own data, since review sites matter more in some industries.
How long does it take to close a citation gap?
It depends on the source updating its page and engines re-reading it. Measure on the engine that cited the source, with pooled weekly runs, rather than expecting the next run to change.
Should I publish my own comparison page to close gaps?
Yes, if it's honest. Smaller vendors' comparison pages were among the top gap sources in our data, so engines clearly cite them. Use stated criteria, include competitors' real strengths, date the page and keep prices current. A one-sided page gives engines little reason to cite it over a neutral roundup.
Conclusion
Citation gaps turn "we're not mentioned" into a ranked list of pages to fix, pitch or answer, and BugViso's AI visibility tracking rebuilds that list from real answers on every run.
See where your site stands
Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.