Skip to main content

ostr.io vs Vercel SSR

ostr.io vs Vercel SSR - when to pre-render instead of SSR

Should crawler traffic hit Vercel SSR or a pre-rendering layer? Function execution cost, cache behaviour, and migration paths for Next.js apps.

Updated

Choose ostr.io if

  • Your Next.js app has more crawler traffic than user traffic on catalog pages.
  • You want to cap Vercel function execution cost without refactoring routes to ISR.
  • You run a non-Next.js SPA (Nuxt, SvelteKit, Remix, vanilla React) and need a framework-agnostic layer.
  • You want a hybrid model where hot routes stay SSR and the long tail becomes cheap for crawlers.

Vercel SSR might work if

  • You are on Vercel Enterprise and already inside their function-execution budget.
  • Your Next.js app is new, small (< 1,000 pages), and ISR already covers the content model.
  • All content is authenticated and not meant to be indexed.
  • Your SEO-critical pages need real-time per-request HTML for both users and bots.
Head-to-head

Feature comparison — April 2026

Feature parity between ostr.io and Vercel SSR. The rows below are the ones engineering teams ask about in vendor due diligence.

Capability
Recommendedostr.io
Competitor
Framework supportFramework-agnostic (React, Vue, Svelte, vanilla)Next.js only
Crawler cost isolationCrawler traffic hits cache, not originEvery crawler hit runs a function
Cache TTL granularityPer-URL TTL + purge APIISR revalidate per route
Cold startPre-rendered HTML, no cold startLambda cold start 200-600ms
Bundle size impactZero client bundle changesSSR requires server runtime
Hybrid route controlPer-route bot routingPossible, but tied to app architecture
AI crawler cost isolationAI bots hit cached HTMLAI bots execute app runtime
Migration effortMiddleware layer, no rewriteOften requires framework commitment
Freshness on live-user pagesCache-policy boundedPer-request real time
Pricing at scale

Pricing at 10k / 100k / 1M URLs

Pricing verified against each vendor's public page in April 2026. "Not publicly disclosed" appears where Vercel SSR uses custom-only quoting.

Pricing verified . Vendors may change tiers at any time — always confirm on the vendor's pricing page before committing.

Scale tier
Recommendedostr.io
Competitor
10,000 URLs, weekly refreshStarts $49/moPro plan + function execution (~$80/mo)
100,000 URLs, daily refreshStarts $199/moPro plan + execution (~$500+/mo)
1M URLs, event-driven refreshCustom, ~$1,200/moEnterprise (quote only)
Annual cost predictabilityTier-based forecast is stableFunction spikes distort monthly spend
Crawler surge resilienceCost mostly absorbed by cacheEvery surge hits execution budget

Function execution is the hidden cost on Vercel

Vercel's Pro plan includes a function execution quota, but crawler traffic consumes it quickly. A 100k-URL catalogue with weekly Googlebot crawls routinely triggers 500,000+ function executions per month, which pushes most teams over the Pro quota into Enterprise pricing. If you are already seeing this on high-fanout routes, cross-check the scale assumptions in large sites (100k+ pages).

Pre-rendering removes this entire workload from Vercel functions. Crawler traffic hits a static HTML cache served from the edge; human traffic continues to hit the SSR function as usual. That split is the practical version of the model described in dynamic rendering vs SSR.

The counterintuitive part is that SSR can still feel cheap in development and early production because human traffic is modest. The bill bends upward only after crawler demand compounds across product pages, categories, docs, changelogs, and any long-tail routes that bots revisit more often than humans do.

ISR is not the same as dynamic rendering

Next.js ISR regenerates HTML on a revalidate timer, but the first request after expiry still pays the full SSR cost. Under crawler fan-out, that means repeated SSR spikes every time Googlebot refreshes a category page; the problem is most obvious on SaaS marketing and docs surfaces and on large catalogues.

Pre-rendering is scheduled by the render pool, not triggered by the first incoming request. The snapshot is already hot when Googlebot arrives, which flattens the function-execution curve. If your concern is total browser and render spend rather than Vercel alone, read JavaScript rendering cost.

What most guides skip is that ISR solves freshness and build-time pain better than it solves crawler-cost isolation. If the business problem is 'Googlebot keeps re-running expensive routes,' ISR helps less than people expect because the crawler still lands on application infrastructure, not on a dedicated crawler-facing cache.

The right model is usually route classification, not platform loyalty

A practical route map looks like this: homepage, pricing, and a few flagship landing pages can stay SSR or ISR; large category sets, docs archives, changelogs, and evergreen long-tail content can move to pre-rendered delivery for crawlers; authenticated routes should stay out of the index entirely. That division matches engineering reality better than trying to force one rendering model onto every URL.

In practice, teams that classify routes early spend less time arguing about ideology. They stop asking whether SSR is 'better' and start asking which URLs actually need per-request computation. That is also the point where pre-render cache headers and crawl budget fundamentals become more useful than generic framework discussions.

The 12-month TCO story matters more than the first invoice

At 10k URLs, the gap between Vercel SSR and a managed pre-rendering layer can look small enough to ignore. Over 12 months, that view gets distorted by two things: crawler spikes after new sitemap launches and engineering time spent tuning route caching, revalidate settings, and origin protection. The spend is not just infrastructure; it is also attention.

ostr.io compresses that operating model into a bounded rendering tier. Vercel SSR remains strong where the same route must be fresh for humans and bots at the same time. The moment you can separate those concerns, the long-tail cost curve usually starts favoring pre-rendering.

Non-Next.js apps get SSR-equivalent results without the framework lock-in

SvelteKit, Nuxt, Remix and vanilla React apps do not have first-party Vercel SSR semantics. Pre-rendering is framework-agnostic: the snapshot pool consumes the rendered DOM regardless of how your app produced it, which is why it fits mixed estates better than committing the whole organization to one SSR runtime.

Teams running multiple frontend frameworks behind a single domain (for example microfrontend architectures) find a single pre-rendering layer easier to operate than coordinating three different SSR runtimes. If you are evaluating Vercel against another non-framework option, compare this page with ostr.io vs Cloudflare.

One caveat: if the whole organization is already standardized on Next.js and the public indexable surface is small, framework lock-in may not be a real problem. It becomes a problem when the rendering decision starts driving org-wide platform choices instead of simply solving crawler-facing HTML delivery.

When Vercel SSR still wins

Vercel SSR still makes sense when the app is new, tightly tied to Next.js, and most of the value comes from user-facing freshness rather than crawler-cost isolation. Teams with a small public surface, strong Next.js conventions, and low crawler volume often do not need a second rendering layer yet.

The cut-over usually happens when public routes multiply faster than product teams can optimize SSR, or when crawler traffic becomes a visible line item. That is the moment to compare Vercel not only to ostr.io, but also to the broader architectural decision in dynamic rendering vs SSR.

When ostr.io is the wrong fit

ostr.io is the wrong fit if your key indexed routes are heavily personalized at request time, or if regulatory, account-level, or user-state conditions change the primary HTML so often that a crawler-facing cache cannot stay meaningfully representative. In that case SSR or tightly controlled ISR is the safer path.

It is also the wrong fit when the site barely has an indexable public surface. If 90% of the application lives behind login and the public marketing site is 50 pages, the simpler answer may be to keep Vercel SSR or even static generation and avoid adding another operational layer.

Migration

Next.js middleware — forward crawler traffic to ostr.io

Keep Vercel SSR for human traffic; redirect bot traffic to the pre-rendered snapshot. One middleware file, no route changes.

middleware.ts
typescript
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
const BOT_REGEX = /bot|crawler|spider|googlebot|bingbot|applebot|duckduckbot/i;
export function middleware(req: NextRequest) {
const ua = req.headers.get("user-agent") ?? "";
if (!BOT_REGEX.test(ua)) return NextResponse.next();
const render = new URL(
`https://render.ostr.io/render?url=${encodeURIComponent(req.nextUrl.toString())}`,
);
return NextResponse.rewrite(render);
}
export const config = { matcher: "/((?!_next|api|og|static).*)" };
FAQ

Vercel SSR vs ostr.io — questions engineers ask

No. Pre-rendering sits in front of your Next.js app and intercepts crawler traffic only. Users continue to hit SSR or client-side routes as before; nothing changes for the user-facing runtime.

ISR is enough for small, low-fanout sites. It does not protect against crawler storms on 100k+ URLs because the first request after the TTL still pays the full SSR cost. Pre-rendering decouples rendering from request volume.

Edge Middleware is complementary. Most teams install ostr.io by writing an Edge Middleware that forwards bot UA traffic to the render endpoint. Edge Middleware itself is not a pre-rendering layer.

Not on pages that the crawler hits. Googlebot, Bingbot and AI crawlers are routed to the pre-rendered cache, so they never invoke a Vercel function. You keep paying for function execution on human traffic only.

Yes. Keep getServerSideProps for user-facing logic. The pre-rendering service captures the output of your SSR-rendered page, so the logic still runs on the snapshot pool — the difference is where the output is served from.

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.

Run this comparison against your own stack

prerender.info · pre-rendering for JS SEO

Switch to ostr.io — migration in 15 minutes