All posts
Technical SEO24 June 2026·Updated 6 July 2026·8 min read

Google Has Indexed One Page of Your React App. Guess Which One.

The React app is live. The UX is smooth. Three months later, you check Search Console: Google has indexed one page. Every other URL exists only as a JavaScript route change. To a traditional web crawler, that's nothing.

Crow Editorial Team
CRO practitioners and editors at Crow
8 min read
Google Has Indexed One Page of Your React App. Guess Which One.

You Shipped a Beautiful App. Google Sees an Empty Box.

The React app is live. The UX is smooth. The team is proud.

Three months later, you check Search Console. Google has indexed one page: the homepage.

Every other URL - /about, /pricing, /blog, /features - exists only as a JavaScript route change. To a traditional web crawler, that's not a page. It's nothing.

This isn't an edge case. It's the default failure mode for every SPA that wasn't explicitly built with SEO in mind. And it compounds silently - your domain age grows, your content accumulates, your rankings don't move, and you can't figure out why.


What Googlebot Actually Does With Your JavaScript.

Googlebot can execute JavaScript. That part is true. Here's the part most dev teams miss: it does it in a second wave.

Primary documentation: Google Search Central: JavaScript SEO basics

First pass: Googlebot visits, receives your HTML shell - typically just a div with an id - and moves on. No content to index.

Second pass: days or weeks later, Googlebot may return to render the JavaScript. May. If it does, it sees your content. If your crawl budget runs out before that second pass, it doesn't.

The result: pages that exist as route changes remain in a perpetual state of "Discovered - currently not indexed" in GSC. Weeks become months. Rankings never come.


Diagnose It in Three Steps.

You don't need a full audit to know if you have this problem.

Step one: open GSC, go to Pages, filter for "Discovered - currently not indexed" and "Crawled - currently not indexed." If your site has 40 pages and 38 of them are sitting there, you have confirmation.

Step two: run a site: search in Google. Count the results. If the number is a fraction of your actual page count, pages aren't being indexed.

Step three: check Google's cached version of one of your inner pages. If the cache shows a blank or shell page, JavaScript rendering isn't happening.

The fix is architectural - but it's not as disruptive as you think.


SSR, SSG, or Dynamic Rendering - Which One to Choose.

Server-Side Rendering: pages render on the server before they're delivered. Googlebot receives full HTML on the first pass. This is the clean fix for most React applications and Next.js makes it straightforward.

Static Site Generation: pages pre-render at build time as static HTML files. Fastest for SEO, ideal for content that doesn't change frequently. Blog posts, docs, marketing pages - SSG is often the right call.

Dynamic Rendering: serve pre-rendered HTML to bots, the SPA to users. Tools like Prerender.io handle this. It works, but Google officially considers it a workaround. You're maintaining two rendering pipelines indefinitely.

The practical recommendation: if you're on React, move to Next.js with SSR or SSG for your public-facing pages. The SEO payoff compounds for years.

One more thing: even after fixing rendering, check that your internal navigation uses real anchor tags. JavaScript router calls that don't produce anchor elements are invisible to crawlers. Googlebot can't follow what it can't see.

More from the blog

See what's hurting your conversion rate.

Free audit in under 60 seconds. No account needed.

Try Crow free →