作者的小型網站為何未成為 ChatGPT 的引用來源?一次審查找出內容層面缺漏
Why my small site never showed up as a source in ChatGPT, and what an audit found
作者為未能在 ChatGPT 主題查詢中獲引用的土耳其法律資訊網站編寫審查腳本,檢查爬蟲存取、頁面解析和內容可引用性。修正可見更新日期、問題式標題、與頁面一致的 FAQPage JSON-LD 及官方資料來源連結後,自訂評分由 80/100 升至 98/100。部署後,ChatGPT 在四條主題查詢中仍引用官方來源和兩個競爭網站,而未引用該站;評分提升不代表會獲引用。
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)
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)
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
dateModifiedexactly. 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
來源:DEV Community · dev.to