A browser running JavaScript and a crawler reading raw HTML can see two different pages. Most of the time that gap is harmless. Crawl Cove's content-depends-on-js check exists for the times it is not: when something a search engine needs to index only exists after a script runs.
What this finding means
This check compares the raw HTML a no-JavaScript crawler receives against the fully rendered page, and fires when the rendered version differs in a way that matters: structured data that only appears after rendering, a <title> that JavaScript changes or injects, or a large jump in visible text between the two versions. It only runs on pages that actually went through a rendered pass; a page that was never rendered gets no finding at all, rather than a guess.
A real finding looks like this:
rendered DOM added 1 JSON-LD block absent from raw HTML; rendered visible text is 3,842 chars vs 612 raw (+3,230, >= 2x and >= 500 chars)
One finding per page, naming exactly which signal or signals triggered it.
Why it matters
Content that exists only after JavaScript runs depends on a second, slower rendering pass that is not guaranteed to happen the same way every time. Whatever the crawler misses on the fast first pass may be indexed late, indexed incompletely, or in some cases missed entirely, and structured data is especially exposed here: if it only appears after rendering, a system reading raw HTML never sees it at all.
How to fix it
- Identify what the finding says actually changed: injected structured data, a changed title, or a large text jump are three different problems with the same underlying cause.
- Move critical content into the initial HTML response. Server-side rendering (SSR) generates the full page, including this content, on the server before it reaches the browser or crawler.
- If a full SSR rewrite is not practical, pre-render instead. Generating static HTML for content that does not change per visitor gets the same result for search engines without restructuring the whole application.
- Structured data specifically should be emitted directly in the server-rendered HTML, not injected by a client-side script, since it is exactly the kind of content this check is built to catch.
- Re-crawl the page once the fix ships to confirm the raw and rendered versions now agree.
False positives and edge cases
- A page that was never rendered gets no finding, never a guessed one. If the render pass did not run (for example, a missing browser dependency), the check returns nothing rather than inventing a result it cannot support.
- Small client-side interactivity is not what this looks for. The check only fires on a large text jump (at least double the raw length and a real character-count minimum), a title change, or new structured data, not on minor DOM tweaks that leave the actual content unchanged.
- This is a risk finding, not proof indexing failed. Modern search engines can render JavaScript; this check flags the pages where the outcome depends on that second pass actually happening, which is a real but not certain risk.
Related reading
For the check that flags a page with very little content at all, a different way a page can under-deliver on what search engines can actually read, see Thin Content.
To check the rest of a site for the same dependency, including the canonical and robots tags this check does not compare, see how to run a JavaScript SEO audit.
Google documentation: Understand JavaScript SEO basics
Frequently asked questions
- Doesn't Google run JavaScript now?
- Yes, but rendering is a second, slower pass that is not guaranteed to happen for every page on every crawl. Content only visible after that second pass can be indexed later than the raw HTML, indexed incompletely, or in some cases missed altogether, so it is a real risk rather than a solved problem.
- Does every JavaScript-powered feature trigger this?
- No, only content Crawl Cove's own comparison found materially missing from the raw HTML: injected structured data, a title changed by script, or a large jump in visible text between the raw and rendered versions. Small client-side interactivity that doesn't change what content exists is not what this check looks for.
- Why does this check require a rendered pass to even run?
- It compares raw HTML against the rendered DOM, so without a completed render there is nothing to compare against. Rather than guess, the check reports nothing at all for a page it never rendered, so a missing browser never invents a false finding.
- Is server-side rendering the only fix?
- It is the most reliable one. Pre-rendering (generating static HTML at build or request time) achieves the same result for content that does not change per visitor, without necessarily rewriting the whole app to render server-side.