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.

BugViso

13 min read

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:

  1. Is cited in an answer that names at least one competitor, and
  2. 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:

OutcomeAnswersShare
Named a competitor, not us (gap answers)10236.4%
Named us217.5%
Named no tracked brand15756.1%

Gap answers outnumbered our wins about five to one. They weren't spread evenly across engines:

EngineGap answers (of 70)
Gemini36
Claude35
ChatGPT16
Perplexity15

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 typeShare of gap citations
Other third-party pages (roundups, guides, docs, other vendors)74.3%
Competitor sites16.8%
Review sites5.4%
Forums1.7%
Directories0.6%
News0.6%
Our own site0.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 stageUnbranded answersGap answersAnswers naming usGap per win
Learn8022 (28%)0—
Consider12058 (48%)115.3
Purchase8022 (28%)102.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 answersEngines
Tool-roundup blog72
SEO education blog63
Audit-tool vendor52
Hosting provider blog41
Tutorial and course site42
Audit-tool vendor43
Audit-tool vendor42
Tech blog32
Free SEO tools site31
Software review marketplace31
AI-SEO tool vendor32
GEO tool vendor31

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:

python
#!/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()
bash
python3 citation_gap.py answers.csv --brand "Acme" --domain acme.com \
  --competitor "Globex" --competitor "Initech" \
  --competitor-domain globex.com --competitor-domain initech.io --top 20

On our data, the header lines read:

text
unbranded answers: 280   naming a competitor but not BugViso: 102
distinct third-party domains in those answers: 226   never cited when you are named: 190

Notes on the script:

  • Subdomains count separately. support.globex.com isn't skipped by --competitor-domain globex.com. Add it explicitly, or extend skip to match suffixes. Hosts come from urllib.parse.urlparse, which lower-cases them for you.
  • The kind() labels are a starting heuristic. Extend the REVIEWS and FORUMS tuples 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 typePlayEffort
Roundup / "best tools" postAsk to be considered on the criteria the post already uses; send facts, not pitchesLow–medium
Educational guide or tutorialOffer a better example, data or a tool that fits the guide's stepsMedium
Review marketplaceMake sure you're listed, with complete and current details and real reviewsMedium
Vendor comparison pageYou can't join a rival's page; publish your own honest comparison page with clear criteriaMedium–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:

text
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.

Found this useful? Share it.

See where your site stands

Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.