The page Google saw was empty
A client's marketing site had been live for eight months. Good copy, real case studies, a designer who knew what they were doing. It ranked for exactly one term: the company's own name. The team assumed the market was crowded. The market had never seen the site.
The whole page was rendered in the browser. What the server sent was this:
<div id="root"></div>
<script type="module" src="/assets/index.js"></script>Every headline, every case study, every word of the copy existed only after JavaScript ran. Google can run JavaScript. The question is whether it will, and when.
Rendering is a queue, not a guarantee
Googlebot crawls in two passes. The first fetches your HTML and indexes whatever is in it. If the page needs JavaScript to produce content, the URL goes into a render queue and comes back later — sometimes hours later, sometimes days, and the delay is not something you control or can observe directly.
For a site with authority, the queue drains fast enough that nobody notices. For a new domain with no signals, it is the difference between being indexed this month and next quarter. And every other crawler — the one behind a LinkedIn preview, a Slack unfurl, most AI retrieval — does not render at all. They read the HTML and leave.
Checking takes thirty seconds
Fetch your own page the way a crawler does, with JavaScript disabled by construction:
curl -sS https://yoursite.com | grep -o '<h1[^>]*>.*</h1>'If your headline comes back, the server is sending real content. If you get nothing, that is what the first pass sees. Do it for a deep page too — a case study, a service page — because plenty of sites server-render the homepage and client-render everything behind it.
What actually fixes it
Server-side rendering, or static generation, or any approach where the HTML leaves your server already containing the words. The framework matters far less than the property: content in the initial response.
- Marketing pages, case studies, documentation, anything you want found: render on the server. There is no upside to shipping these as an empty shell.
- Dashboards and authenticated tools: client rendering is fine. Nobody is searching for them and they should not be indexed anyway.
- Prerendering middleware that serves a snapshot only to bots is a workaround, not a fix. You now maintain two versions of every page and hope they agree.
The part nobody budgets for
Migrating rendering strategy is not a rewrite, but it is not a weekend either. Routing, data fetching and state usually all assume the browser. The honest estimate is weeks, not days.
The reason to do it anyway is that the alternative is paying for traffic you should have earned. A site that cannot be read is a brochure with a domain name attached — and eight months of good copy nobody could find is a more expensive mistake than the migration.
Building something where these decisions matter?
Start a project