Citation Ready / Checks

Every AI citation readiness check, its weight, and how to fix it

Quick answer

Citation Ready runs 35 checks on a page, 33 of them weighted, for a total of 143 weight points. The heaviest are whether the exact URL returns 200 on a custom domain without noindex, whether the answer is in the raw HTML rather than behind JavaScript, and whether a direct answer paragraph follows the H1. Structured data is medium weight and site hygiene is low, because that is the order in which measured citation data separated cited pages from uncited ones.

How the four groups are weighted

GroupChecksWeight
Can it be fetched1466 (46%)
Is the answer in the HTML845 (31%)
Machine-readable824 (17%)
Site hygiene58 (6%)

Can it be fetched

If a crawler cannot reach the exact URL, or the host cannot rank in Bing, nothing else on this list matters.

weight 10 Exact URL returns HTTP 200

Why it matters: A crawler that gets a redirect chain, a 4xx or a 5xx on the exact URL stops there. Every cited page on our own sites answered 200 on its canonical URL.

How to fix it: Make the canonical URL answer 200 directly. If it redirects, cite the destination URL instead and update internal links and the sitemap to the final URL.

weight 4 Served over HTTPS

Why it matters: AI crawlers and Bing treat plain HTTP as a trust and safety signal. Every crawled page on our own sites was HTTPS.

How to fix it: Enable TLS on the host and redirect http:// to https:// with a 301.

weight 6 Canonical tag matches the final URL

Why it matters: A canonical pointing elsewhere tells the crawler to credit a different page. Duplicate self-canonical pages split citations between two URLs (measured on launchmonitorpicks, two under-500 pages).

How to fix it: Add <link rel="canonical" href="..."> whose host and path match the URL that serves the page. One canonical per topic.

weight 10 No noindex directive

Why it matters: A noindex meta tag or X-Robots-Tag header removes the page from Bing and Google, which removes it from Copilot and AI Overviews entirely.

How to fix it: Remove <meta name="robots" content="noindex"> and any X-Robots-Tag: noindex header for pages you want cited.

weight 3 Responds in under 3 seconds

Why it matters: Slow origins get crawled less often and time out for on-demand fetchers such as ChatGPT-User and Perplexity-User.

How to fix it: Serve static HTML from a CDN edge. Move heavy work out of the request path.

weight 10 Host is a custom domain, not a platform subdomain

Why it matters: Across 58 sites on *.pages.dev subdomains, Bing recorded zero impressions, while every site with impressions had its own domain. Bing ranking is the gate for Copilot citations, so a platform subdomain is structurally uncitable there.

How to fix it: Attach a custom domain (a .com or equivalent), make it the canonical host, and 301 the platform subdomain to it.

weight 6 robots.txt allows bingbot

Why it matters: Copilot citations are downstream of Bing search ranking. Zero Bing crawl means zero Copilot citations, no exceptions on our own sites.

How to fix it: Remove any Disallow rule that applies to bingbot or to User-agent: * for this path.

weight 6 robots.txt allows OAI-SearchBot

Why it matters: OAI-SearchBot is the crawler that builds ChatGPT search results and citations. It is separate from GPTBot (training). ChatGPT referrals were 39% of AI-assistant conversions on our own sites.

How to fix it: Add "User-agent: OAI-SearchBot" followed by "Allow: /", or remove the Disallow that catches it.

weight 2 robots.txt allows ChatGPT-User

Why it matters: ChatGPT-User fetches a page on demand when a person asks ChatGPT about it. Blocking it means the assistant cannot read your page even when a user pastes the link.

How to fix it: Allow ChatGPT-User in robots.txt.

weight 2 robots.txt allows PerplexityBot

Why it matters: PerplexityBot indexes pages for Perplexity answers; Perplexity-User fetches on demand. Both need access to cite you.

How to fix it: Allow PerplexityBot and Perplexity-User in robots.txt.

weight 1 robots.txt allows ClaudeBot

Why it matters: Claude uses ClaudeBot, Claude-SearchBot and Claude-User. Blocking them keeps you out of Claude answers with citations.

How to fix it: Allow ClaudeBot, Claude-SearchBot and Claude-User in robots.txt.

weight 1 robots.txt allows Google-Extended

Why it matters: Google-Extended controls Gemini and grounding use of your content. Google AI Overviews follow the normal Googlebot rules, so this is a secondary signal.

How to fix it: Allow Google-Extended, or accept that Gemini grounding may skip the page.

not scored robots.txt and GPTBot (information only)

Why it matters: GPTBot is the training crawler. Blocking it does not stop ChatGPT search citations, which use OAI-SearchBot. Reported for completeness, not scored.

How to fix it: No action needed for citations. Allow it if you also want your content in future training sets.

weight 5 Bot user-agent gets the same page

Why it matters: Some hosts serve a challenge page, a 403 or a stripped page to bot user-agents. The crawler then indexes the challenge, not your content.

How to fix it: Whitelist known crawler user-agents in your bot protection, or lower the challenge level for GET requests on content pages.

Is the answer in the HTML

Most citation crawlers read the raw server response and never run JavaScript. The answer has to be in that document.

weight 6 At least 300 words of visible text in the raw HTML

Why it matters: Below a few hundred words a crawler has little to quote. Above the floor, word count stopped mattering: a 492-word page earned 10 citations and a 3,024-word page earned one ranking, so this is a floor, not a lever.

How to fix it: Put the substance of the answer in server-rendered HTML. Do not pad; add facts, numbers and comparisons.

weight 10 Page is not an empty JavaScript shell

Why it matters: Around 99% of edge traffic on our own sites never executes JavaScript. An HTML document that is only a #root div and script bundles has nothing to cite until it is rendered, and most AI crawlers do not render.

How to fix it: Server-render or prerender the page so the main content is inside the HTML response. For an SPA, inject the prerendered article inside the app container so it is replaced on mount.

weight 4 Exactly one H1

Why it matters: The H1 tells the crawler what the page answers. Two H1s (a measured prerender bug served exactly that) dilute the match between the query and the page.

How to fix it: Use one H1 that states the question or the comparison in the words a person would type. Use H2 and H3 for everything else.

weight 8 Direct answer paragraph right after the H1 (40 to 90 words)

Why it matters: Every cited page on our own sites had a labelled answer block immediately after the H1: a declarative restatement of the question, both entities named, and at least one hard number in the first two sentences. The assistant lifts this paragraph.

How to fix it: Directly under the H1, write one paragraph of 40 to 90 words that answers the question outright, names the subject, and includes a number with a unit. No links inside it, and above any affiliate link.

weight 5 At least one table or list with 3+ items

Why it matters: Comparison tables (Feature | A | B) and ranked lists are the structures assistants extract into their own tables. Every cited comparison page on our own sites had one, sitting below the prose answer.

How to fix it: Add a comparison table with units inline, or an ordered list of picks, below the answer paragraph.

weight 3 Question-form or full-clause H2/H3 headings

Why it matters: Question-explainer guides were the fleet's biggest citation earners, and cited pages used full-clause H2s rather than one-word nouns. Assistants match subheadings to sub-questions.

How to fix it: Rewrite H2s as the questions people ask, or as full clauses ("What MPRT measures and why it differs from GtG"), not bare nouns.

weight 6 Visible "Updated" or "Published" date

Why it matters: A visible date was one of the recurring winning signals in citation tests, and studies of ChatGPT citations put 79% of cited pages as updated within a year. A hardcoded stale date is worse than none.

How to fix it: Show "Updated <Month Day, Year>" near the top, stamp it at build time, and keep it in sync with dateModified in the schema.

weight 3 Title and H1 share their key words

Why it matters: The winning Bing queries on our own sites were near string-matches on the title, and title-to-query similarity is the strongest reported factor for ChatGPT citations. The H1 should be the title minus the site suffix.

How to fix it: Make the H1 equal the title without the site name, and put the literal entity names or model numbers in both.

Machine-readable

Structured data and dates tell an assistant what the page is, who published it and how fresh it is.

weight 5 JSON-LD present and parses

Why it matters: Structured data is the cheapest way to state the page type, author, publisher and dates in a form every crawler reads. A block that fails to parse is ignored.

How to fix it: Add a <script type="application/ld+json"> block and validate it with the Schema.org validator.

weight 4 Article-type plus FAQPage, ItemList, HowTo or Product

Why it matters: The exact JSON-LD intersection across every cited page on our own sites was Article + FAQPage. The FAQ answers do not even have to be visible; they were only in the JSON-LD on the top-cited page.

How to fix it: Emit Article (or BlogPosting/WebPage) for the page and FAQPage with the same questions as your visible FAQ. Use ItemList for ranked picks and HowTo for procedures.

weight 5 datePublished and dateModified present, modified within 90 days

Why it matters: Freshness is a stated ranking signal for assistants. A fleet-wide audit found money pages carrying a dateModified three months behind their real edits; the assistant saw the stale date.

How to fix it: Stamp dateModified at build time from the real content change, and refresh the top pages at least every 60 to 90 days with visible changes.

weight 3 Author or publisher is a named Organization or Person

Why it matters: Assistants attribute claims to a source. A named publisher gives them something to attribute; a missing or empty author gives nothing.

How to fix it: Add "author" and "publisher" objects with @type Organization or Person and a "name".

weight 2 Meta description 120 to 165 characters

Why it matters: The description is what Bing and ChatGPT search show under the link, and it repeats the entity words that title matching depends on.

How to fix it: Write a 120 to 165 character description that restates the question and names the entities.

weight 2 Title 30 to 65 characters

Why it matters: Short titles lose the entity words; long titles get truncated in Bing and lose the site name or the hook.

How to fix it: Keep the title between 30 and 65 characters with the entity names first.

weight 2 Open Graph title and description

Why it matters: Chat interfaces that unfurl a link read og:title and og:description. They also repeat the key tokens that the cited pages on our own sites carried 20 to 40 times across the stack.

How to fix it: Add og:title and og:description matching the page title and description.

Site hygiene

Discovery aids. Cheap to fix, low measured effect on our own sites.

weight 3 sitemap.xml lists this URL with a lastmod

Why it matters: A sitemap is a hint, not a discovery mechanism: Bing read a 33-URL sitemap and crawled zero of them on a new domain. It still matters for refreshing what Bing already knows about a site.

How to fix it: List the URL in sitemap.xml with an accurate <lastmod>, declare the sitemap in robots.txt, and resubmit after each content batch.

not scored llms.txt (information only)

Why it matters: An analysis of about 300,000 domains found zero correlation between llms.txt and AI citations, and on our own sites the cited pages appeared zero times in their own site's llms.txt. It is hygiene, not a lever, so it is not scored.

How to fix it: Keep one if you have it. Do not spend time on it.

weight 1 robots.txt exists and is not a 404 page

Why it matters: A missing robots.txt is fine (everything allowed), but an HTML error page served at /robots.txt confuses some parsers.

How to fix it: Serve a plain-text robots.txt with a Sitemap: line.

Questions about the scoring

Which checks carry the most weight?

Exact URL returns 200 (10), no noindex (10), custom domain rather than a platform subdomain (10), page is not an empty JavaScript shell (10), and a direct answer paragraph after the H1 (8). Together with the bingbot and OAI-SearchBot robots checks (6 each) they are more than half the score.

Why is llms.txt not scored?

Because no measured data supports it. A 300,000-domain analysis found zero correlation with citations, and on our own sites the pages that earned citations were absent from their own llms.txt files. It is reported as information so you know whether you have one.

Why is a platform subdomain a fail and not a warning?

Because on our own sites it was absolute: 0 of 58 sites on *.pages.dev had any Bing impressions, and Bing ranking is the gate for Copilot citations. A page on a platform subdomain can be perfect and still be uncitable in Copilot.

How is the score calculated?

Each of the 33 weighted checks earns full credit for a pass, half for a warning and none for a fail. The score is the credit earned divided by the 143 available weight points, times 100. Information-only checks have zero weight. Grades: A 90+, B 80+, C 70+, D 60+, F below 60.

What are the top three fixes?

The failing or warning checks ordered by weight times severity (a fail counts 1, a warning 0.5). Fixing them in that order raises the score fastest and, more usefully, removes the conditions that measured data showed as blockers.

Ready to see where a page stands? Score a page, or read how the data behind these weights was collected.