JavaScript SEO for React and SPA Sites

JavaScript SEO makes sure search engines can see the content, links and tags of a site that builds its pages in the browser. It starts by comparing the raw HTML a crawler receives with what a visitor sees, then moves the pages that must rank to server rendering, static generation or prerendering so they can be crawled and indexed.

By Abdullah Mahmud Last updated

What is JavaScript SEO?

A single-page application, often built with React, Vue or Angular, usually sends the browser a small HTML shell and lets JavaScript fill in the page afterwards. Visitors never notice. A crawler that does not run that JavaScript, or runs it late, can receive a page with no title, no body text and no links.

Google can render JavaScript, but rendering is a separate step that can lag behind crawling, and not every crawler does it. JavaScript SEO removes that dependency for the pages that matter: the title, description, canonical, headings, body copy and internal links are in the HTML before any script runs.

Problems it solves

Why are my pages not indexed in Google?

If the HTML a crawler receives is an empty shell, there is little to index. We check the raw response, the rendered result and Search Console's URL Inspection for each page type.

Google shows the same title for every page on my React site.

Titles and descriptions that are only set in the browser may not be picked up. We make each route ship its own head tags in the HTML.

My developers say the site works fine, so why does SEO say it is broken?

Both can be true. The site works for people because a browser runs the JavaScript. We show your developers the raw response and the rendered page side by side, so the fix is specific and not a debate.

I have thousands of database-driven pages. How do I get them crawled?

Each page needs to exist as HTML and be found through XML sitemaps and internal links built as real anchor elements. Without both, crawlers may never reach most of them.

We changed the framework or the router and traffic dropped.

Moves to client-side routing or a new rendering setup often break canonicals, status codes or internal links. We compare before and after and list what changed.

Who it is for, and who it is not for

A good fit

  • Sites built with React, Vue, Angular or similar frameworks, including headless storefronts and web apps with public pages.
  • Sites with many database-driven pages that need to be indexed.
  • Teams with developers who can ship rendering changes.
  • Sites where some pages rank but whole sections never appear in Google.

Probably not for you

  • Sites that already serve full HTML from the server. Their problem is probably elsewhere, and a technical SEO audit is the better start.
  • Apps where all the valuable content sits behind a login.
  • Projects that want a full front-end rebuild. We advise on the rendering approach and check the result, and the build itself needs your development team or a separate scope.

How it works

  1. Compare raw HTML and the rendered page

    For each page type we look at the server response, the rendered DOM and Search Console's URL Inspection, and list what is missing before any script runs.

  2. Choose what must be rendered ahead of time

    We pick the routes that need to rank and agree a method with your developers: server-side rendering, static generation or prerendering at build time. Pages that do not need to rank can stay client-rendered.

  3. Put the SEO tags and links in the HTML

    Title, description, canonical, robots directive, structured data, body copy and internal links as real anchor links, all present in the response.

  4. Make the whole set discoverable

    XML sitemaps, hub pages and internal links so crawlers find every page, and index control so near-duplicate pages do not pile up.

  5. Verify and monitor

    After release we re-check the raw HTML, watch indexation and crawl reports in Search Console, and test the new templates for speed.

What you receive

Proof from our own work

Our case study covers linkscope.io, a React single-page application whose pages returned an empty HTML shell. Moving the SEO-critical routes to prerendered HTML produced 8,000+ prerendered pages and the traffic curve shown in the study. The case study also states its limits: the traffic is branded and navigational, so it reads as discoverability and not sales; most of the set was still indexing; and the Ahrefs figures are estimates.

Frequently asked questions

Can Google crawl JavaScript sites?

Yes, Google can render JavaScript, but rendering is a second step that can happen later than crawling, and other search engines and AI crawlers may not render it at all. The safe approach is to put the important content and links in the HTML itself.

Do I need server-side rendering for SEO?

Not always. Server-side rendering, static generation and prerendering all put real HTML in the response. Which one fits depends on how often your content changes and how your team deploys. We recommend one per page type after the audit.

How can I check what a crawler sees on my site?

Open view-source for a page and look for your title and body text. If you only see an empty container, the content is built in the browser. Search Console's URL Inspection tool also shows the rendered HTML Google gets.

Will you change our code?

We write the specification and check the result. Whether we also make front-end changes depends on your stack and your team, and we agree that on the call.

Does this cover site speed as well?

We test the templates we touch. Full speed work is a separate service, covered on our site speed and Core Web Vitals page.

Talk to us about javaScript SEO

Book a call and we will look at what a crawler receives from your site.

Book a Call