A Technical SEO Audit Checklist for JavaScript-Rendered Sites
If your site relies on JavaScript to render its main content, the first question to answer in any audit is simple: does the content search engines need exist in the rendered HTML, and can it be discovered without user interaction? Many JavaScript SEO problems come down to that single point. The raw HTML returned by the server may be nearly empty, with the real content injected by the browser after the page loads. Your audit therefore has to examine the rendered DOM, not just the initial response.
## Why JavaScript sites need a different audit
Search engines crawl in two phases. They first fetch the raw HTML, then later render the page using a browser engine to see what JavaScript produces. Rendering is resource-intensive and can be deferred, so anything that depends on it may be discovered slowly or, if rendering fails, not at all. A traditional audit that only reads source HTML will miss this entire layer.
## Compare raw HTML against rendered HTML
The foundational test is to view the same page two ways:
- **Raw source:** what the server returns before any script executes.
- **Rendered DOM:** what exists after JavaScript has run.
For each important element, check whether it appears in both or only after rendering. Pay particular attention to:
- Primary body content and headings
- Internal links in navigation and pagination
- Title tags, meta descriptions and canonical tags
- Structured data
- Hreflang annotations
If canonical or hreflang tags are only injected client-side, treat that as a high-priority finding; these directives are far more reliable when present in the initial HTML.
## Test how links are implemented
Search engines follow links expressed as proper anchor elements with an href attribute pointing to a crawlable URL. Common JavaScript anti-patterns break this:
1. Navigation built from buttons or div elements with click handlers instead of real anchors.
2. Links with href="#" or javascript:void(0) that change state without a genuine URL.
3. Content loaded only on scroll or click, with no underlying linked URL to discover.
Audit your key navigation paths and confirm that every route to important content is reachable via a crawlable anchor in the rendered DOM.
## Check for rendering failures and timeouts
Rendering can fail for reasons that never affect a normal user on fast hardware. During an audit, look for:
- **Blocked resources.** If robots.txt disallows the JavaScript or CSS bundles, rendering may be incomplete. Bots need to fetch the files that produce the content.
- **Client-side errors.** Scripts that throw on certain pages can leave content unrendered.
- **Heavy dependencies.** Content that only appears after multiple sequential network requests may not survive a rendering timeout.
- **Reliance on interaction.** Anything requiring a click, hover or scroll to load is effectively invisible to crawlers.
## Evaluate the rendering strategy itself
Different rendering approaches carry different audit implications:
- **Server-side rendering (SSR)** and **static generation** deliver content in the initial HTML and are the most robust for SEO.
- **Client-side rendering (CSR)** pushes all the work to the browser and is the riskiest; it demands the most careful auditing.
- **Dynamic rendering**, where bots are served a pre-rendered version, can work but introduces a separate pipeline that must be kept in sync with the user-facing version, or you risk serving stale or divergent content.
When auditing, identify which strategy is in use and whether it is applied consistently across templates. Mixed strategies across page types are a frequent source of inconsistent indexing.
## Verify metadata is stable and singular
Client-side routing can leave behind duplicate or stale metadata when navigating between pages without a full reload. Audit for:
- Multiple title or canonical tags in the rendered DOM
- Metadata that fails to update when the route changes
- Default placeholder titles persisting on deep pages
Because search engines typically render each URL fresh rather than navigating your single-page app like a user, the most important check is that a direct request to each URL produces correct, unique metadata on its own.
## Confirm structured data survives rendering
If you rely on structured data for rich results, confirm it is valid in the rendered output and that the values match the visible content. JavaScript-injected structured data can work, but it must be present and well-formed after rendering, and it must not describe content that is not actually on the page.
## Practical takeaway
For JavaScript sites, audit the rendered DOM, not the raw source. Confirm body content, crawlable anchor links, canonical and hreflang tags, metadata and structured data all exist after rendering, check that no required scripts are blocked, and identify whether each template uses server-side, static, client-side or dynamic rendering. Where content depends on interaction or fragile rendering, prioritise moving it into the initial HTML.