Skip to content

Glossary Server-Side Rendering (SSR)

What is server-side rendering?

Definition

Server-side rendering (SSR) is the technique in which the server builds a page's complete HTML on every request and sends it to the browser ready to display, instead of delivering an almost empty document that client-side JavaScript has to fill in.

On this page 5
  1. What server-side rendering means
  2. How it works
  3. Why it matters
  4. Good practice
  5. Common mistakes
In brief

Server-side rendering delivers fully built HTML to the browser, so the content no longer depends on client-side JavaScript running without errors.

What server-side rendering means

Every web page has to turn data and templates into HTML. The question is where that conversion happens and at what moment. When the work happens on the machine answering the request, the browser receives a document that already contains the text, the links and the structure.

The opposite approach is client-side rendering. There the server returns almost empty HTML together with a JavaScript bundle, and the browser builds the interface only after downloading and executing that code. The user sees a blank screen until the process finishes, and any bot that does not execute JavaScript sees exactly the same thing.

Between the two extremes sits static rendering, also called prerendering. The HTML is generated once at build time and served identically to every visit. The difference from SSR is not in what reaches the browser but in when it is generated: static produces the HTML before the request exists, SSR produces it during the request. That is why static suits catalogues and documentation that rarely change, while SSR suits content that depends on the person, on stock levels or on the time of day.

Three labels coexist for the same thing: server-side rendering, rendering on the server and the abbreviation SSR.

How it works

The path starts with an HTTP request. The server receives the URL, resolves the route, queries whatever data sources are needed and runs the same component code the browser would otherwise run. The result is an HTML string that travels as the body of the response.

The browser can paint that HTML as soon as it arrives, without waiting for JavaScript. Then comes the second half of the process: the client bundle is downloaded and hydration runs, attaching state and event handlers to the HTML that is already there. Until hydration finishes, the page looks complete but does not respond to clicks.

The difference in the document that travels over the wire shows up when the two cases are compared:

<!-- Client: the HTML arrives empty -->
<div id="app"></div>
<script src="/bundle.js"></script>

<!-- SSR: the HTML carries content -->
<div id="app">
  <h1>Trail running shoes</h1>
  <p>Price: 119 euros</p>
</div>
<script src="/bundle.js"></script>

For search engines the path is different. Google's documentation describes three chained phases: crawling, rendering and indexing. Pages that answer with status 200 enter a rendering queue, a headless Chromium processes them once resources allow, and the resulting HTML is what gets indexed. The text itself warns that the wait in that queue usually lasts a few seconds, though it can take longer. When the HTML comes from the origin, that step stops being the fragile point, because the content is already in the first response.

Why it matters

What gets decided here is which template is generated where. The choice of framework is secondary. A product page with changing price and availability, a search with filters and a profile page do not tolerate the same answer as a blog article.

The first effect is indexability. If the main content only appears after JavaScript runs, its route into the index depends on rendering completing without incident. A script that fails, a resource blocked in robots.txt or an API call that times out leave an empty page as far as the search engine is concerned. When the HTML is built at the origin, that risk disappears.

The second effect is speed. Sending already rendered content brings the first paint forward and usually improves LCP, because the main element does not wait for a JavaScript bundle. In exchange, generating the HTML on every request consumes server time and worsens TTFB compared with a static response stored in advance.

It is worth saying plainly: SSR is not a ranking factor, and no documentation presents it as one. What is documented is its effect on indexability and on loading metrics. Those two things shape how a page performs in results, and that is the real connection.

Good practice

  • Decide the strategy per template rather than for the whole site: what changes on every visit calls for SSR, what is stable can be served already generated.
  • Put everything that should be indexed into the initial HTML: title, main text, internal links, canonical tag and robots directives.
  • Compare the source HTML with the rendered HTML in the Search Console URL Inspection tool, using one template of each type, not just the homepage.
  • Do not block in robots.txt the JavaScript and CSS files the page needs in order to render.
  • Put a caching layer in front of the rendering (CDN, page cache or data cache) to contain the cost in TTFB.
  • Keep an eye on hydration by measuring INP and reducing the JavaScript shipped, because a visible page that does not respond to clicks is still slow for the person using it.

Common mistakes

  • Assuming the search engine does not execute JavaScript. It does, but in a later phase and subject to available resources, which turns every script failure into a risk of missing content.
  • Serving bots different HTML from what the person receives. If the difference is substantial, it stops being a rendering decision and becomes cloaking.
  • Applying SSR to every route without caching and discovering the cost later, on the server bill and in a TTFB that climbs at peak hours.
  • Confusing “the HTML arrives complete” with “the page is ready”. Hydration can take time and block interaction for several seconds.
  • Leaving dynamic rendering in place as a permanent solution. Google describes it as a workaround it does not recommend, and proposes server-side rendering, static rendering or hydration instead.
Manuel Riveiro Rodriguez CEO & Digital Strategist

A technical audit covers this and everything else in one pass.

Request an audit

Frequently asked

Does server-side rendering improve rankings?

Not directly, because there is no ranking factor called SSR. What changes is that the content arrives indexable in the first response and the first paint moves earlier. Indexability and loading time do influence how a page performs, and that is the demonstrable connection.

Does Google index content generated with client-side JavaScript?

Yes. Its documentation, last updated on 4 March 2026, describes three phases: crawling, rendering and indexing. Pages answering with status 200 enter a queue, a headless Chromium renders them, and that HTML is what gets indexed. The wait in the queue usually lasts seconds, though the same text admits it can drag on.

How does it differ from prerendering?

In the moment the HTML is generated. Prerendering, also called static rendering, produces it at build time and serves the same file to every visit. Server-side rendering produces it on every request, which allows personalised or changing data at the cost of more server work.

Is dynamic rendering still valid?

Google describes it in its documentation, last updated on 10 December 2025, as a workaround and stopgap it does not recommend, because of the additional complexity and resources it demands. The options it proposes instead are server-side rendering, static rendering and hydration.

Does SSR worsen TTFB?

Usually yes, compared with a static page, because the HTML is built during the request instead of being stored already. Web performance documentation names this as its main trade-off against a faster first paint. A caching layer in front of the server removes much of that difference.