Free React SEO Audit
in 8 seconds.
Paste any React URL. Get 70+ ranking signals scored — schema, Core Web Vitals, mobile-first, AEO (ChatGPT & Perplexity visibility). AI Coach generates the exact fix. No signup. No credit card.
Or try a sample — audit react.dev
React itself has no SEO — it's a UI library. What you build on top of it does. A vanilla Create React App (CRA) or Vite + React SPA ships an empty HTML shell to crawlers and renders everything client-side, which leaves Google with little to index. Most React SEO problems trace to this: the developer assumed Google could execute JavaScript well enough, didn't add SSR or static pre-rendering, and watched their pages drift to the bottom of SERPs. Our audit's JS-render reconciliation pass catches this — we compare what's in the static HTML to what's in the rendered DOM and flag every signal that exists in one but not the other.
The 5 most common SEO issues
on React apps.
Our audit is tuned to spot the patterns that show up over and over on Reactsites. Here's what to look for — and how to fix each one.
SPA shell with no server-rendered content
A CRA or Vite + React app serves the same HTML for every URL — a single <div id='root'></div> and a script tag. Google's first-pass crawler sees nothing. The second-pass rendering crawler may execute the JS, but the queue is slow and unreliable.
Fix: Migrate to a framework that handles SSR or SSG: Next.js (App or Pages Router), Remix, or Astro for content-heavy sites. The audit catches the empty-shell pattern and flags it as a P1 issue.
React Helmet meta tags missing on direct page loads
React Helmet (or Helmet Async) updates <title> and meta tags client-side after JS runs. On the initial HTML response, every page shows the same default title — so Googlebot's first-pass index ranks every URL identically.
Fix: Switch to react-helmet-async with server-side rendering, or migrate to a framework with first-class metadata (Next.js generateMetadata). Audit each route to confirm the title differs in the static HTML.
Hydration mismatches breaking on-page signals
Server and client renders disagree (date formatting, localStorage reads, A/B test variants) and React replaces the server HTML with a different client tree. The new tree may drop schema, alt text, or heading hierarchy that was correct in SSR.
Fix: Use Server Components (Next.js App Router) or guard client-only state with useEffect so hydration matches. Audit the URL twice — once with JS disabled, once with — and confirm signals match.
Client-side routing with no canonical or robots meta
React Router rewrites the URL but doesn't update <link rel='canonical'> or robots meta unless you wire it manually. Multiple routes can end up with the same canonical or contradictory robots directives.
Fix: Set canonical + robots via your metadata library (Helmet, Next.js Metadata API) per route. The audit flags missing canonicals and self-referential vs cross-referential canonical issues.
Bundle size killing INP and LCP on mobile
A React + Material UI + Apollo + i18next bundle commonly weighs 800 KB-1.5 MB. On a 4G connection that's 3-6 seconds of download before React even mounts — LCP fails, INP fails, ranking suffers.
Fix: Code-split heavy routes with React.lazy + Suspense, tree-shake icon libraries, defer analytics. Our PSI category surfaces the bundle as the blocker.
When you outgrow the free tier.
If you maintain multiple React apps (agency, multi-product company, freelance), Pro Yearly's multi-site dashboards track all of them in one view. The full-site crawl audit (up to 25 pages per scan) catches when a React Router config change quietly breaks meta tags across the whole app. The AI Coach generates exact JSX snippets — Helmet blocks, Next.js generateMetadata bodies, JSON-LD components — that drop directly into your codebase. For SPAs migrating to SSR, the audit before/after comparison proves the SEO wins quantitatively.
React SEO — answered.
Long-tail questions we hear from React site owners.
- Can a React SPA rank on Google in 2026?
- It can, but with significantly worse outcomes than an SSR'd version. Google does execute JavaScript, but the rendering crawler runs days or weeks behind the initial crawl, your content is invisible until then, and many third-party crawlers (Bing, Yandex, ChatGPT, Perplexity, smaller search engines) still don't render JS at all. Either move to SSR (Next.js, Remix) or pre-render at build (Vite SSG plugins, Gatsby, Astro).
- Is Next.js better than Create React App for SEO?
- Materially yes — Next.js gives you SSR/SSG/ISR, first-class metadata via the Metadata API or generateMetadata, optimized images via next/image, automatic sitemap.ts + robots.ts, and built-in route-level code splitting. CRA is unmaintained and unsuitable for production SEO. Migrate to Next.js, Vite + plugin-ssr, or Remix.
- How does the audit handle React's client-side rendering?
- The audit performs two passes: a static HTML fetch (what Googlebot's first-pass sees) and a rendered-DOM check via headless Chrome (what the second-pass rendering crawler sees after JS executes). When signals exist in one pass but not the other, we flag the gap — and recommend either SSR or pre-rendering depending on the framework.
- Should I use react-helmet or react-helmet-async?
- react-helmet-async — the original react-helmet is unmaintained and has SSR bugs. Helmet-async is required for streaming SSR (React 18+). If you're on Next.js App Router, skip Helmet entirely and use generateMetadata, which is faster and avoids hydration pitfalls.
- Do AI search engines (ChatGPT, Perplexity) crawl React SPAs?
- Mostly no. GPTBot, PerplexityBot, ClaudeBot, and CCBot are non-rendering crawlers — they fetch the static HTML and parse it. A React SPA shows them an empty shell. To be cited in AI search you need SSR or pre-rendered HTML with your real content visible on first response. Our audit's AEO category scores this.
- How do I add structured data (JSON-LD) to a React app?
- If you're on Next.js App Router: render a JSON-LD script tag inside a Server Component. If you're on a SPA: use react-helmet-async to inject it into <head> — but be aware that non-rendering crawlers may not see it. For schema that needs to be visible to ChatGPT, Perplexity, and other AI search engines, server-render it. Our Schema Generator outputs valid JSON-LD ready to paste.
Audit your React site
right now.
Free forever for any URL. 8-second audit. AI Coach generates the fix.