A standard React app sends an empty HTML shell and builds the page in the browser. Crawlers reading that first response find nothing to index. The fix is to render on the server — through a framework like Next.js or Remix, or by prerendering — so the content is in the HTML before JavaScript runs.
If your React site loads perfectly in a browser but Search Console reports pages as not indexed, you are almost certainly looking at a client-side rendering problem rather than a content or authority one. This page confirms whether that's the case and covers what to do.
Is this actually your problem?
These symptoms together point strongly at rendering. Any one alone might be something else.
!Search Console says “Discovered — currently not indexed” on most URLs
!View source shows almost nothing — a root div and some script tags
!The site works perfectly in a browser, with no console errors
!Google shows a generic title, or your index.html placeholder title
!Pages you submitted weeks ago still aren't in the index
!Deep links — product pages, article URLs — fare worse than the homepage
If instead your pages areindexed but ranking poorly, this is not your problem — that's a content, intent or authority question, and no amount of rendering work will change it.
What's actually happening
A React app built with Create React App, Vite or similar ships anindex.html that is essentially empty. It contains a <div id="root"> and a script tag. Everything else — your text, your navigation, your product listings — is constructed by JavaScript after that file arrives.
A crawler's first pass reads that file and nothing more. It sees an empty div. There is no text to assess, no links to follow, and often no real title. Based on that, it decides whether the URL is worth the expense of a second, rendering pass.
Sometimes that second pass comes quickly. Often it doesn't come for weeks. Occasionally, for a page that looked empty and unimportant, it effectively never comes — which is what "Discovered — currently not indexed" means in practice.
The part that does permanent damage
Missing text delays indexing. Missing links prevent discovery altogether. If your navigation and pagination are rendered client-side, the URLs behind them are never found — not indexed slowly, never crawled at all. On a large catalogue this is usually the single most expensive symptom.
Confirm it in ten seconds
Check a page that matters — a product or article URL, not the homepage. Homepages are frequently the one page that was optimised.
Check what Googlebot receives
https://
Reading the result
Verdict
What it means for you
CSR
Confirmed. The raw HTML is a shell and crawlers see nothing on the first pass. The fixes below apply directly.
HYBRID
Partially. Some content is server-rendered but key parts are not — often the product grid or article body. Check the missing-elements list to see exactly which.
SSR
Rendering is not your problem. Your content reaches crawlers on the first pass, so look at internal linking, canonicals, content quality and robots directives instead.
Image slot
Screenshot: CSR verdict on a React SPA — highlight the empty root div in raw vs the full rendered page.
A textbook CSR result: the raw HTML has a root div and nothing else.
How to fix it
Six steps. The third and fourth are the substantive ones; the rest are confirmation and cleanup.
01
Confirm the raw HTML is empty
Check what the server actually sends before JavaScript runs. If the raw HTML contains only a root div and a script tag, every crawler's first pass sees nothing.
02
Identify which content is missing
Separate the problems. Missing body text is one issue; missing links are worse, because undiscovered URLs are never crawled at all. Missing title and meta tags are a third, independent problem.
03
Choose a rendering strategy per route
Marketing pages and articles should be statically generated. Product or listing pages that change often suit server-side rendering. A dashboard behind a login needs neither — it should not be indexed anyway.
04
Move the framework, or move the fetching
The durable fix is a framework that renders on the server — Next.js, Remix, or React Router in framework mode. If migrating is not possible, move data fetching out of useEffect and into a server-rendered layer.
05
Move metadata to the server
Titles, descriptions and canonicals must be in the initial HTML. Client-side head libraries set them after the first-pass capture, which is why Google sometimes shows a title you never wrote.
06
Verify, then request reindexing
Re-run the check and confirm the content ratio is near 100%. Then use the URL Inspection tool in Search Console on a few representative URLs to prompt a recrawl.
On step four, be realistic about scale. Moving an existing React app to Next.js is a real project, not an afternoon. If that isn't available to you right now, prerendering will get crawlers the HTML they need while you plan the larger move — but treat it as a bridge. Prerendered snapshots drift from the live site, and the drift is silent.
When rendering isn't the cause
If the checker returns SSR and pages still aren't indexed, the cause is elsewhere. The usual suspects:
A noindex tag left in place
Common after a staging environment goes live. Check the rendered HTML, not just the source.
robots.txt blocking the path
Blocked URLs can be indexed without content, or not at all. Check the specific path, not just the root.
Canonicals pointing elsewhere
A template-wide canonical pointing at the homepage will deindex every page using it.
Thin or duplicated content
“Crawled — currently not indexed” usually means it was seen and judged not worth including.
No internal links to the page
A URL in a sitemap with nothing linking to it is a weak signal. Sitemaps suggest; links persuade.
How long recovery takes
Setting expectations here matters, because the most common mistake after a rendering fix is assuming it didn't work and reverting it.
When
What to expect
Immediately
The checker shows a green verdict. This confirms the fix technically works — nothing else has changed yet.
Days 1–7
URLs you manually inspect in Search Console start getting indexed. Treat these as a sample, not the trend.
Weeks 2–6
The indexed page count climbs as normal recrawling reaches the rest of the site. This is the real signal.
Weeks 6–12
Impressions and then clicks follow, as newly indexed pages begin appearing in results.
Watch indexed page count rather than traffic in the first month. Traffic is a lagging indicator of a lagging indicator, and reading it too early tells you nothing except that recrawling takes time.
Common questions
A standard React application sends an almost empty HTML file and builds the page in the browser with JavaScript. Search engine crawlers read that initial file first and find no content, no links and often no title. Rendering the JavaScript happens later in a separate pass that may be delayed for weeks or skipped entirely for pages that appeared empty.