Skip to main content

Guides

JavaScript SEO: Making Rendered Content Indexable

JavaScript SEO is the practice of making sure content your site builds with JavaScript can still be crawled, rendered, and indexed by a search engine. The short version: a crawler reads the HTML it receives first, and anything that is built only after a script runs is a bet on whether, and when, that crawler decides to render the page at all.

A page can look finished in your browser and still reach a crawler as a near empty shell. That gap between what a human sees and what a bot receives is the whole subject, and it is where most of the damage happens quietly. It is also easy to miss, because the people building and reviewing the site almost always view it in a full browser that runs every script.

How a crawler actually processes JavaScript

Treat indexing as two separate steps, not one. First the crawler fetches the raw HTML your server sends. Then, if it decides to, it renders the page in a headless browser to execute the scripts and read the final DOM. Google runs this second step with an evergreen Chromium engine, but rendering is not instant. Pages wait in a render queue, and that wait can stretch from seconds to far longer depending on available resources and priority.

  • Fetch: the crawler downloads the initial HTML response.
  • Queue: the page waits for rendering resources to free up.
  • Render: a headless browser runs your JavaScript and builds the DOM.
  • Index: the rendered DOM, not the raw HTML, is what gets stored.
  • Two things follow from this. Content that depends on rendering is always slower to index than content already present in the first response. And many crawlers never run that second step. Plenty of bots, including a number of the AI answer engines now reading the web, take only the raw HTML and move on. If your content is not in that first response, those systems never see it.

    This last point is getting more important, not less. As AI answer engines pull from the open web to build responses, the sites they can read are the ones that ship real content in the raw HTML. A page that only assembles itself in a browser is invisible to a crawler that does not run a browser, no matter how good the content is once it loads.

    Rendering strategies, from safest to riskiest

    Client-side rendering

    The server sends a thin HTML file and a bundle of JavaScript, and the browser builds the page. This is the riskiest pattern for indexing, because the first response is close to empty, so every piece of content and every link depends on a render that may be delayed or skipped. Most single page application frameworks default to this mode out of the box, which is why so many React, Vue, and Angular sites ship an almost empty initial document.

    Server-side rendering

    The server builds the full HTML for each request and sends it complete. Crawlers get real content in the first response, then JavaScript hydrates the page for interactivity. This removes the render dependency for your core content. The tradeoff is server work on every request, which costs response time and infrastructure, but for anything that has to be found, that cost buys HTML the crawler can read without waiting on a render.

    Static site generation

    Pages are built to HTML ahead of time, at deploy. The crawler receives a finished document instantly, with no per request server work and no render wait. For content that does not change on every visit, this is the most reliable option, and it is the default we reach for. The limit is freshness. Anything that changes between builds needs either a rebuild or a client fetched layer on top, so it suits content that stays stable between deploys.

    Dynamic rendering

    This serves a prerendered version to bots while humans get the JavaScript app. Google describes it as a workaround rather than a recommendation, because it adds a parallel system to maintain and can drift out of sync with what users actually see. It also means maintaining two code paths and keeping them honest, since search engines can treat a mismatch between the bot version and the human version as cloaking. Treat it as a patch for a legacy stack, not a target to build toward.

    A rule of thumb for choosing an approach

    You do not need a single rendering mode for the whole site. Decide per page type, based on how the content changes and how important it is to be found.

  • Marketing and content pages that rarely change: static generation, for fast and finished HTML with no render wait.
  • Pages with per request or per user data: server side rendering, so the crawler still gets complete HTML.
  • Truly interactive app sections behind a login: client side rendering is fine, because they are not meant to be indexed anyway.
  • The mistake is defaulting the entire site to a client rendered app for the convenience of one interactive feature, then paying for it on every page that should have been plain HTML.

    The failures that quietly break indexing

    Most JavaScript SEO problems are not exotic. They are the same handful of patterns, repeated across different stacks.

  • Content that only loads after a click, hover, or scroll, since crawlers do not interact and never trigger it.
  • Navigation built on button click handlers instead of real anchor tags with href values, because without an href there is no link to follow.
  • Titles, descriptions, and canonical tags injected by script after load, which a crawler that does not render never receives.
  • JavaScript or API files blocked in robots.txt, which stops the render from completing and leaves the page half built.
  • Hydration errors that throw before content mounts, so the rendered DOM is broken even when the raw file looked fine.
  • Infinite scroll with no crawlable paginated URLs behind it, which leaves most of the items unreachable.
  • How to diagnose it, and what we build instead

    Diagnosis is concrete. Compare the raw HTML in view source against the rendered DOM in your browser inspector. Load the page with JavaScript disabled and see what survives. Then run the live URL through the URL Inspection tool in Google Search Console, which shows you the exact HTML Google rendered and flags any resources it could not load.

    The fix is almost always structural, not a plugin. Because Ninetyfifth Marketing builds the website itself, we control the rendering path from the start: server rendered or statically generated HTML for anything that needs to be found, real anchor links for navigation, and metadata emitted on the server instead of bolted on by a script later. Interactive pieces stay as islands of JavaScript layered on top of content that is already complete in the first response. For how that fits a full engagement, see the SEO service, and for the commercial terms, the pricing page.

    Where JavaScript SEO sits in the stack

    Rendering is upstream of everything else. If a crawler cannot see your content, no amount of keyword work, internal linking, or schema matters, because none of it is in the document being read. Get the rendering path right first, and the rest of your technical SEO finally has something solid to stand on.

    Questions

    Does Google execute JavaScript when it crawls a site?

    Yes. Google renders pages with a headless Chromium browser and indexes the resulting DOM. But rendering happens as a second, queued step after the initial crawl, so it can be delayed. Many other crawlers, including several AI answer engines, do not run JavaScript at all and only read the raw HTML.

    Is client-side rendering bad for JavaScript SEO?

    It is the riskiest pattern, because your first HTML response is nearly empty and all content and links depend on a render that may be delayed or skipped. It is not automatically fatal for Google, but it adds fragility and hurts every crawler that does not render. Server-side rendering or static generation removes that dependency.

    How do I test whether my JavaScript content is indexable?

    Compare the page source against the rendered DOM in your browser inspector, and load the page with JavaScript turned off to see what survives. Then run the live URL through the URL Inspection tool in Google Search Console, which shows the exact HTML Google rendered and lists any resources it could not load.

    What is the difference between server-side rendering and dynamic rendering?

    Server-side rendering builds the full HTML on the server for every visitor, human or bot, so everyone receives the same complete document. Dynamic rendering serves a prerendered version only to bots while humans get the JavaScript app. Google treats dynamic rendering as a workaround rather than a recommendation, because the two paths can drift out of sync.

    Related

    By Marco Consuelo, Ninetyfifth Marketing. Last reviewed .

    Downtown Phoenix, by appointment only. contact@ninetyfifthmktg.com

    Ninetyfifth Marketing

    Let's talk.

    Take 90 seconds to tell us about your business. If we're a fit, we'll reach out to set up a call.

    Ninetyfifth Marketing
    Ninetyfifth Marketing
    Live chat · Replies in minutes
    Ask a question and someone from our team will jump in.