---
title: "Choose a tech stack that lets search engines crawl and index your site from launch day"
description: "Rendering, CDN caching, headless CMS, routing, builds, logins, third-party scripts, and scaling choices that decide whether Google can index a new site."
canonical: "https://scalewithsearch.com/articles/tech-stack-decisions-kill-seo"
date: "2026-03-20"
modified: "2026-09-25"
---
## Site navigation

- [Scale With Search](https://scalewithsearch.com/)
- Real estate
  - Real estate
    - [Real estate](https://scalewithsearch.com/for/real-estate)
- Work
  - Start here
    - [Send your brief](https://scalewithsearch.com/work#send-your-brief)
    - [Prepare your six-question brief](https://scalewithsearch.com/work#prepare-your-six-question-brief)
  - Build
    - [Site build, content library with SEO, signal desk](https://scalewithsearch.com/work)
- For your business
  - Trades and home services
    - [Auto body and collision shops](https://scalewithsearch.com/for/auto-body-and-collision-shops)
    - [Foundation and home repair contractors](https://scalewithsearch.com/for/foundation-and-home-repair)
    - [Garage door and fencing contractors](https://scalewithsearch.com/for/garage-door-and-fencing-contractors)
    - [HVAC contractors](https://scalewithsearch.com/for/hvac-contractors)
    - [Janitorial and commercial cleaning companies](https://scalewithsearch.com/for/janitorial-and-commercial-cleaning)
    - [Locksmiths](https://scalewithsearch.com/for/locksmiths)
    - [Moving companies](https://scalewithsearch.com/for/moving-companies)
    - [Pest control companies](https://scalewithsearch.com/for/pest-control-companies)
    - [Plumbing and electrical contractors](https://scalewithsearch.com/for/plumbing-and-electrical-contractors)
    - [Restoration and water or fire damage companies](https://scalewithsearch.com/for/restoration-and-water-fire-damage)
    - [Roofing companies](https://scalewithsearch.com/for/roofing-companies)
    - [Towing companies](https://scalewithsearch.com/for/towing-companies)
    - [Tree services and landscaping companies](https://scalewithsearch.com/for/tree-services-and-landscaping)
    - [Solar installers](https://scalewithsearch.com/for/solar-installation)
    - [General contractors](https://scalewithsearch.com/for/general-contractors-and-construction)
    - [Paving, concrete, and flooring contractors](https://scalewithsearch.com/for/paving)
  - Practices and professional services
    - [Bookkeeping and tax practices](https://scalewithsearch.com/for/bookkeeping-and-tax-practices)
    - [Dental practices](https://scalewithsearch.com/for/dental-practices)
    - [Family and criminal defense law firms](https://scalewithsearch.com/for/family-and-criminal-defense-law-firms)
    - [Med spas and aesthetics practices](https://scalewithsearch.com/for/med-spas-and-aesthetics)
    - [Personal injury law firms](https://scalewithsearch.com/for/personal-injury-law-firms)
    - [Veterinary clinics](https://scalewithsearch.com/for/veterinary-clinics)
    - [Gyms and fitness studios](https://scalewithsearch.com/for/fitness)
    - [Therapy and outpatient health practices](https://scalewithsearch.com/for/therapy-and-outpatient-health)
    - [Medical billing companies](https://scalewithsearch.com/for/medical-billing)
    - [Insurance agencies](https://scalewithsearch.com/for/insurance-agencies)
    - [Financial advisors](https://scalewithsearch.com/for/financial-advisors)
    - [Property management companies](https://scalewithsearch.com/for/property-management)
    - [Recruiting and staffing agencies](https://scalewithsearch.com/for/recruiting-and-staffing)
    - [Architects and interior designers](https://scalewithsearch.com/for/architects-and-interior-designers)
    - [Logistics and supply chain companies](https://scalewithsearch.com/for/logistics-and-supply-chain)
  - Agencies, MSPs, and manufacturing
    - [IT and managed service providers](https://scalewithsearch.com/for/it-and-managed-service-providers)
    - [Machine shops and precision manufacturers](https://scalewithsearch.com/for/machine-shops-and-precision-manufacturing)
    - [Marketing agencies and freelancers](https://scalewithsearch.com/for/marketing-agencies-and-freelancers)
    - [SEO agencies and consultants](https://scalewithsearch.com/for/seo-agencies-and-consultants)
    - [Small manufacturers and fabricators](https://scalewithsearch.com/for/small-manufacturers-and-fabricators)
  - Restaurants, shops, studios, and nonprofits
    - [Restaurants and hospitality businesses](https://scalewithsearch.com/for/restaurants-and-hospitality)
    - [Retail stores and ecommerce sellers](https://scalewithsearch.com/for/retail-and-ecommerce)
    - [Photographers, event planners, and travel agents](https://scalewithsearch.com/for/photographers)
    - [Churches and nonprofits](https://scalewithsearch.com/for/churches-and-nonprofits)
  - [All industries](https://scalewithsearch.com/for/)
- Learn
  - For your office
    - [Office job guides](https://scalewithsearch.com/guides/)
    - [Browser calculators](https://scalewithsearch.com/tools/)
  - Start here
    - [How it works](https://scalewithsearch.com/how-it-works)
    - [Free Starter Kit](https://scalewithsearch.com/kit/business-memory-starter-kit.zip)
    - [Synthetic specimen](https://scalewithsearch.com/specimen/working-session-specimen.zip)
  - Guides
    - [The Complete Guide to Business Memory for AI Agents](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [The Complete Small-Business Guide to AI Agent Governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [The Complete Guide to Leaving Vendor AI Memory](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - Articles by cluster
    - [Business memory](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [Agent governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [Migration and ownership](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - For machines
    - [llms.txt](https://scalewithsearch.com/llms.txt)
    - [llms-full.txt](https://scalewithsearch.com/llms-full.txt)
    - [Machine view](https://scalewithsearch.com/?view=machine)
- Company
  - Evidence
    - [Proof](https://scalewithsearch.com/proof)
  - Company
    - [About](https://scalewithsearch.com/about)

# Choose a tech stack that lets search engines crawl and index your site from launch day.

Most engineering teams choose a stack for developer experience, deployment speed, and clean architecture. Then the site launches, and Google sees an almost empty HTML document with a root `div` and a list of scripts. The content exists in the browser. It does not exist, yet, for search.

Many of these problems are set months before launch, in decisions about rendering, caching, routing, and builds. Each one is cheap to get right at the start and expensive to change later. This article goes through 11 of those decisions, what each one does to crawling and indexing, and the choice that keeps content visible.

## Pick the rendering method per route

Client-side rendering (CSR) sends an HTML shell and builds the page in the browser with JavaScript. React, Vue, and Angular applications do this by default. Googlebot runs JavaScript, but rendering is a separate step after the crawl. Pages wait in a render queue, heavy pages use more resources, and a script that fails or times out can leave the content out. Google has said most pages render quickly, but some wait longer. Content in the initial HTML skips that risk.

| Method | How it works | Examples | Fit |
|---|---|---|---|
| Client-side rendering (CSR) | The browser builds the page from JavaScript | Default React, Vue, Angular apps | Pages behind a login |
| Server-side rendering (SSR) | The server builds complete HTML on each request | Next.js, Nuxt | Pages with changing data, such as products and search results |
| Static site generation (SSG) | Complete HTML is built before deployment | Astro, Eleventy, Gatsby | Marketing pages, docs, blogs |
| Incremental static regeneration (ISR) | Static pages rebuild after an interval or on demand | Next.js | Content that changes on a known pattern |
| Hybrid | Each route uses the method that fits it | Most modern frameworks | Most real sites |

Choose per route. Marketing and content pages ship as static or server-rendered HTML. Authenticated dashboards can stay client-side, because search engines cannot reach them anyway. A client-side app can reach parity with a server-rendered one only through extra work at every later step. [Server-side rendering for SEO](/articles/server-side-rendering-seo) compares the framework options.

## Configure the CDN so crawlers see current content

A CDN caches pages close to users. It also sits between your origin and every crawler, so it controls what Googlebot receives.

Long cache lifetimes on HTML make pages fast and stale. If the CDN keeps a product page for a week, Googlebot can crawl last week's price and description. Purge the cached HTML when content is published or changed, through the CMS webhook or the CDN API. Keep long lifetimes for versioned assets, such as hashed JavaScript and CSS files.

Do not serve different content to Googlebot than to visitors. Different cache keys per user agent are acceptable only if the content is the same. Different content for crawlers is cloaking and violates Google's spam policies.

Edge platforms such as Cloudflare Workers and Lambda@Edge can render HTML at the CDN node. That brings server rendering closer to the user and cuts latency.

Watch for content that changes by region. Googlebot crawls mostly from US IP addresses. If the CDN serves different content by country, Google may index only the US version. [CDN configuration for SEO](/articles/cdn-configuration-seo) covers headers and cache keys in detail.

## Keep the headless CMS fast and connected

Headless CMS platforms, such as Contentful, Sanity, and Strapi, serve content through an API. The front end fetches it at render time or build time.

API latency becomes page latency. With SSR, every page request waits for the CMS response, and time to first byte grows with it. Cache API responses and measure the slowest queries.

Model relationships in the CMS. When authors link to articles and products link to categories, templates can generate internal links from those relationships automatically.

Connect publishing to rebuilds. A webhook tells the build system when an editor publishes, and the affected pages rebuild. Incremental builds, supported by Next.js and others, rebuild only the changed pages. Build time then grows with the size of the change, not the size of the site.

Lock down preview environments. Preview sites show editors unpublished content, and a public preview URL can get indexed and even outrank production. Put previews behind authentication or return `noindex` on every preview response. [Headless CMS SEO for developers](/articles/headless-cms-seo-developers) covers the CMS side.

## Override the framework defaults that hide pages

Client-side routers, such as React Router and Vue Router, change the URL without a new page load. That feels fast, and it creates four traps.

**Navigation without links.** Crawlers find pages through `href` attributes on `a` elements. A menu item that navigates through a click handler on a `div` gives Googlebot no URL. Render every navigation item as an `a` element with a real `href`.

**Shared metadata.** Each route needs its own title, meta description, canonical tag, and Open Graph tags. Frameworks do not enforce this. Set them per route on the server.

**Content behind lazy chunks.** Code splitting speeds up the first load. Primary content must not depend on a chunk that loads only after a user action.

**Hydration and state.** When the server HTML and the client render disagree, content flashes, layouts shift, and handlers break. With Redux, Vuex, or similar libraries, SSR needs the state serialized into the page. A mistake here ships an empty initial state, and the crawler sees an empty page.

[How Googlebot renders JavaScript](/articles/googlebot-javascript-rendering) explains what the render step does and does not run.

## Assemble API-driven pages that fail gracefully

In a microservice architecture, product data, reviews, and recommendations may come from three services. The page is assembled at render time from several calls. Each call adds latency and a way to fail.

Decide the failure behavior per component before launch. If the recommendations service times out, render the page without recommendations and return `200`. If the product service fails, return `503` with a `Retry-After` header. Google then retries later instead of indexing an error page. A page that takes too long to generate risks a crawl timeout and an incomplete index entry.

GraphQL lets clients request exactly the fields they need, but deeply nested queries across services produce unpredictable response times. Schema stitching puts all of that load on the gateway, so gateway performance becomes page speed. Set query depth limits and time budgets.

## Make builds fast enough for your publishing pace

Static generation is fast for visitors, but every change needs a build. Build time sets the minimum delay between a published change and a live page.

A monolithic build regenerates every page on every deploy. On a site with many thousands of pages, that can take hours. Partial regeneration rebuilds only the changed pages and the pages that depend on them, which needs dependency tracking and cache invalidation.

Build caches, such as package caches and Docker layers, cut build time. A misconfigured cache ships stale content. Monitor the webhooks too. A failed webhook means a published change never reaches production, and the CMS and the live site drift apart. Give the build system enough capacity, or urgent fixes wait in a queue behind routine builds.

## Serve the same content to mobile and desktop

Since July 2024, Google crawls all sites with its smartphone crawler. The mobile version of a page is the version Google indexes.

A responsive design serves one HTML document to every device and adapts the layout with CSS. It avoids content differences by design. Adaptive serving sends different HTML by user agent, and it often gives mobile users less content. Content missing from the mobile version is missing from Google's index.

Build in layers. Core content renders without JavaScript, and enhancements load on top. Set a correct viewport meta tag, or phones render the desktop layout at a tiny scale. Plan touch-friendly tap targets and content density at the design stage, so that mobile pages keep the full text.

## Decide what crawlers can see behind logins

Googlebot does not log in. Content behind authentication does not enter the index.

If some protected content should rank, publish a public preview: a summary or first section without login. News and media sites use a soft paywall. Google replaced its old "first click free" policy with flexible sampling in 2017, which lets each publisher choose how much free access to give.

For paywalled articles, mark the paywalled section with `isAccessibleForFree` set to `false` and a `cssSelector` that points to it. The markup tells Google that the hidden text is a paywall, not cloaking.

Dynamic rendering serves prerendered HTML to crawlers and the client-side app to users. Google now describes it as a workaround, not a long-term solution, and recommends SSR, static generation, or hydration instead. If you use it as a bridge, the content for crawlers and users must match.

## Contain third-party scripts

Tag managers, analytics, chat widgets, and ad platforms add external code to every page.

Synchronous third-party scripts block rendering until they download and run. Load them with `async` or `defer`. Test what happens when a vendor fails: if Google Tag Manager is unreachable, the page must still render. A script error must not stop your own code.

Cookie consent managers often load before the content. Configure them so that they do not block the main content or shift the layout.

Client-side A/B testing tools change the page in the browser, and Google may index a test variant. Server-side testing avoids that. Google gives three rules for any test. Point variant URLs to the original with `rel="canonical"`. Use `302` redirects for redirect tests. End the test when you have a result.

Each analytics platform adds script weight and requests. Consolidate tracking where you can.

## Size the infrastructure for crawler traffic

Crawlers add request volume on top of visitors, and their pattern differs. Plan for it.

Google ignores the `crawl-delay` directive in `robots.txt`. Googlebot adjusts its crawl rate to your server's responses. Google removed the crawl rate limiter from Search Console in January 2024. In an emergency, return `503` or `429` for a short time to slow Googlebot. For long periods, those codes can cause pages to drop from the index. [Robots.txt and crawl budget](/articles/robots-txt-crawl-budget-developers) covers crawl control in detail.

Set autoscaling thresholds with crawler surges in mind, so that a crawl burst does not trigger a costly scale-up. Database read replicas keep crawler traffic from slowing visitors, but replication lag can briefly serve old content.

Bot management at the CDN, such as Cloudflare or Fastly rules, blocks abusive bots. Rules that are too strict can block Googlebot. Verify Googlebot by reverse DNS or against Google's published IP ranges, and allow it explicitly.

## Fix the URL structure at the routing layer

The router defines your URL patterns, and changing them after launch means redirects for every page.

Use readable slugs in route parameters, such as `/products/blue-widget`, rather than internal IDs alone. Pick one trailing-slash rule and redirect the other form. Frameworks differ: Next.js, for example, redirects to the form without a slash by default.

Filters and sort options create query parameters, and combinations of them can create huge numbers of URLs. Use canonical tags on filtered views, and block crawling of parameters that produce no unique content.

Google ignores the fragment, the part after `#`. Content that exists only at a hash route, such as `/#/pricing`, is not a separate page for Google. Use real paths.

Google says it handles subdomains and subdirectories. Many SEOs prefer a subdirectory, such as `example.com/blog`, over a subdomain, such as `blog.example.com`, because the content and its internal links stay on one host. The evidence on ranking effects is mixed. Decide before launch, because a later move needs a full migration.

## Test what crawlers see before launch

Google retired its Mobile-Friendly Test in December 2023. Use these checks instead:

1. Run the URL Inspection live test in Search Console on a staging URL that Google can reach. View the rendered HTML and the screenshot.
2. Run the Rich Results Test, which also renders JavaScript and shows the rendered HTML.
3. Crawl the staging site with Screaming Frog in JavaScript rendering mode, and compare the raw HTML with the rendered HTML.
4. After launch, compare the pages you expect in the index with the Page indexing report.

If an existing client-side site has problems, you rarely need a full rewrite. Move the high-value routes to SSR or static generation first and keep CSR elsewhere. Measure indexing before and after, and decide on a larger migration with that data.

Build speed matters for search in one indirect way. A site that takes hours to publish a change is slow to cover news and trends. Incremental builds and targeted cache purges shorten that delay.

----

```text
                  .|########||.                                       .|########||.                                       .|########||.
               |##||.      .||##|.                                 |##||.      .||##|.                                 |##||.      .||##|.
             |#|.              .|#|.                             |#|.              .|#|.                             |#|.              .|#|.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
        .#.                          .#|                    .#.                          .#|                    .#.                          .#|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
      |#             ......             #|                |#             ......             #|                |#             ......             #|
     .#           ||#########|           #|              .#           ||#########|           #|              .#           ||#########|           #|
    .#.         |######||######|.        .#.            .#.         |######||######|.        .#.            .#.         |######||######|.        .#.
    #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#
   ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||
   #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #
 ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||
 #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#
 #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.
.|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||
||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||
#.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#
#    .||####|###########################|.     #    #    .||####|###########################|.     #    #    .||####|###########################|.     #
#      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #
#      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #
#      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #
#      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #
#   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #
#. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#
|| |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||
|| ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||
.# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.
 #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#
 ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||
  #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.
   ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||
    #.        .######|#|#########|        .#            #.        .######|#|#########|        .#            #.        .######|#|#########|        .#
    .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.
     |#           ||########||           #.              |#           ||########||           #.              |#           ||########||           #.
      |#             ......             #|                |#             ......             #|                |#             ......             #|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
        |#.                          .#.                    |#.                          .#.                    |#.                          .#.
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
            .|#|.              .|#|.                            .|#|.              .|#|.                            .|#|.              .|#|.
               |##||.      .||##|                                  |##||.      .||##|                                  |##||.      .||##|
                 .||########||.                                      .||########||.                                      .||########||.

Scale With Search  2026  [scalewithsearch.com](https://scalewithsearch.com)
```
