What is SSR (server-side rendering)?
Server-side rendering (SSR) is the technique by which the server builds a page's complete HTML before sending it, so the browser or a crawler receives the content already written in the first response. It is the opposite of client-side rendering, where JavaScript assembles the content in the browser after the page loads.
Key takeaways
- With SSR, the content travels in the first HTML response; with client-side rendering, JavaScript assembles it in the browser.
- Google renders JavaScript in a second phase, and still recommends server-side rendering because not all bots run JavaScript.
- Google calls dynamic rendering a workaround and recommends server-side rendering, static rendering or hydration instead.
- In a Vercel measurement published in December 2024, none of the major AI crawlers executed JavaScript.
- To find out whether a piece of data is in the initial HTML, look at the page's source code, not the browser inspector.
When someone, or something, requests a product page, the store answers with an HTML document. The question this term settles is what that first document carries: the product's name, price and data already written out, or a nearly empty page and a JavaScript file that assembles them afterward in the browser. Here SSR is not the "SSR" rarity tier of gacha games: it is server-side rendering. It matters to you because not everything that reads your store runs JavaScript, and what is not in the first response may never be read by anyone except a person with a browser.
How it works
The reference guide on web.dev, written by Addy Osmani and Jason Miller and updated on January 5, 2026, distinguishes these ways of producing a page:[1]web.dev (Addy Osmani and Jason Miller). Rendering on the Web
| Technique | Where the HTML is built | What the first response carries |
|---|---|---|
| Server-side rendering (SSR) | On the server, on every request | The HTML with the content |
| Client-side rendering | In the browser, with JavaScript that modifies the DOM | A nearly empty page and the scripts |
| Static rendering | At build time, one file per URL | The HTML with the content, prepared in advance |
| Hydration | On the server, and then JavaScript adds state and interactivity | The HTML with the content, which then comes alive |
Web.dev defines SSR as rendering an application on the server to send HTML, rather than JavaScript, to the client, and client-side rendering as rendering it in the browser, using JavaScript to modify the DOM.[1]web.dev (Addy Osmani and Jason Miller). Rendering on the Web The practical difference is in the first response: with SSR, whoever downloads it already has the content; with client-side rendering, they have to run the JavaScript to see it.
Google does run JavaScript, but in a second phase. It processes pages in three steps: crawling, rendering and indexing. Googlebot queues pages that respond with a 200 status code for rendering, and a page can spend a few seconds or longer in that queue. Even so, Google's documentation says that server-side rendering or pre-rendering is still a great idea, because it makes the website faster for users and crawlers, and because not all bots can run JavaScript.[2]Google Search Central. Understand JavaScript SEO basics
For years, one way out was dynamic rendering: serving bots a pre-rendered version and people the usual one. Google now describes it as a workaround it does not recommend, because it adds complexity and uses resources, and proposes instead server-side rendering, static rendering or hydration.[3]Google Search Central. Dynamic rendering as a workaround
AI crawlers and the initial HTML
The "not all bots" part has become concrete with the crawlers of the AI companies. Vercel, with the consultancy MERJ, analyzed its network's and nextjs.org's traffic for several months, and published on December 17, 2024 that none of the major AI crawlers rendered JavaScript: among them, OpenAI's (OAI-SearchBot, ChatGPT-User and GPTBot) and Anthropic's (ClaudeBot). They downloaded JavaScript files but did not execute them. The exceptions it pointed out were Gemini, which uses Googlebot's infrastructure, and AppleBot, which renders with a browser.[4]Vercel, with MERJ. The rise of the AI crawler
Read that figure with its date and its scope: it is one company's measurement of its own network, from late 2024, and crawlers change. What does not change is the practical conclusion, which matches Google's: if a piece of data has to be readable by any crawler, it has to be in the initial HTML.
In a store
Fictional example. The same backpack product page, served two ways. With client-side rendering, the store's first response is this:
<body>
<div id="app"></div>
<script src="/assets/store.js"></script>
</body>
The name, the price and the structured data exist, but inside store.js, and they only appear when someone runs it. With server-side rendering, the first response already carries them:
<body>
<h1>Hiking backpack 30 L</h1>
<p class="price">$89.00</p>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Hiking backpack 30 L"
}
</script>
</body>
On Shopify, themes are written in Liquid, which is resolved on the server, and Shopify recommends painting essential content that way, with Liquid and HTML, instead of with JavaScript frameworks in the browser: the initial HTML works without JavaScript.[5]Shopify.dev. Render essential content server-side That is why a piece of data stored in metafields and painted by the theme arrives in the first response. Clione publishes its structured data through each platform's native routes, rendered on the server: a BigCommerce widget on BigCommerce, and metafields with a Shopify app embed on Shopify, without injecting them with JavaScript in the browser.
What gets mixed up
The browser inspector does not show the initial HTML. It shows the DOM, that is, the page after JavaScript has modified it, so seeing the price or the JSON-LD there does not prove they are in the first response.[1]web.dev (Addy Osmani and Jason Miller). Rendering on the Web The page's source code is for that.
How to check it
- Open the product page and look at the source code (in most browsers, Ctrl+U or Cmd+Option+U). That is the initial response. Look for the product name, the price and
application/ld+json. - Compare it with the inspector. What appears in the inspector and not in the source code was added by JavaScript afterward.
- Download it from the terminal, with no browser:
curl -s https://your-store.example/products/backpack | grep "ld+json". If it returns nothing, the structured data is not in the initial HTML. - Turn off JavaScript in the browser and reload the product page. Whatever disappears depends on JavaScript to be shown.
- Look at what Google rendered. The URL Inspection tool in Search Console and the one Google offers to check rich results, the Rich Results Test, show the rendered HTML.[2]Google Search Central. Understand JavaScript SEO basics Remember that this is what Google sees after running JavaScript, not what a bot that does not run it sees.
Related concept: JavaScript rendering
JavaScript rendering is the step in which a browser, or a crawler like Googlebot, executes a page's scripts to get its final content. SSR aims to make that step unnecessary for reading the essentials: the content already arrives written out, and JavaScript only adds interactivity on top, as in hydration.[1]web.dev (Addy Osmani and Jason Miller). Rendering on the Web A headless store can use either technique, which is why it pays to ask which one it uses before assuming its product pages can be read.
To keep going, the publishing by platform reading path explains how each piece of data reaches the store on Shopify and on BigCommerce.
Synonyms
- English
- server-side rendering, SSR
- Español
- renderizado en el servidor, renderizado del lado del servidor
Sources
- [1] web.dev (Addy Osmani and Jason Miller). Rendering on the Web. Accessed . ↑ ↑ ↑ ↑
- [2] Google Search Central. Understand JavaScript SEO basics. Accessed . ↑ ↑
- [3] Google Search Central. Dynamic rendering as a workaround. Accessed . ↑
- [4] Vercel, with MERJ. The rise of the AI crawler. Accessed . ↑
- [5] Shopify.dev. Render essential content server-side. Accessed . ↑
Change history
- First English version.
This definition is published under CC BY 4.0. Reuse this definition freely, crediting Clione with a link to this page.
Related terms
Shopify app embed
What a Shopify app embed is, how it differs from an app block, why it comes switched off after you install the app, and how to check that it works.
BigCommerce widget
What a BigCommerce widget is, how template, region and placement combine in the Widgets API, and how to check it shows up in your store's HTML.
Metafields
What Shopify metafields are, what parts they have, how they get from the admin to the product page's HTML and how to check your theme publishes them.
JavaScript rendering
What JavaScript rendering is, how Google does it in a second phase, what AI bots that don't run it see and how to check it in your store.
Web crawler
What a web crawler is, how it discovers your store's product pages, what it respects in robots.txt, and how to check in your logs who is visiting.
Headless commerce
What headless commerce is, what it separates between backend and frontend and what a headless store must do so search engines and AI can read its data.
Make your catalog easy for bots to read
Clione fills every product page with what bots read best: the JSON-LD graph with its structured data, the meta description and the FAQs. You review and press Push; then we check your live store so it all stays published.