Course outline · lesson 9 of 20
Module 01 · 0/3
How AI Answers Get Made
Module 02 · 0/3
Measure What AI Says About You
Module 03 · 0/3
Open the Door: Crawler Access
Module 04 · 0/4
Fix the Facts AI Repeats
Module 05 · 0/4
Engine Playbooks
Module 06 · 0/3
Operate and Prove It
Final exam
Unlocks when every lesson is passedCertificate
Earned, not given
Module 03 · Open the Door: Crawler Access · Lesson 3 of 3
Rendering, noindex and Snippet Controls
The AI crawlers read your raw HTML and do not run your JavaScript, and one inherited meta tag can stop Google and Bing quoting a page. Both failures are silent, and both are yours to fix.
By the end of this lesson you can
- Explain why content that appears only after JavaScript runs is invisible to the AI crawlers
- Run a manual hydration check with view-source, the rendered DOM and curl
- Find noindex, nosnippet, max-snippet and data-nosnippet directives, including ones inherited from templates
- Check the Search Console generative AI control and know how it inherits
- Decide when the Googlebot 2MB limit is worth reporting
Your robots.txt allows the right bots. Your firewall lets them in. The crawler fetches your pricing page and gets a 200. It can still leave with nothing.
Two things cause that. The page's facts may exist only after JavaScript runs, and the AI crawlers do not run JavaScript. Or the page may carry a directive, often inherited from a template nobody remembers editing, that tells engines not to index it or not to quote it. Both failures are silent, and the page looks perfect in your browser.
This lesson finishes Stage 1, access. It also holds the strongest single piece of evidence in the field: the rendering gap.
The AI crawlers read HTML, not your app
When a browser loads a client-rendered page, it downloads a thin HTML shell, runs the JavaScript, calls your APIs and builds the page you see. A crawler that does not execute JavaScript stops at the shell. Whatever your scripts would have added, it never receives.
Evidence: Vercel's crawler study (vercel.com/blog/the-rise-of-the-ai-crawler, published 2024-12-17, updated 2025-02-06): "The data indicates that while ChatGPT and Claude crawlers do fetch JavaScript files (ChatGPT: 11.50%, Claude: 23.84% of requests), they don't execute them. They can't read client-side rendered content."
Weigh that source properly. It is a one-month snapshot from December 2024, measured on nextjs.org, a sample skewed toward Next.js sites. Microsoft Copilot was left out because it has no unique user-agent. And Vercel sells server-side rendering, so it has an interest in the answer. The finding stands anyway, because it replicates: independent testing in June 2026 found that none of GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot, Meta-ExternalAgent or Bytespider rendered JavaScript.
Two crawlers are the exception. Googlebot renders JavaScript, and AppleBot renders through a browser-based crawler. So a client-rendered page can look healthy in Google and be empty to ChatGPT, Claude and Perplexity. "It ranks fine in Google" proves nothing here.
One nuance from Vercel: data shipped inside the initial HTML response, such as a JSON or React Server Components payload, may still be indexed. Data your page fetches after it loads is not there to index.
Be exact about what this lever does. Server rendering does not make an engine more likely to pick you. It decides whether your content exists in the candidate set at all. It is hygiene, not optimization, and it is the highest-confidence access fix in our evidence base.
Run the hydration check by hand
The 99Visibility Crawler Access check does not run a rendering or hydration diff, so this one is manual. It takes about five minutes a page. Start with the pages that state your facts: pricing, product, about and comparison pages.
Step 1: compare view-source with the rendered DOM
Open the page in Chrome and press Ctrl+U (Cmd+Option+U on a Mac). View-source shows the raw HTML the server sent, which is what a non-rendering crawler gets. Then open DevTools with F12 and look at the Elements panel: that is the DOM after JavaScript has run. Search both for the facts that matter. If a price, a plan name, a feature or a headline appears in Elements and not in view-source, the AI crawlers cannot read it.
Step 2: curl the page and grep for your facts
The faster version, and the one you can repeat across a site. It fetches the page with the OAI-SearchBot user-agent, because some sites serve bots different HTML, then counts what is there:
curl -s -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot" https://www.example.com/pricing -o pricing.html
grep -c -F '$49' pricing.html
grep -o -i -E "starter|growth|enterprise" pricing.html | sort | uniq -c
grep -o -i -E "noindex|nosnippet|max-snippet|data-nosnippet" pricing.html
Swap in your own price and plan names. A zero for a price you can see on screen means that price is rendered in the browser and nowhere else. The last line looks ahead to the next section.
Step 3: check content behind tabs, accordions and "load more"
Interactive content splits into two cases. If the text is in the raw HTML and only collapsed by CSS, the crawler at least receives it. If it is fetched from an API when someone clicks a tab, expands an accordion or hits "load more," it is not in the HTML, and a non-rendering crawler never sees it. Same mechanism as client-side rendering, different fix. Test it the same way: copy a sentence from inside a closed tab and grep for it in the raw file.
Fixing what you find
In order of preference: render the fact-bearing pages on the server or generate them statically; prerender those routes if a full change is not on the table this quarter; and at minimum, put the load-bearing facts, meaning prices, plan names and what the product does, into the initial HTML even if the rest of the page stays client-side. Then run the grep again. A fix you did not re-test is a guess.
Directives that stop engines indexing or quoting
The second silent failure is a directive. Four of them matter, and none has an additive counterpart. There is no tag that makes a page more quotable. These only take quotability away.
| Directive | Where it lives | What it does |
|---|---|---|
noindex | Robots meta tag or X-Robots-Tag header | Keeps the page out of the index of engines that honor it, Google and Bing included. A page outside Google's index cannot appear in AI Overviews or AI Mode. |
nosnippet | Robots meta tag or X-Robots-Tag header | No text from the page may be shown as a snippet. Google requires snippet eligibility for AI Overviews and AI Mode, so this removes the page from both. |
max-snippet:[n] | Robots meta tag or X-Robots-Tag header | Caps how many characters may be quoted. max-snippet:0 is the same as nosnippet. |
data-nosnippet | An attribute on one HTML element | Keeps that element's text out of snippets and AI summaries while the page stays indexed. |
In the page they look like <meta name="robots" content="noindex">, <meta name="robots" content="max-snippet:0"> or <div data-nosnippet>. In a response header, X-Robots-Tag: nosnippet.
Evidence: Google's AI features documentation (developers.google.com/search/docs/appearance/ai-features, updated 2025-12-10): "To be eligible to be shown as a supporting link in AI Overviews or AI Mode, a page must be indexed and eligible to be shown in Google Search with a snippet, fulfilling the Search technical requirements. There are no additional technical requirements." Bing's webmaster blog (October 15, 2025): "When Bing crawls your site, any content marked with data-nosnippet is still indexed normally, but it will be excluded from snippets and AI summaries." The same post says that content is still "available for ranking." It removes display, not eligibility to rank.
How these get applied by accident
Nobody writes noindex on their pricing page on purpose. It arrives some other way.
- From a template. A shared layout carries a robots meta tag added for one page type, and every page on that layout inherits it.
- From staging. The noindex that kept a staging site out of Google ships to production with a deploy.
- From a cookie banner. Someone wraps a container in data-nosnippet to keep banner text out of snippets, and the container also holds the main content.
- From the server or CDN. An X-Robots-Tag header set at the edge never appears in the page source, so a source review misses it. Run
curl -s -I https://www.example.com/pricingand read the headers. - From a plugin. An SEO plugin setting switched on for a whole post type covers every post of that type.
The suppression scan in the 99Visibility Crawler Access check reads both the HTML and the response headers for noindex, nosnippet, max-snippet:0 and data-nosnippet. For data-nosnippet it shows a sample of the hidden text, so you can tell a cookie banner from a pricing table.
The Search Console control you cannot see from outside
Google added a Search Console control for its generative AI features. It is opt-out, not opt-in: inclusion "is the default control for all properties." It covers AI Overviews, AI Mode and generative AI features in Google Discover. For a child property the default is "Inherit control from parent," so a property can be excluded by a setting on a parent property that someone else manages.
No crawl can detect this, ours included. There is no tag, no header and no API. If you have Search Console access, find the setting and confirm inclusion is on for the property and for its parent. Google is still rolling it out to a subset of owners, so you may not see it yet. If an agency or a former employee set up the parent property, ask them. Google states the control is not used as a ranking or inclusion signal elsewhere in Search, and it is separate from Google-Extended, which governs Gemini.
The 2MB ceiling: real, rare, report it only when hit
Google documents a hard limit on how much of a page Googlebot reads. Gary Illyes on Google's Search Central blog (March 31, 2026): "Googlebot currently fetches up to 2MB for any individual URL (excluding PDFs). … Any bytes that exist after that 2MB threshold are entirely ignored." The same post gives PDFs 64MB and says any other crawler that does not specify a limit defaults to 15MB. The counter is per URL; images, scripts and stylesheets are counted separately.
Google's own framing matters as much as the number: "For the vast majority of the web, a 2MB HTML payload is massive, and you will never hit this limit." This is a Googlebot fact, and it says nothing about how much ChatGPT's or Perplexity's crawlers read. Check the size of the HTML file your curl saved. If it is under 2MB, drop the topic. If a page inlines a huge data payload and goes over, that page has a real problem. Anything else is selling a limit nobody hit.
Worked example
Ledgerly, the fictional invoicing SaaS, sells three plans: Starter at $29 a month, Team at $79 and Scale at $199. Its 99Visibility audit flags wrong pricing, the kind of error covered in Find What AI Gets Wrong About You: two engines quote Ledgerly at $15 a month, a price it dropped in 2023 that still sits on an old review site. The pricing page is a client-side React component that loads plans from an API after the page loads. The curl request as OAI-SearchBot returns a 200 and an HTML file holding the navigation, the footer and the words "Loading plans." Zero matches for $29, $79, $199 or any plan name. To every crawler that does not render, Ledgerly's own site states no price at all, so the only price on offer is the stale one elsewhere. That is the plausible mechanism, not a proven one. The same grep finds <meta name="robots" content="max-snippet:0"> on every blog post, added to the blog layout last year to stop Google showing truncated previews. It makes the whole blog ineligible as a source for AI Overviews. The fixes: render the pricing table on the server so all three plans and prices sit in the initial HTML, remove max-snippet:0 from the blog layout, and ask the review site to correct its page. Then curl again, confirm the prices appear, and read the next audit against the date of the deploy. Module 4 picks up from here, starting with How to Create Content AI Can Quote.
Common mistakes
- Checking in a browser. Your browser runs JavaScript. The AI crawlers do not. Use view-source or curl.
- Using Google as the test. Googlebot renders. A page that ranks well can be empty to ChatGPT, Claude and Perplexity.
- Reading only the page source for directives. X-Robots-Tag lives in the response headers. Check both.
- Wrapping a layout container in data-nosnippet. It hides everything inside, including what you want quoted.
- Shipping staging's noindex to production. Make the robots tag depend on the environment, and check the live page after every deploy.
- Assuming the Search Console control is on. It is on by default, but child properties inherit from the parent. Look.
- Adding markup to help AI read the page. No tag makes content more quotable. These controls only subtract.
- Reporting the 2MB limit for pages nowhere near it. Report it only when a page exceeds it.
Key takeaways
- 01The AI crawlers fetch your raw HTML and do not run JavaScript, so facts that appear only after hydration do not exist for them.
- 02Googlebot and AppleBot render JavaScript, so ranking well in Google proves nothing about what ChatGPT, Claude or Perplexity can read.
- 03noindex, nosnippet, max-snippet and data-nosnippet only subtract; there is no tag that makes content more quotable.
- 04Suppression directives are usually inherited from templates, staging or response headers, so check the live HTML and headers, not the CMS.
- 05The Search Console generative AI control is on by default, and child properties inherit it from their parent.
- 06Googlebot ignores bytes past 2MB per URL, but report it only for a page that actually exceeds it.
Your win · about 10 minutes
Know whether your pricing page is readable and quotable
- Run curl on your pricing page with the OAI-SearchBot user-agent and save the HTML to a file.
- Search the file for your lowest price and each plan name, and note any that return zero matches.
- Search the same file for noindex, nosnippet, max-snippet and data-nosnippet, then run curl -I on the page to check for an X-Robots-Tag header.
- Write down each missing fact and each directive you found, with the page it was on.
- If you have Search Console access, confirm the generative AI control is on for the property and its parent.
Knowledge check · 4 questions · pass with 3
Pass this to complete the lesson
Graded on our server. Get 3 of 4 right to mark the lesson complete and move your timeline.
See what AI says about your brand
Run a free audit across ChatGPT, Perplexity, Google AI, Gemini and Claude, and check which AI crawlers can reach your site.
Start Free Audit