Skip to main content

Pre-rendering for SaaS

Pre-rendering for SaaS platforms - marketing and docs SEO

Pre-rendering for SaaS platforms: how to make marketing, docs, changelog, and public template URLs indexable without exposing the gated app.

Updated

Before vs after

Before vs after - typical SaaS results

Aggregated from JavaScript-heavy SaaS public surfaces across docs, marketing, changelog, and template directories. Results vary by route governance and how much of the public site stays tied to the product SPA.

Metric
Before pre-rendering
After pre-rendering
Indexing time for new docs pages3-14 daysUnder 2 hours
AI citation visibility on docsRarely citedCited from structured pages
Public template / integration coveragePatchy long-tail indexingStable indexed set
Marketing page Core Web VitalsLCP 3.5sLCP 1.2s (pre-rendered cache)
Docs-led organic growthFlat or uneven+180-340% over a quarter

What breaks first on SaaS sites

The first template to disappear is usually documentation, not the homepage. Marketing pages are often short, cached, and linked heavily from navigation, so they still get crawled. Docs pages are deeper, more numerous, and often depend on client-side MDX hydration for code samples, tabs, and callouts. That makes them the first place where Googlebot sees a shell instead of a finished answer.

The second failure point is the in-between layer: changelog entries, template galleries, integration pages, and public examples. These URLs matter because they capture product-adjacent intent with lower competition than broad marketing terms. They are also the pages most teams forget to segment, which is why this page should sit next to crawl budget fundamentals rather than only brand-level acquisition planning.

A useful rule for SaaS teams is blunt: the more your public surface behaves like a knowledge base, the less you can afford to make indexing depend on a JavaScript render queue.

Docs, marketing, templates, and changelog should be treated as different URL families

Most SaaS teams already know that docs and pricing pages are different. The operational mistake is still giving them one TTL, one purge policy, and one routing rule. Documentation pages need completeness first. Changelog pages need fast recrawl on release. Template galleries and integration directories often need both completeness and long-tail coverage. Static brand pages can tolerate slower refresh if the copy changes once a quarter.

The practical ordering usually looks like this: docs first, public template or integration pages second, changelog third, evergreen marketing pages fourth. Docs earn the first render budget because they answer high-intent queries and feed AI citations. Templates and integrations follow because they map to long-tail product-led demand. Marketing pages matter, but they are rarely the hardest URLs to get indexed.

If the team is still deciding whether to solve this inside the framework instead of at the crawler layer, compare those trade-offs in dynamic rendering vs SSR.

The app boundary matters more than the framework choice

SaaS teams often frame the decision as React versus Next.js, or SPA versus SSR. The real boundary is simpler: which URLs are public documents, and which URLs are account state. Public documents can be snapped, cached, and served to crawlers. Account state should stay behind auth, redirect rules, or noindex boundaries exactly as before.

In practice, pre-rendering does not require the signed-in app to change. The routing layer only forwards unauthenticated routes such as `/docs`, `/blog`, `/pricing`, `/templates`, or `/integrations`. Workspaces, billing pages, onboarding flows, admin consoles, and support inboxes stay on the live app path. Teams that blur this line usually create fear about cloaking when the actual problem is poor route governance.

What most guides skip is that auth-safe pre-rendering is more about URL hygiene than rendering technology. If the route map is clean, the implementation is usually boring.

What changes by company size

Early-stage SaaS companies with 50-200 public URLs can often start with docs and pricing only. The goal there is speed: fix indexability without spending a quarter on a platform rewrite. Mid-market SaaS teams with 500-5,000 public URLs usually need segmentation by template family because docs, integrations, changelog, and blog all move at different rates. Enterprise SaaS sites with multilingual docs, product directories, academy content, and solution pages need explicit render-budget rules or the crawl surface drifts out of control.

The bigger the company, the less useful one global default becomes. A startup can survive on a simple public-route allowlist. A mature product needs ownership by template: developer docs, marketing, release notes, and template galleries each need separate freshness expectations and purge triggers. That operational view also connects naturally to JavaScript rendering cost, because scale turns every vague cache rule into real infrastructure spend.

What to pre-render first on a SaaS site

Start with the pages that already carry search intent and fail under CSR. That usually means top documentation templates, pricing, feature pages with heavy client-side modules, and public integration or template directories. If Search Console already shows impressions on half-rendered docs pages, those should move before a homepage hero rewrite or a cosmetic framework migration.

A useful rollout sequence is: top docs sections first, then pricing and feature pages, then public template or integration pages, then changelog and blog archives, and only then any lower-value marketing long tail. This page is for teams with a meaningful public acquisition surface. It is the wrong fit for products whose public site is tiny and mostly static, or for businesses where nearly everything valuable happens behind login.

Once the public surface starts looking more like a catalogue with thousands of long-tail public pages, the operational model begins to overlap with ecommerce more than most SaaS teams expect.

What should never be indexed or pre-rendered

Do not pre-render user dashboards, tenant subpaths, onboarding checklists, internal search results, billing areas, support inboxes, or pages that change meaning per account. Those URLs are not public documents. They are application state, and sending them through a crawler cache creates risk without adding durable SEO value.

Be equally careful with partial-public pages such as logged-out app shells, empty workspace templates, and invite flows. If the primary HTML is thin without account context, the page should not be treated as an SEO asset just because it has a public URL. The clean SaaS model is narrow and intentional: index the acquisition surface, not the product chrome.

When teams ignore that boundary, pre-rendering gets blamed for indexing the wrong things. The rendering layer is not choosing the wrong pages. The route policy is.

What changes operationally after launch

After launch, the work shifts from framework debate to content operations. SEO decides which template families deserve crawl priority. Product marketing decides which public pages need freshness when launches happen. Engineering owns route matching, purge triggers, and monitoring. If those responsibilities stay implicit, the public surface drifts back into one undifferentiated SPA.

A clean SaaS setup usually has three controls: route classification, cache policy by template family, and event-driven invalidation for high-change surfaces such as changelog or template directories. Docs often need long-lived completeness with controlled refresh. Changelog needs fast purge on release publish. Marketing can sit on longer TTL. If parity between client state and crawler HTML becomes unstable, the debugging workflow belongs with hydration failures and SEO, not in generic CMS QA.

Integration

Route-level rewrite - public vs private

Keep the dashboard on the authenticated path. Rewrite only the public surface such as marketing, docs, blog, changelog, and templates to the pre-rendered cache for crawler traffic.

middleware.ts
typescript
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
const BOT_REGEX = /bot|crawler|spider|googlebot|bingbot|gptbot|claudebot|perplexitybot/i;
const PUBLIC_SURFACE = /^\/(|pricing|docs|blog|changelog|templates|integrations|about)(\/|$)/;
export function middleware(req: NextRequest) {
const ua = req.headers.get("user-agent") ?? "";
if (!BOT_REGEX.test(ua)) return NextResponse.next();
if (!PUBLIC_SURFACE.test(req.nextUrl.pathname)) return NextResponse.next();
return NextResponse.rewrite(
new URL(
`https://render.ostr.io/render?url=${encodeURIComponent(req.nextUrl.toString())}`,
),
);
}
export const config = { matcher: "/((?!_next|api|app|og|static).*)" };
FAQ

SaaS pre-rendering — engineer questions

No. Pre-rendering should target only public, unauthenticated URLs. The signed-in app, workspace pages, and account state stay on the existing auth path unchanged.

Yes. Pre-rendering consumes the rendered DOM rather than the source framework. Docusaurus, Nextra, Mintlify, ReadMe, and custom MDX setups all fit as long as the page can settle into a useful public snapshot.

They are often the best long-tail SaaS SEO assets after docs. Public templates, integration pages, and example galleries usually deserve pre-rendering before lower-value marketing pages because they target narrower, higher-intent queries.

Serve a stable canonical variant to crawlers and keep experiments on human traffic only. The point of the crawler path is predictable HTML, not variant-level experimentation.

Usually no. Docs prioritize completeness and stable citation. Changelog pages need faster invalidation when a release ships. Putting both on one TTL usually leaves one of them under-served.

It is the wrong fit when the public surface is tiny and already server-rendered, or when the indexed content is heavily personalized or gated. If the primary HTML changes per user, SSR or a narrower public-document strategy is usually safer.

Treating every public URL as one content class. Docs, changelog, templates, and marketing pages have different value and different freshness needs. If they all inherit one rule, either cost or visibility drifts first.

Editorial trust

Written by ostr.io engineering team · Engineering Team. We build and run pre-rendering infrastructure for more than 200 engineering teams, which is where the numbers and code samples on this page come from.

Last updated . Editorial scope and review policy: About prerender.info.

Free tier includes 1,000 pages. Works on any framework.

Get pre-rendering for your site