This page's title, meta description, canonical, H1, body content, and internal links are all present in the raw HTML source — no JavaScript required.
Check view-source on this page to confirm by right clicking > "View page source".
Compare it with the client-side rendered demo to see the difference.
What this demonstrates
This page is the baseline: everything Googlebot needs is present in the raw HTML delivered by the server. Title, meta description, canonical tag, H1, body paragraphs, and internal links are all visible in view-source — no JavaScript execution required for any critical element.
This is the correct approach for any page where SEO matters. Server-side rendering means the content exists in the first HTTP response, visible to Googlebot on Wave 1.
Why it matters
When all content is in raw HTML, Google's Wave 1 crawl gets the complete picture immediately. There's no dependency on JavaScript execution timing, no second wave required for basic content discovery, and no risk of content being invisible during the gap between Wave 1 and Wave 2.
Pages index faster. Internal links are discovered on first fetch. The title and meta description that appear in search results are the ones you wrote — not a fallback or a blank. And crawl budget isn't wasted on a first pass that returns near-empty content.
Compare this to the client-side rendered demo — the same page structure, but with all body content injected by JavaScript. Or the mixed rendering demo, which sits somewhere in between.
The code
What a correctly server-side rendered page looks like in source — content present at first fetch.
<!-- Title and meta in <head> — present in raw HTML -->
<title>JavaScript SEO: Server-Side Rendered — Sally Mills</title>
<meta name="description" content="All content in raw HTML...">
<link rel="canonical" href="https://sallymills.com/seo-javascript-issues/server-side-rendered/">
<!-- H1 and body content in <body> — no JavaScript needed -->
<h1>JavaScript SEO: Server-Side Rendered (Correct)</h1>
<p>This page's title, meta description, canonical... are all present in raw HTML.</p>
<a href="/seo-javascript-issues/">Back to JavaScript SEO Issues</a>
Open Command Prompt (Windows) or Terminal (Mac) and run curl -L https://sallymills.com/seo-javascript-issues/server-side-rendered/ — you'll see full, readable content in the response. That's what Googlebot sees on Wave 1.
What Google does
- Googlebot crawls this page and receives the full HTML in the first response.
- Wave 1: the title, meta description, canonical, H1, and all body content are read immediately.
- All internal links on the page are discovered and queued for crawling — no second pass needed.
- Google can index this page immediately, using the title and meta description you provided.
- No JavaScript execution is required for any of these steps.
How to detect it
-
view-source
Ctrl+U(Windows) /Cmd+U(Mac) → the full H1, body paragraphs, and internal links are visible in the raw source. Nothing is empty or missing. -
curl
Open Command Prompt (Windows) or Terminal (Mac) and run:
curl -L https://sallymills.com/seo-javascript-issues/server-side-rendered/→ The response contains readable body content. Compare the output length against the client-side rendered equivalent. - Google Search Console A correctly SSR'd page will typically appear in Coverage as indexed, with the correct title and description. No "Crawled — currently not indexed" status caused by empty content.
- Screaming Frog JavaScript rendering OFF → same content counts as JavaScript rendering ON. Word count, heading count, and link counts are identical between the two modes. That's the signal of correct SSR.
When to use this pattern
Always, for any page where SEO matters. Landing pages, articles, product pages, category pages — if you want Google to find and index the content reliably, it needs to be in the raw HTML served by the server.
JavaScript can still be used for interactivity, UI enhancements, analytics, and personalisation. The constraint is specifically on SEO-critical elements: title, meta description, canonical, noindex directives, H1, main body content, and internal navigation links. Those should never depend on JavaScript to be present in the page source.
See also: links loaded via JavaScript — a case where the body content is in HTML but internal links are injected by JavaScript, creating a partial version of this problem.