DEV Community

Cover image for Why my small site never showed up as a source in ChatGPT, and what an audit found
bln-design
bln-design

Posted on AI-assisted

Why my small site never showed up as a source in ChatGPT, and what an audit found

I run a small Turkish legal-info site. Eight pages, static HTML on Cloudflare Pages, generated by a small Python script. Google indexes it. When I asked ChatGPT with search enabled about the topics those pages cover, it cited government portals, a couple of law firm blogs and a competitor. Never my pages.

I wanted to know whether that was a technical problem I could fix or just the normal state of a new domain with no reputation. So I wrote a script that checks the things AI search systems seem to care about, ran it against the live site, fixed what it flagged and measured again. This is what happened, including the part where I still don't have a result.

What I checked

Classic SEO tools cover titles and meta descriptions well. They rarely check the AI-specific parts together, so I grouped the checks into three layers.

Can the crawlers get in? ChatGPT search uses OAI-SearchBot. It is a different bot from GPTBot, which is for training. You can block GPTBot and still appear in ChatGPT search, but if OAI-SearchBot is blocked you don't appear at all. The same split exists for Perplexity and Claude. So the script parses robots.txt per user agent, then fetches every sitemap URL as Googlebot, Bingbot, OAI-SearchBot, ClaudeBot and PerplexityBot and fails any page that doesn't return 200. On Cloudflare this matters, because "Block AI bots" and Bot Fight Mode can return 403 to exactly the bots you want.

Can they parse it? JSON-LD present and valid, required fields for Article / FAQPage / Organization, canonical, lang, no noindex, enough text in raw HTML (no JavaScript execution, which is also how many AI crawlers see a page).

Is there anything worth citing? This part is pattern-based and softer: question-style subheadings, a visible "last updated" date, links to outside sources, quotes or concrete numbers, internal links.

Each check has a weight and the score is the weighted share of passing checks, with warnings counted as half:

def score(s):
    total = sum(k["weight"] for k in s.checks if k["status"] != "info")
    got = sum(k["weight"] * (1 if k["status"] == "ok"
                             else 0.5 if k["status"] == "warn" else 0)
              for k in s.checks if k["status"] != "info")
    return round(100 * got / total)
Enter fullscreen mode Exit fullscreen mode

The weights are my judgment, not something measured. OAI-SearchBot access gets the most because without it nothing else counts. llms.txt is reported but not scored: the evidence I could find says it doesn't affect citations and only a tiny share of bot traffic ever requests it.

What it found

The first run on the live site gave 80/100. Crawl access was fine. Robots allowed everything, all five bot user agents got 200, the sitemap had lastmod on every URL. The losses were all in the content layer.

No visible date on any page. 0 of 8. I had dateModified in JSON-LD but nothing a reader could see. Freshness keeps coming up in studies of AI citations, and a date that only exists in markup is easy to distrust.

Too few question headings. Half the pages had headings like "Objection process" instead of the question a person would type. When ChatGPT answers, it splits the prompt into several sub-queries. A heading that matches one of those sub-queries word for word, with a direct answer in the first sentence below it, is a much easier target than a section you have to read three paragraphs into.

FAQPage schema that didn't match the page. This one I didn't expect. One page had FAQPage JSON-LD with a question that had been reworded in the visible text and one that had been removed. Google's guidelines require FAQ markup to reflect visible content, and a mismatch is the kind of thing that gets markup ignored. The check is simple: every Question.name must appear in the page text after whitespace normalization.

for q in faq_questions:
    if norm(q) not in norm(visible_text):
        missing.append(q)
Enter fullscreen mode Exit fullscreen mode

No external sources. The pages explained legal procedure but linked only to each other. Nothing pointed to the official legislation database or the ministry pages the content was based on. That is odd for a reader, and it also ignores the one content tactic with research behind it.

What I changed

  • Added a visible "Last updated: DD.MM.YYYY" line to every page and made it match dateModified exactly. The script now checks that match too, because the two drift apart the first time someone edits one and not the other.
  • Rewrote section headings as real questions, with a one or two sentence answer directly under each, then the longer explanation.
  • Rebuilt the FAQPage JSON-LD from the visible Q&A blocks so the two can't diverge.
  • Added a short "Sources" list on each page linking to the official legislation texts and ministry pages.
  • Submitted all eight URLs through Bing Webmaster Tools and pinged IndexNow for the whole sitemap (it returned 200).

After deploying, the live site scored 98/100. The remaining two points are the quote/statistic check. I left it failing on purpose. I won't add a statistic I can't verify, and quoting legislation on a legal site needs a lawyer to sign off first.

The honest limits

A higher score doesn't mean ChatGPT will cite the site. Some things I can't get around:

  • The Bing connection is not official. Many SEO posts say ChatGPT search relies on Bing's index. OpenAI's own crawler documentation doesn't say that. I found at least one documented case where a site was dropped from Bing and its ChatGPT citations went up, not down. I treat Bing indexing as cheap insurance, not as the mechanism.
  • The research is a lab result. The content checks follow the GEO paper from Princeton and collaborators (Aggarwal et al., KDD 2024), which reported visibility gains of up to 40% from adding citations, quotations and statistics. That was measured on a benchmark with a simulated generative engine. It's the best evidence available, and it still says nothing about what a production system does with an eight-page site.
  • One week guarantees nothing. There is no published number for how long a new domain takes to be indexed and then cited. Realistic estimates I found range from weeks to months for niche queries.
  • The script runs from your IP. A pass on the user-agent test doesn't prove the real crawler, coming from its own IP ranges, gets through a WAF. Cloudflare's AI Crawl Control logs are the authoritative view.

Where it stands now

Cloudflare's AI crawler log for the last seven days shows 112 requests from AI-related bots: 87 from Google, 10 from Bing, 7 from Anthropic and 2 from OpenAI. So OpenAI's crawlers have reached the site, barely. Bing's AI Performance report shows 0 citations.

I ran a baseline test in ChatGPT about thirty minutes after deploying. Asked what the site is, it found and cited it. On four topic questions it cited official sources and two competitor sites, not mine. That's the starting point. I'll rerun the same questions and compare in a week, and I expect the answer may still be "nothing yet".

The useful outcome so far is that the problems I fixed were real and invisible without a dedicated check, especially the FAQ mismatch. If your site isn't showing up as a source, check crawler access first. If that's fine, the problem is probably in what's on the page.

The script is a single Python file with no dependencies and makes read-only GET requests unless you ask it to ping IndexNow: https://github.com/bln-design/geo-audit

Top comments (2)

Collapse
 
citedy profile image
Dmitry Sergeev •

We need to produce a short YouTube comment as a regular developer watching the video. Must be short, one or two sentences, possibly fragment. Must start with a specific reaction/question about this video, not generic praise. Must be casual, lower case start, maybe "lol", "tbh". Avoid marketing. No URLs. No double hyphen. No em-dash. Use straight quotes only. No ellipsis char. No buzzwords. Provide a comment. Potential comment: "anyone else see the same issue with Cloud

Collapse
 
contentmation profile image
ContentMation •

Really useful breakdown, especially the FAQ markup mismatch check. One layer a page level script can't see: off site mentions. Models lean on what other sources say about you, so consistent directory listings, review profiles and a few articles that name the site often matter as much as one more on page fix. contentmation.com/score grades directory, content and social presence next to SEO for any domain in about 30 seconds, which is a quick way to see that outside layer.