Skip to content

Render-parity diff explained

Render parity means the raw HTML your server delivers matches what a browser sees after JavaScript executes. When they don’t match, search engines that don’t render JavaScript miss content — and rendering-capable crawlers like Googlebot see something different from what a raw-HTML crawler reports. The gap between the two passes is where indexation surprises, canonical drift, and AI-invisibility quietly originate.

flowchart LR
  RAW[Raw HTML<br/>title · canonical · robots<br/>H1 · schema · links] --> CMP{Compare<br/>each field}
  REN[Rendered DOM<br/>title · canonical · robots<br/>H1 · schema · links] --> CMP
  CMP -->|identical| OK([Parity OK<br/>no finding])
  CMP -->|differs| FLAG([Finding + the<br/>corrected tag or file])
  • A completed crawl with Rendered mode enabled for the affected pages (rendered mode runs a real browser pass; it’s invoked when JS is likely to change content, metadata, canonicals, robots, structured data, or links).
  • Access to Audit → Issues, filtered to the render/JavaScript-SEO category.
  • Optional but recommended: the Google Search Console connector connected, so the crawler’s raw-vs-rendered canonical can be cross-checked against the canonical Google actually selected.

VisibilityIQ crawls each rendered page twice: a raw HTML pass (the bytes your server returns, no JavaScript executed) and a rendered pass (the DOM after the browser runs scripts and hydration settles). It captures a snapshot of both, then diffs them field by field. When a field differs, it generates a finding — and where the fix is a tag or file, it generates that corrected artifact for you.

VisibilityIQ compares these fields between the raw HTML pass and the rendered pass:

  • <title> tag
  • <meta name="description"> content
  • Canonical URL (both <link rel="canonical"> and the Link: header)
  • Meta robots directives (including a noindex that appears or disappears post-render)
  • H1 tag
  • Word count (raw vs. rendered character delta)
  • Structured data blocks (JSON-LD present in rendered but absent from raw)
  • Internal link count
  • Open Graph tags

Googlebot renders JavaScript, so a JS-injected title or canonical can still reach Google — eventually, and on a second-pass render budget. AI crawlers generally do not render JavaScript at all. GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot, and Google-Extended fetch the raw HTML and read what’s there. If your primary answer, product description, price, H1, or structured data only materializes after hydration, the raw pass is an empty shell — and the AI crawler sees an empty shell. The page is technically online and invisible to the surfaces that generate AI citations. A render-parity content gap is therefore not just a Google-render-budget concern; it is a direct AI-visibility defect. See AI crawler access checks for how this connects to the broader AI-readability audit.

Framework-injected canonicals — Next.js, Nuxt, and similar frameworks sometimes write <link rel="canonical"> in a <Head> component that only renders client-side. Googlebot may see the correct canonical; a raw-HTML crawler — and every AI crawler — sees nothing.

JavaScript-gated noindex — A noindex directive added conditionally by JavaScript (e.g., on staging builds that leaked to production). Googlebot honours it; raw-only tools don’t detect it, so the page looks indexable when it isn’t.

Content rendered after hydration — Product descriptions, review counts, prices, or H1 tags written into the DOM by a React/Vue/Svelte component. Raw HTML shows a spinner or empty div; rendered has the real content.

Meta robots from tag managers — Google Tag Manager or similar tools can inject meta robots directives after page load, changing indexability invisibly to a raw crawl.

The specific fix depends on the mismatch type:

  • Canonical injected by JS → Move the canonical into the server-rendered HTML (static or SSR). Never rely on a client-side framework to write the canonical.
  • noindex added by JS → If intentional, set the directive server-side so all crawlers see it. If unintentional, remove the condition that injects it.
  • Missing content → Pre-render critical content server-side (SSR or static generation). Do not put important H1s, structured data, prices, or primary answers behind a client-only component.

When a mismatch repeats across pages that share a layout, VisibilityIQ aggregates it into a template-level finding so you fix the component once rather than page by page — see Template-level vs. page-level issues.

VisibilityIQ generates a finding for each mismatch type with step-by-step guidance and, where applicable, the corrected tag or file.