FIKR.SPACE LIVE · Q3 2026 LAUNCH
FOUNDING / 200 JOIN FOUNDING
Home/Blog/AI Software Development/From 0 to 85 Indexed Pages in 30 Days: O…
AI Software Development

From 0 to 85 Indexed Pages in 30 Days: Our SEO Journey

The complete story of how we went from zero Google visibility to 85 indexed pages and 12,400+ monthly impressions in just 30 days with Edge SSR.

The complete story of how we went from zero Google visibility to 85 indexed pages and 12,400+ monthly impressions in just 30 days

The Problem: Invisible to Search Engines

On October 1st, we had a problem that would make any startup founder break into a cold sweat. Our platform had been live for six months. We had dozens of organizations using it, hundreds of pages of valuable content, and a growing user base. But when we checked Google Search Console, the dashboard showed a brutal reality: zero indexed pages, zero impressions, zero clicks. As far as Google was concerned, we simply didn't exist.

The issue wasn't that we didn't have content. We had thousands of pages - organizational profiles, blog posts, product pages, landing pages - all carefully crafted and filled with useful information. The problem was that none of this content was visible to search engines. Our entire application was built as a client-side React application. When Googlebot requested one of our pages, it received an empty HTML shell with a single div element. All the actual content was rendered by JavaScript after the page loaded.

This is where we ran into Google's crawling limitations. While Google does execute JavaScript, it does so in a secondary indexing queue with far fewer resources and much longer processing times. Pages that require JavaScript rendering can take weeks or even months to be indexed, if they're indexed at all. For a startup trying to build organic traffic, this was simply unacceptable. Every day without indexing meant thousands of potential users who would never find us through search.

We needed server-side rendering, and we needed it fast. But we also needed to avoid the typical migration pain that comes with adding SSR to an existing application. Our engineering team was small, our product roadmap was packed, and spending 4-6 weeks on pure infrastructure work wasn't an option. We needed a solution that could be implemented quickly, wouldn't break our existing application, and would give us the SEO visibility we desperately needed.

THE COMPLETE SYSTEM TO SCALE YOUR STARTUP

From strategic planning to execution, FIKR gives you every tool needed to grow from idea to exit.

START FOR FREE →

No credit card required • Setup in 5 minutes

Week 1: Research and Planning (Days 1-7)

We spent the first week doing deep research on our options. The landscape for adding SSR to an existing React application essentially breaks down into three approaches, each with distinct trade-offs. First was the nuclear option: migrate everything to Next.js. This would give us production-ready SSR, excellent developer experience, and a massive community of support. But it would also mean 4-6 weeks of migration work, complete framework lock-in, and potentially significant hosting costs as we scaled.

Second was building a custom Node.js rendering server. We could keep our existing React + Vite development setup and add a separate Node.js service that would render pages on demand. This gave us control but came with operational complexity. We'd need to provision servers, configure load balancers, handle scaling during traffic spikes, manage deployments, and deal with the ongoing maintenance of running stateful services. For a small team, this was a lot of operational overhead.

The third option was Edge SSR with Cloudflare Workers. This intrigued us because it promised the benefits of SSR without the migration pain or operational complexity. The core idea was simple: keep our existing React application exactly as it is, but add a thin edge layer that intercepts bot requests and serves them server-rendered HTML. Human users would still get our fast, interactive client-side application. Search engine bots would get fully-rendered HTML. One codebase, two experiences.

During this research week, we built a proof of concept. We took one of our most important pages - our homepage - and implemented Edge SSR for just that page. The results were encouraging. Response times were consistently under 50ms. The implementation was clean and straightforward. Most importantly, when we tested with Google's Mobile-Friendly Test tool, it showed our full content rendered server-side. This was the validation we needed.

By day 7, we had made our decision: Edge SSR with Cloudflare Workers. The plan was to implement it incrementally over the next two weeks, starting with our most important pages and gradually expanding coverage. We set a goal that seemed ambitious at the time: have at least 50 pages indexed by the end of the month.

Week 2: Implementation Sprint (Days 8-14)

Week two was heads-down implementation. We started by building the core infrastructure. This meant creating the Cloudflare Worker that would intercept requests, detect whether they were from bots, and handle the server-side rendering logic. The architecture was deliberately minimal. We didn't try to render every single page server-side from day one. Instead, we focused on the pages that mattered most for SEO.

Our priority list was clear:

  1. Homepage (highest authority, most important for brand searches)
  2. Main product pages (target high-value commercial keywords)
  3. Blog posts (long-tail SEO, easier to rank for specific topics)
  4. Organizational profiles (local SEO, proper structured data)
  5. Category and landing pages (target competitive keywords)

The bot detection logic was straightforward. We used a regex pattern that matches the User-Agent string for major search engines and social media crawlers. When a bot is detected, the worker follows the SSR path. When a human user is detected, the worker serves our normal client-side application. This dual-mode approach meant we could optimize for both use cases without compromise.

Bot Detection Implementation:

const isBot = /googlebot|bingbot|slurp|duckduckbot|baiduspider|yandexbot|facebookexternalhit|twitterbot|linkedinbot|whatsapp/i.test(userAgent);

if (isBot) {
  // Server-side render the page
  return handleSSR(request);
} else {
  // Serve cached client-side bundle
  return handleSPA(request);
}

The rendering logic itself leveraged React's built-in renderToString function. For each page request from a bot, we would fetch the necessary data, render the React component tree server-side, inject it into a full HTML document with proper meta tags and structured data, and return the complete HTML to the bot. The entire process typically took 35-50 milliseconds.

One critical optimization we implemented during this week was aggressive caching. Since bots typically crawl pages repeatedly, we used Cloudflare's Cache API to cache rendered HTML for 24 hours. The first bot request to a page would trigger server-side rendering. Subsequent requests within 24 hours would be served from cache, reducing response times to 5-10 milliseconds. This dramatically reduced our compute costs while maintaining fast response times.

By the end of week two, we had SSR working for our top 30 pages. We deployed to production on day 14, submitted our updated sitemap to Google Search Console, and requested immediate indexing for our most important pages. Then we waited to see what would happen.

THE COMPLETE SYSTEM TO SCALE YOUR STARTUP

From strategic planning to execution, FIKR gives you every tool needed to grow from idea to exit.

START FOR FREE →

No credit card required • Setup in 5 minutes

Week 3: First Results and Expansion (Days 15-21)

The results started appearing faster than we expected. On day 16, just two days after deployment, we saw our first indexed page appear in Google Search Console. It was our homepage. By day 18, we had 12 pages indexed. By day 21, that number had jumped to 43 pages. Google was crawling our site aggressively, and for the first time, it was actually seeing our content.

The data from Google Search Console was fascinating to watch in real-time. We could see the exact pages that Googlebot was discovering, how often it was crawling them, and how quickly they were moving from "Discovered" to "Crawled" to "Indexed" status. The average time from deployment to indexing was about 3-4 days for most pages, which is remarkably fast in the SEO world.

During week three, we also started seeing our first organic impressions. These are instances where our pages appeared in Google search results, even if users didn't click on them yet. On day 17, we had 142 impressions. On day 19, that jumped to 834. By day 21, we were seeing 2,100 impressions per day. The growth was exponential because each new indexed page opened up new keyword opportunities.

We used this momentum to expand our SSR coverage. We added server-side rendering for additional page types:

  • Blog categories: Collection pages that helped Google understand our content taxonomy
  • Author profiles: E-A-T signals (Expertise, Authoritativeness, Trustworthiness) for our content
  • Tag pages: Additional entry points for long-tail keyword traffic
  • Resource pages: High-value pages targeting commercial intent keywords

We also started paying close attention to our Lighthouse scores. Our SEO score had jumped from 45/100 (before SSR) to 98/100 (after SSR). The two points we were missing were primarily due to some remaining optimization opportunities around meta tag completeness and internal linking structure. But the dramatic improvement validated that our implementation was solid.

Week 4: Optimization and Scale (Days 22-30)

By week four, we shifted focus from initial implementation to optimization and scale. We had proven that Edge SSR worked and that Google was indexing our pages. Now we needed to refine our approach to maximize performance and minimize costs as we scaled up.

The first optimization was around structured data. We implemented Schema.org markup for every major content type on our site. Blog posts got Article schema. Organizational profiles got Organization schema. Product pages got Product schema. Events got Event schema. This structured data helps Google understand the semantic meaning of our content and can lead to enhanced search results like rich snippets and knowledge panels.

Structured Data Example for Blog Posts:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Blog Post Title",
  "author": {
    "@type": "Person",
    "name": "Author Name"
  },
  "publisher": {
    "@type": "Organization",
    "name": "FIKR",
    "logo": {
      "@type": "ImageObject",
      "url": "https://fikr.space/logo.png"
    }
  },
  "datePublished": "2025-10-15",
  "dateModified": "2025-10-20",
  "image": "https://fikr.space/blog-image.jpg",
  "description": "Blog post description"
}
</script>

The second optimization was around cache invalidation. Our initial implementation cached rendered HTML for 24 hours. This worked well for static content, but it caused problems when content was updated. If an organization updated their profile, the changes wouldn't appear to search engines until the cache expired. We implemented a smart invalidation system that purges cached pages whenever the underlying content changes. This kept response times fast while ensuring that search engines always see the latest content.

The third optimization was around selective rendering. Not every page needs to be rendered server-side. Some pages are behind authentication and will never be crawled by search engines. Some pages are purely interactive tools where server-side rendering provides no benefit. We added logic to our edge worker to identify these pages and skip SSR entirely, serving the client-side application immediately. This reduced our compute costs by about 40% while maintaining full SEO coverage where it mattered.

We also implemented comprehensive monitoring during this week. We set up custom metrics in Cloudflare Analytics to track SSR performance, cache hit rates, and edge response times. We integrated with Google Search Console API to pull indexing data automatically and track it alongside our application metrics. This gave us a complete picture of how our SEO implementation was performing and where we could optimize further.

By the end of day 30, the results exceeded our initial goals:

Final 30-Day Results:

  • Indexed Pages: 85 (target was 50)
  • Monthly Impressions: 12,400+
  • Monthly Clicks: 340 (2.7% CTR)
  • Average Position: 23.4 (improving daily)
  • Lighthouse SEO Score: 98/100
  • Average TTFB: 42ms globally
  • Cache Hit Rate: 87%
  • Infrastructure Cost: $5/month

The Technical Architecture That Made It Work

Our final architecture is elegant in its simplicity. The entire system consists of three core components. First is our existing React + Vite application, which runs client-side for human users. Nothing changed here - we kept our component structure, routing logic, and state management exactly as it was. This was crucial because it meant our development workflow stayed fast and familiar.

Second is the Cloudflare Worker that runs at the edge. This worker intercepts every request to our application and makes a decision: is this a bot or a human? If it's a bot, the worker fetches our SSR bundle, renders the requested page server-side, and returns complete HTML. If it's a human, the worker serves our cached client-side bundle and lets the application render normally. The entire bot detection and routing logic is about 50 lines of code.

Third is Workers KV, Cloudflare's edge key-value store. We use this for two types of caching. First, we cache metadata about our pages - titles, descriptions, authors, publication dates - that we need for rendering meta tags. This avoids hitting our database for every SSR request. Second, we cache the rendered HTML itself for 24 hours. When a bot requests a page that was recently rendered, we can serve it from cache in 5-10 milliseconds instead of re-rendering.

The data flow is straightforward. When Googlebot requests a page, the request hits Cloudflare's edge network. Our worker checks Workers KV to see if we have a cached version of this page. If we do and it's less than 24 hours old, we return it immediately. If we don't, the worker fetches the page metadata from KV (or falls back to querying Supabase), renders the React component tree using renderToString, injects structured data and meta tags, stores the result in KV for future requests, and returns the complete HTML. Total time: 35-50 milliseconds on average.

Challenges We Had to Overcome

The path to 85 indexed pages wasn't entirely smooth. We encountered several challenges that required creative solutions. The first major challenge was bundle size. Cloudflare Workers have a hard limit of 1MB for the total script size after compression. Our full React application, including all dependencies, was 2.3MB. We couldn't just upload our entire application to run on the edge.

We solved this through aggressive tree shaking and code splitting. We created a separate bundle specifically for SSR that only included the components and dependencies needed for rendering pages server-side. We stripped out client-only code like analytics libraries, form validation logic, and interactive UI components that wouldn't be used during SSR. We lazy-loaded heavy dependencies that were only needed for specific page types. The final SSR bundle came in at 850KB, comfortably under the 1MB limit.

The second challenge was database latency. Our Supabase instance is hosted in us-east-1 (US East Coast). When an edge worker in Tokyo needs to query the database to render a page, that query has to travel halfway around the world. Round-trip latency was often 100-150ms, which was the single biggest contributor to our response times. We couldn't move our database to be globally distributed without significant complexity and cost.

We addressed this through edge caching in Workers KV. Instead of querying the database for every SSR request, we cache the most frequently accessed data at the edge. When a page is requested, the worker first checks KV for the necessary data. Only if it's not found or is stale do we fall back to querying Supabase. This reduced our database query rate by 90% and cut our average response times from 150ms to 42ms.

The third challenge was incremental adoption. We couldn't realistically add SSR support for every single page type in our application overnight. We needed a strategy for gradually expanding coverage while ensuring that any page without explicit SSR support would degrade gracefully. Our solution was a fallback system. When a bot requests a page that we haven't implemented SSR for yet, the worker serves our standard client-side bundle and includes a note in the HTML comments indicating that this page is client-rendered. This way, we get some SEO benefit even before we've implemented full SSR for every page type.

What We Learned About Google's Indexing

One of the most valuable parts of this journey was the insight we gained into how Google actually indexes modern web applications. Before we implemented SSR, we assumed that Google's JavaScript rendering was better than it actually is. The marketing materials from Google suggest that they can execute JavaScript and index client-rendered pages just fine. In practice, this is only partially true.

Google does execute JavaScript, but it happens in a separate, lower-priority indexing queue. Pages that require JavaScript rendering can take weeks or months to be indexed, and they're much more likely to be dropped from the index during Google's periodic recrawls. In contrast, pages with server-rendered HTML are indexed almost immediately. We saw pages go from "Discovered" to "Indexed" in as little as 24 hours when they had proper SSR.

We also learned that crawl budget is real and it matters. Google doesn't crawl every page on your site every time. It allocates a crawl budget based on your site's perceived authority, size, and update frequency. Sites with good server-rendered HTML and fast response times get crawled more frequently. After we implemented Edge SSR, our crawl rate increased from about 20 pages per day to over 200 pages per day. Google was crawling us more aggressively because we were making it easy for them.

Finally, we learned that technical SEO still matters immensely. Having great content isn't enough if search engines can't access it efficiently. Fast response times, proper meta tags, structured data, clean URLs, and XML sitemaps all make a measurable difference. Our Lighthouse score improvement from 45/100 to 98/100 wasn't just a vanity metric - it correlated directly with better indexing and higher search rankings.

The Cost-Benefit Analysis

Let's talk about the economics, because they're surprisingly compelling. The total cost of our Edge SSR implementation breaks down into two categories: development time and ongoing infrastructure costs. On the development side, we spent about 60 hours of engineering time over two weeks. This includes research, implementation, testing, and deployment. At a fully-loaded cost of $100 per hour, that's $6,000 in one-time development costs.

On the infrastructure side, we're paying $5 per month for Cloudflare Workers Paid plan. This includes 10 million requests per month, 1GB of Workers KV storage, and unlimited bandwidth. We're currently using about 2 million requests per month (mostly from search engine crawlers), so we have significant headroom to grow. Over a full year, our infrastructure costs are $60.

Now let's compare this to the alternatives. If we had migrated to Next.js on Vercel, we'd be paying $100 per month for the Pro plan for a team of five developers. Over a year, that's $1,200 in infrastructure costs. We'd also have spent 4-6 weeks on migration (160-240 hours), which at $100 per hour would be $16,000-$24,000 in development costs. Total first-year cost: $17,200-$25,200.

If we had built a custom Node.js rendering solution on AWS, the costs would be even higher. Based on our traffic, we'd need at least two t3.medium instances for redundancy ($60/month), an Application Load Balancer ($20/month), CloudFront CDN ($50/month estimated), and S3 storage ($10/month). That's $140/month or $1,680/year in infrastructure. Development time would be similar to Next.js migration, so total first-year cost would be around $17,680-$25,680.

Our Edge SSR solution cost $6,060 in the first year ($6,000 development + $60 infrastructure). Compared to Next.js, we saved $11,140-$19,140. Compared to custom AWS, we saved $11,620-$19,620. That's roughly 70-75% cost savings while achieving better performance and maintaining our existing development workflow.

When Edge SSR Makes Sense vs Alternatives

Based on our experience, here's our honest assessment of when Edge SSR with Cloudflare Workers makes sense versus alternatives like Next.js or custom Node.js rendering. These are real trade-offs, not marketing spin.

Choose Edge SSR with Cloudflare Workers if:

  • You have an existing React application that you don't want to migrate
  • You need SSR primarily for SEO and social media previews, not for first-page load performance
  • Your team is small and you want minimal operational overhead
  • You want the fastest possible response times globally without managing infrastructure
  • Cost optimization is important and you're not venture-backed with unlimited burn
  • You value flexibility and want to avoid framework lock-in

Choose Next.js (or similar framework) if:

  • You're starting a new project from scratch
  • You need SSR for actual user-perceived performance, not just bots
  • You want a batteries-included solution with established patterns for data fetching, routing, and optimization
  • You have a larger team that benefits from framework conventions
  • You're building an e-commerce site or application where SEO and performance are equally critical
  • You're comfortable with framework lock-in in exchange for developer productivity

Choose custom Node.js rendering if:

  • You have very specific rendering requirements that frameworks don't support
  • You need complete control over the rendering environment
  • You're integrating with existing Node.js infrastructure
  • You have a dedicated DevOps team that can handle the operational complexity
  • You need to run rendering logic that exceeds edge runtime limitations
  • You're building a multi-tenant application with complex security requirements

THE COMPLETE SYSTEM TO SCALE YOUR STARTUP

From strategic planning to execution, FIKR gives you every tool needed to grow from idea to exit.

START FOR FREE →

No credit card required • Setup in 5 minutes

Final Thoughts

Going from zero indexed pages to 85 pages in 30 days was transformative for our startup. For the first time since launch, we have a growing organic traffic channel. We're showing up in search results for hundreds of relevant keywords. We're getting qualified traffic from users who have never heard of us before but found us through Google. And most importantly, we're building a sustainable growth engine that compounds over time.

The implementation itself was remarkably smooth. We didn't break our existing application. We didn't disrupt our development workflow. We didn't take on significant technical debt. We didn't lock ourselves into a specific framework or vendor. We solved the problem we needed to solve - making our content visible to search engines - with minimal disruption and maximum flexibility.

The timeline from decision to results was about 30 days total. Week one was research and proof of concept. Week two was implementation. Week three was expansion and first results. Week four was optimization and scale. If we had to do it again, we could probably compress this to 2-3 weeks now that we know the pitfalls to avoid. The investment was 60 hours of engineering time and $5 per month in infrastructure costs.

If you're in a similar situation - you have a client-side rendered React application and you need SEO visibility without a massive migration project - we'd encourage you to seriously consider the Edge SSR approach. It's not right for every use case, but for startups that need to ship fast and optimize costs while maintaining flexibility, it's a compelling solution. The results speak for themselves: 85 indexed pages, 12,400+ monthly impressions, and a foundation for sustainable organic growth.

LG

Luis Goncalves

// Founder & CEO at FIKR Space

Three-time founder. Built and exited Evolution4All before this. Now building FIKR Space — the operating infrastructure underneath every innovation ecosystem (startups, accelerators, governments, investors). Lisbon-based, works global.