Rendering schema without JavaScript
To make schema visible to AI crawlers, it must be in the raw HTML your server sends, not injected by JavaScript in the browser. ChatGPT, Perplexity and Claude do not run JavaScript, so any markup a script adds after the page loads is invisible to them. Confirm your schema is server-rendered by checking view-source, not the browser inspector: if it is not in view-source, those engines never see it.
- →ChatGPT, Perplexity and Claude do not run JavaScript; Google renders it; Copilot renders it unreliably.
- →JavaScript-injected schema is invisible to the non-JavaScript engines, so it fails to help you get cited.
- →Test with view-source, not the inspector: the inspector shows the DOM after scripts run and will mislead you.
- →The fix is to server-render the JSON-LD so it is present in the HTML before any script runs.
What render parity means
Render parity is the match between what a person sees in a browser and what a non-JavaScript engine reads from the raw HTML. When the two match, an engine that skips JavaScript sees the same schema, headings and content a visitor does. When they diverge, usually because JavaScript builds part of the page after it loads, the engine reads a thinner, sometimes empty, version.
Rubric reads what an engine reads, so render parity is a recurring theme across the checks and "schema readable without JavaScript" is a scored one. See why-ai-crawlers-dont-run-javascript for the wider explanation of the divergence.
Why JavaScript-injected schema is invisible to half the engines
Rubric scores six engines, and they do not all render JavaScript.
| Engine | Runs JavaScript? | What it sees |
|---|---|---|
| ChatGPT | No | Server HTML only |
| Perplexity | No | Server HTML only |
| Claude | No | Server HTML only |
| Google AI Overviews | Yes | Rendered DOM |
| Gemini | Yes | Rendered DOM |
| Microsoft Copilot | Unreliably | Sometimes rendered, sometimes not |
Three of the six read only what the server sent. If a tag manager, a client-side framework or a plugin injects your JSON-LD after the page loads, ChatGPT, Perplexity and Claude never receive it, and Copilot may not either. The schema is doing nothing for the engines most likely to skip it, even though it looks present in the browser.
The view-source render-parity test
This is the test to run on any page whose schema you care about. It takes under a minute and it is the single check that catches the most invisible-schema mistakes.
view-source: before the URL in the address bar. This shows the raw HTML the server sent, which is exactly what a non-JavaScript engine reads.application/ld+json. Also check that your visible answer text and headings are present, not just an empty container.How to fix it
The fix is to move the JSON-LD into the server's response so it is present before any script runs.
- Server-render or statically render the JSON-LD. On a server-rendered or static site, print the
<script type="application/ld+json">block into the page's HTML at build or request time. On a framework, use its server-rendering or static-generation path rather than a client-only component. - Do not rely on a tag manager or client-side script to add schema. Anything that runs in the browser is invisible to the non-JavaScript engines.
- Put entity schema in the shared `<head>` so every page carries it from one change. See adding-organization-schema for the Organization and Person snippet and template-fixes-vs-page-fixes for why a shared-head change is the higher-leverage fix.
When you hand this to a developer, make the view-source check a required step on the ticket, with the raw-HTML line as evidence. See handing-fixes-to-developers for the checklist pattern.
Re-run to confirm
After the schema is server-rendered, clear your CDN cache and re-run the crawl from the report header, or wait for the automatic re-check if the site is on your Watch list. Rubric reads what an engine reads, so until the cache is cleared it re-scores the old markup and the check appears to still fail. If the score does not move after a clean re-run, run the view-source test again to confirm the schema really is in the server's HTML.