Auditing JavaScript Rendering with Screaming Frog
URL Inspection tells you the truth about one URL; auditing a whole site needs a crawler that renders JavaScript across every template. Screaming Frog’s JavaScript rendering mode executes each page in headless Chromium and stores the rendered DOM, so you can find the product pages, filtered listings, or paginated routes that render empty while the homepage looks fine. This is the at-scale stage of the SPA audit workflow.
Step-by-step fix
-
Enable JavaScript rendering. In Configuration → Spider → Rendering, switch to JavaScript. Without this, the crawl reports the empty shell for every CSR route.
❌ Rendering: Text Only → every CSR page reported as empty/thin ✅ Rendering: JavaScript → crawler executes the bundle, captures rendered DOM -
Set an adequate render timeout. Give pages enough time to resolve data, but note that a page needing many seconds to render is itself an SEO problem worth flagging.
-
Store and compare raw vs rendered. Enable storing both so you can see which content exists only after JavaScript — that content is exactly what depends on the render queue.
-
Filter for failures. After the crawl, sort by rendered word count, missing
<title>, and missing canonical to surface broken templates.Post-crawl triage: - Rendered word count ≈ 0 → page renders empty (render failure) - Title/H1 present in raw? No → metadata depends on JS (audit the head) - Canonical missing after render → duplicate-content risk -
Confirm the worst offenders in Search Console so you act on Googlebot’s actual behavior, not just the crawler’s approximation.
Validation
- Rendered word count is non-trivial for every content template.
- Raw vs rendered diff shows expected content appearing after rendering, not disappearing.
- No template reports a missing rendered
<title>or canonical. - Sampled URLs confirmed in GSC URL Inspection match the crawl findings.
Reference
Screaming Frog config for a CSR audit:
- Spider → Rendering: JavaScript
- Rendering → AJAX timeout: raise until renders complete
- Spider → Extraction: store Rendered HTML
- Bulk Export → Response Codes + Page Titles + Canonicals
- Sort: Word Count (rendered) ascending → empty pages float to top
Frequently Asked Questions
Why does my crawler report every page as empty? A crawler in default mode fetches only the initial HTML, which for a CSR app is an empty shell. Enable JavaScript rendering so the crawler executes the bundle and captures the rendered DOM, the way Googlebot’s second wave does.
Does a JS-rendering crawl match what Googlebot sees? It is a close approximation — both render in headless Chromium — but Googlebot applies its own timeout and resource budget. Use the crawl to find broken templates at scale, then confirm specific URLs in Search Console URL Inspection for the authoritative view.
Related
- SEO Audit Workflows for Client-Side Apps — where this stage fits.
- Debugging rendering with GSC URL Inspection — confirm individual URLs.
- JavaScript Execution Limits and Crawl Budget — why slow renders cost you.
← Back to SEO Audit Workflows for Client-Side Apps