React SEO guide: why client-side rendering hurts indexing, when to choose SSR or prerendering, how to set meta tags in React 19 and stay readable by AI.

On this page
In short
React can rank on Google, but a default single page app sends an almost empty HTML file and depends on JavaScript to show content, which delays indexing and hides the page from most AI crawlers. The reliable fix is to deliver HTML from the server: prerender static pages at build time or use a framework with server rendering (Next.js, React Router). Then set a unique title, description and canonical per URL, use real links and status codes, and verify what bots receive.
Want to go further? Ask
Quick quiz
Is SEO right for you, and how should you start?
Sorank matches your answers
Test it for 3 days on your own site and see where you stand on Google, ChatGPT and the other AIs.
Start 3-day free trial3 days free, then stop whenever you want. 90-day results-or-refund guarantee.
React SEO is the work of making a React application crawlable, indexable and understandable by search engines and AI assistants. React itself is neutral: the problems come from rendering everything in the browser. Google confirms in its JavaScript SEO basics that it processes JavaScript apps in three phases (crawling, rendering, indexing) and that "server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript."
A React app created as a single page application ships an HTML file that contains little more than an empty root div and a script tag. The browser downloads the JavaScript, runs it and builds the page. A crawler that reads only the HTML sees nothing to index: no headings, no text, no links.
Googlebot does run JavaScript, but in a separate step: the page is crawled, queued for rendering, rendered in a headless Chromium, and only then are the rendered links and content used. Every extra step is a chance for failure (a script error, a blocked API, a timeout) and adds delay before new pages appear in search. Our guide to JavaScript SEO details this pipeline, and our article on Google indexing covers how to get pages indexed faster.
Other bots are less patient. Vercel's December 2024 analysis The rise of the AI crawler found that "none of the major AI crawlers currently render JavaScript", naming GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot and PerplexityBot. A client-rendered React page is invisible to ChatGPT, Claude and Perplexity, even when Google indexes it.
The React team now recommends starting new apps with a framework. When it deprecated Create React App on February 14, 2025, it wrote in its announcement that "server rendering can improve SEO" and also improves performance by reducing the JavaScript users must download before seeing content. The options, from weakest to strongest for search:
| Approach | What bots receive | SEO verdict | Typical tools |
|---|---|---|---|
| Client-side rendering (SPA) | Empty HTML, content after JavaScript | Weak: delayed indexing, invisible to AI crawlers | Vite + React, old Create React App projects |
| Dynamic rendering | Prerendered HTML for bots only | Workaround, not recommended by Google | Prerender services, headless browser proxies |
| Static prerendering at build | Full HTML for every known URL | Very good for content that changes rarely | React Router prerendering, static site generators, Next.js static export |
| Server-side rendering | Full HTML on every request, then hydration | Best for large or frequently updated sites | Next.js, React Router (framework mode, formerly Remix) |
On dynamic rendering, Google's documentation is explicit: it "was a workaround and not a long-term solution", and Google recommends server-side rendering, static rendering or hydration instead. If you are choosing a framework, our Next.js SEO guide covers rendering modes, the Metadata API and sitemaps in detail.
If migrating is not possible, a single page app can still be indexed by Google with care. Our guide to single page application SEO lists the conditions; the rest of this article applies to both cases.
Since React 19 (stable since December 5, 2024), components can render title, meta and link tags directly, and React hoists them into the document head. The React 19 release notes state that this native support works "with client-only apps, streaming SSR, and Server Components". Before React 19, libraries such as react-helmet or react-helmet-async did the same job, and they remain useful for overriding defaults per route.
function ProductPage({ product }) {
return (
<>
<title>{`${product.name} | Shop`}</title>
<meta name="description" content={product.summary} />
<link rel="canonical" href={`https://example.com/p/${product.slug}`} />
<h1>{product.name}</h1>
</>
)
}Three rules apply whatever the method:
Watch out
In a client-only app, tags rendered by React exist only after JavaScript runs. Google can read them after rendering; AI crawlers and most social preview bots cannot. Server rendering or prerendering puts them in the HTML response for everyone.
Google states that it "can only discover your links if they are a HTML elements with an href attribute" and advises against using URL fragments to load different content. Most React SEO failures come from routing details:
| Mistake | Effect | Fix |
|---|---|---|
| Navigation with onClick on div or button | Google finds no link to follow | Use the router's Link component, which renders a with href |
| Hash routes (/#/products) | All pages share one URL for Google | Use history-based routes (/products) with BrowserRouter or a framework |
| A "not found" view served with status 200 | Soft 404 in Search Console | Return a real 404 from the server, or add noindex with JavaScript in a pure SPA |
| Client-side redirects only | Slow or missed redirects | Use server 301 or 308 redirects for moved pages |
| Content loaded on click or scroll | Text never rendered for the crawler | Render the main content on load; paginate lists with real URLs |
| JavaScript or API blocked in robots.txt | Google renders an empty page | Allow the scripts and API endpoints the page needs |
To see what Google renders, use the URL Inspection tool in Search Console and view the tested page's HTML, or run an indexability checker on key templates.
React has no built-in sitemap. Generate sitemap.xml at build time from your routes and data (or from your framework's sitemap feature), list only canonical URLs that return 200, and reference it in robots.txt. An XML sitemap generator works for small static sites.
Structured data follows the same rule as metadata: render the JSON-LD script with the page, from the same data, ideally on the server. Google can read JSON-LD injected by JavaScript after rendering, but markup that is absent from the initial HTML is absent for crawlers that do not render. Use Article for posts, Product for e-commerce, Organization site-wide and BreadcrumbList for deep pages.
Tip
Run curl on a page URL and search the output for its H1 and a sentence from the body. If they are missing, Google may index the page after rendering, but AI crawlers will see nothing.
Large JavaScript bundles hurt Core Web Vitals: the browser must download, parse and hydrate code before the page becomes responsive, which weighs on Largest Contentful Paint and Interaction to Next Paint, especially on mobile. The React team's Create React App announcement notes that server rendering sends less JavaScript and a full HTML document, which produces a faster First Contentful Paint and can lower INP. Practical levers: split code by route with React.lazy, ship images with explicit dimensions, lazy-load components below the fold, and audit third-party scripts.
GEO (generative engine optimization) starts with access. Since AI crawlers fetch raw HTML, a React page must deliver its text, headings and JSON-LD without JavaScript to be read, summarized and cited. A website crawlability AI audit shows what these bots receive from your pages. The second condition is content worth citing: pages that answer one question per section, with sources, figures and clear definitions.
That content side is what Sorank, our product, automates. Sorank is an autopilot SEO and GEO software: its blog article generator writes and publishes 20, 60 or 120 articles per month with sources, internal links and images, and it connects to custom stacks such as a React or Next.js site through a webhook. Its SEO chat answers questions about your site's search performance in a conversation.

The short version: serve HTML from the server, give every URL its own title, description and canonical, and use real links. React then ranks like any other site, and AI assistants can read it. To keep that site supplied with articles built for Google and AI, see Sorank's plans, from $49 per month with a 3-day free trial.
No. React is a user interface library, and its SEO depends on how pages are rendered. A client-rendered single page app sends empty HTML and relies on Google's rendering step, which delays indexing and hides content from AI crawlers. The same React code served with server rendering or static prerendering ranks like a classic website.
Yes. Googlebot renders JavaScript with a recent version of Chromium, so it can index content that a React app builds in the browser. Rendering happens after crawling and can be delayed or fail if scripts error or APIs are blocked. Checking the rendered HTML with the URL Inspection tool in Search Console shows what Google sees.
Not for basic cases. React 19 renders title, meta and link tags from any component and hoists them into the document head. Libraries such as react-helmet-async remain useful when you need to override site-wide defaults per route or support older React versions.
THEY TRIED SORANK BEFORE YOU
