Our SaaS Had 600 Pages Indexed – Google Could Actually Read 170 Of Them

0 comments

I run a B2B SaaS company. We sell project management software. The product has been live for about four years.

We’ve built out a proper content operation: 200+ blog posts, 80 landing pages for different use cases, comparison pages, integration docs, a help center. 

In total, roughly 600 URLs that we actively want Google to index and rank.

Last March, our head of content pulled a report from Search Console and flagged something odd.

Impressions had been declining for about three months, but we hadn’t changed our publishing cadence or lost any major backlinks. 

The decline was gradual — the kind of thing you explain away as algorithm fluctuation until the numbers get bad enough to take seriously.

I dug into the Coverage report and found the real problem. Of our 600 pages, only about 170 were indexed with full content.

The rest were either partially indexed (missing key sections) or showing thin content warnings despite having 2,000+ words on the live page.

Google was visiting these URLs, but it wasn’t seeing what we’d actually published.

The gap between what users see and what bots see

Our site runs on React. When a user visits a page, their browser downloads JavaScript, executes it, and renders the full content.

Product descriptions, feature lists, pricing tables, testimonials — all of it appears on screen within a second or two. For humans, it works perfectly.

For crawlers, the experience is completely different.  When Googlebot or any other bot requests a page, it gets the raw HTML. 

On a React site, that raw HTML is basically an empty container: a single div element and a bunch of script tags. 

The actual content doesn’t exist in the HTML — it only appears after JavaScript runs.

The gap between what users see and what bots see

Googlebot does have a rendering engine. It eventually processes the JavaScript and sees the content.

But that rendering happens in a separate queue, and the delay can range from hours to days. 

During that gap, our pages were either unindexed or indexed with whatever scraps were in the raw HTML — which, in our case, was almost nothing.

Why this hit our revenue, not just our vanity metrics

Search traffic dropped 35% in three months

This wasn’t a keyword ranking issue. Our target pages were still ranking for the right terms.

But when someone clicked through from Google, the cached snippet often showed incomplete or outdated content because Google had indexed the page before rendering finished.

Click-through rates declined because our search listings looked thin compared to competitors.

AI assistants couldn’t find us

We started paying attention to AI referral traffic in early 2025. ChatGPT, Perplexity, and similar tools send their own crawlers to pull information from websites.

Unlike Googlebot, these crawlers don’t render JavaScript at all. They take the raw HTML and work with whatever’s there.

For our React-based site, that meant AI assistants saw an empty page. Our product never showed up in AI-generated comparisons or recommendations.

The compounding effect

The worst part was how long it took to notice. We were still publishing content, still building links, still optimizing.

But all that work was landing on pages that machines couldn’t properly read. 

Three months of SEO investment went toward content that was effectively invisible to half the systems we needed to be visible in.

What we tried first (and why it didn’t scale)

The obvious fix was server-side rendering. We evaluated migrating from our Create React App setup to Next.js.

The engineering estimate came back at 3-4 months of work for two developers.

That’s a real cost: roughly $120K in developer time, plus the opportunity cost of features we wouldn’t be building.

We tried a shortcut: pre-rendering specific high-priority pages using a headless browser script that ran at deploy time. 

It worked for the 30 pages we configured manually, but it didn’t scale.

Every time we published a new blog post or updated a landing page, someone had to remember to add it to the pre-render list. Within a month, we had gaps again.

The fix: Edge-based dynamic rendering

A friend running an e-commerce brand mentioned he’d solved the same problem with dynamic rendering at the edge.

The concept is straightforward: a layer between your site and crawlers that detects bot requests, renders the JavaScript in advance, caches the full HTML, and serves it directly.

The fix - Edge-based dynamic rendering

Users still get the normal React experience. Bots get pre-rendered, complete pages. We set up EdgeComet, an open-source platform designed specifically for this.

It detects 20+ bot patterns — Googlebot, Bingbot, ChatGPT, Perplexity, Claude — and serves cached, fully-rendered HTML with response times under 15ms. 

The entire implementation took about four hours. No frontend code changes, no framework migration, no deploy pipeline modifications.

Results after eight weeks

Indexation fixed

Within two weeks, the Coverage report in Search Console started improving.

Pages that had been flagged as “crawled but not indexed” or showing thin content warnings began clearing. 

After six weeks, 580 of our 600 pages were properly indexed with full content. The remaining 20 were pages we’d intentionally set to noindex.

Organic traffic recovered and then some

Organic traffic returned to pre-decline levels within about five weeks. By week eight, we were running 20% above the baseline.

Not because we’d published more content or built more links — we’d just made the existing content readable by every system that mattered.

AI visibility appeared

This was the unexpected win. Once our pages were fully rendered in the raw HTML, AI crawlers could finally read them.

We started showing up in ChatGPT-generated recommendations for our product category.

Perplexity began citing our comparison pages. Referral traffic from AI platforms went from essentially zero to about 8% of our total organic traffic within two months.

What I’d tell other business owners

Check your actual indexation, not just your ranking positions.

Go to Search Console, look at the Coverage report, and see how many of your pages are fully indexed versus partially indexed or excluded. 

If the numbers don’t match what you’ve published, you likely have a rendering problem.

Right-click any page on your site and choose “View Page Source.” If the raw HTML doesn’t contain your actual content — headings, product descriptions, article text — then every crawler that doesn’t render JavaScript is seeing a blank page.

That includes most AI platforms.

The fix doesn’t require rewriting your frontend. Dynamic rendering at the edge solves the problem at the infrastructure level.

It took us half a day to implement and the impact on our business was significant enough that I genuinely wish we’d done it two years earlier.

SEO, content marketing, link building, paid ads — none of it works at full capacity if the pages you’re driving traffic to are invisible to the systems routing that traffic.

Fix the visibility layer first. Everything else compounds on top of it.

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}