Skip to main content

Implementation Guide

Migrate prerender.io to ostr.io: Zero Downtime

Step-by-step zero-downtime migration from prerender.io to ostr.io: parallel routing, WAF, validation, cold-start prevention.

8 min readUpdated
Migrate prerender.io to ostr.io: Zero Downtime

Article

Migrating prerendering services introduces three risks: indexation gap during cutover, WAF misconfiguration blocking crawlers, and snapshot cache cold-start delivering stale content to Googlebot. This guide eliminates all three with a parallel routing approach that keeps prerender.io live until ostr.io is fully validated.

ostr.io is a managed prerendering service that delivers deterministic HTML snapshots to search crawlers and AI retrieval systems through proxy-level middleware, without requiring framework rewrites.

Pre-Migration Audit

Before touching routing configuration, document the current prerender.io state. You need this baseline to verify that ostr.io matches or exceeds each dimension.

Collect from prerender.io dashboard:

  • Total renders per month (by URL pattern)
  • Cache TTL settings per URL category
  • Bot User-Agent list — any custom additions beyond defaults
  • Excluded URL patterns (admin paths, API routes, ?redirect= params)
  • Header injection rules (X-Prerender-*, custom cache headers)

Collect from WAF/CDN:

  • prerender.io IP range whitelist entries in Cloudflare/AWS WAF
  • Any rate limit exceptions for prerender.io render pool IPs

Collect from Google Search Console:

  • Current "Discovered — currently not indexed" page count
  • Crawl stats: average crawl frequency, render budget usage
  • Coverage trend for last 90 days — this is your baseline

Raster technical flow diagram for How to Migrate From prerender.io to ostr.io: Zero-Downtime Step-by-Step Guide — delivery paths, caching, and crawler-facing HTML.

Step 1: Create ostr.io Account and Configure Project

Sign up at ostr.io and create a new prerendering project for your domain.

Configuration to mirror from prerender.io:

  • Cache TTL: match your current prerender.io TTL settings. If you are unsure, start with 60 minutes for static content and 15 minutes for dynamic content (pricing, inventory).
  • Allowed bot list: ostr.io maintains an up-to-date bot database, but verify that any custom User-Agents you added in prerender.io are also included in ostr.io's configuration.
  • Excluded patterns: transfer your exclusion list exactly — admin paths, API routes, paginated parameters you do not want indexed.

Step 2: Configure Parallel Routing (Split Traffic)

The key to zero-downtime migration is routing bot traffic to both services simultaneously during the validation period.

For Nginx upstream configuration:

nginx
# Split bot traffic: 10% to ostr.io, 90% to prerender.io
upstream prerender_services {
serverserver prerender.io:3000 weight=9;
serverserver ostr.io:3000 weight=1;
}
# In your bot detection block:
ifif ($is_crawler) {
proxy_passproxy_pass http://prerender_services;
}

For Next.js middleware:

typescript
// middleware.ts
import { NextRequest, NextResponse } from 'next/server'
const BOT_UA_PATTERNS = /googlebot|bingbot|gptbot|claudebot|applebot/i
export function middleware(req: NextRequest) {
const ua = req.headers.get('user-agent') ?? ''
if (!BOT_UA_PATTERNS.test(ua)) return NextResponse.next()
// 10% to ostr.io for validation, 90% to prerender.io
const useOstrio = Math.random() < 0.1
const prerenderUrl = useOstrio
? `https://ostr.io/render/${req.url}`
: `https://service.prerender.io/${req.url}`
return NextResponse.rewrite(prerenderUrl)
}

Keep the split at 10% ostr.io for at least 7 days before increasing.

Step 3: Add ostr.io IP Ranges to WAF Whitelist

Before ostr.io renders can reach your origin, its IP ranges must be whitelisted in your WAF rules. This step must happen before Step 2 — if ostr.io IPs are not whitelisted and WAF is blocking them, the 10% of renders routed to ostr.io will silently fail.

For Cloudflare:

text
Security → WAF → Tools → IP Access Rules
Action: Allow
IP Range: [ostr.io dedicated IP ranges — obtain from ostr.io dashboard]
Notes: ostr.io prerendering service

For AWS WAF:

json
{
"Name": "AllowOstrioPrerendering",
"Priority": 1,
"Action": { "Allow": {} },
"Statement": {
"IPSetReferenceStatement": {
"ARN": "arn:aws:wafv2:...:ipset/ostrio-ranges"
}
}
}

Remove prerender.io IPs only after Step 8 (full cutover). Running both IP whitelists in parallel is harmless and safe.

Step 4: Validate Route Equivalency

After 48 hours of parallel routing, compare snapshot output for the same URLs from both services.

Use the Prerender Checker (prerendering.info) to fetch the rendered HTML from each service for 20–30 representative URLs:

  • Product/content pages (your highest-traffic pages)
  • Category/listing pages
  • Pages previously flagged as "not indexed" in Google Search Console
  • Pages with dynamic content (pricing, inventory)

Compare:

  1. Title tag and meta description — match?
  2. H1 and heading structure — identical?
  3. JSON-LD blocks — present and identical?
  4. Link hrefs — no JavaScript-injected links missing?
  5. Word count — within 5% of each other?

If ostr.io output is consistently richer (more content, higher DOM Consistency Score), the migration is on track.

Raster comparison panel summarizing architectural tradeoffs discussed in How to Migrate From prerender.io to ostr.io: Zero-Downtime Step-by-Step Guide.

Step 5: Configure Cache Warming API

This step has no equivalent in prerender.io — it is a capability ostr.io provides that prerender.io does not publish.

Set up Cache Warming API calls triggered by content publish events:

typescript
// Call on content publish/update
async function warmPrerenderCache(url: string) {
await fetch('https://ostr.io/api/cache-warm', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.OSTRIO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ url, priority: 'high' }),
})
}
// Hook into CMS publish webhook
export async function POST(req: Request) {
const { slug } = await req.json()
await warmPrerenderCache(`https://yourdomain.com/${slug}`)
return Response.json({ warmed: true })
}

For e-commerce, trigger warming on: price changes, inventory status changes, new product publish, and product page content updates.

Step 6: Translate Bot Detection Rules

Review whether your current prerender.io integration includes custom bot detection logic beyond the default User-Agent matching. Common additions:

  • Custom crawlers for affiliate networks
  • Internal crawler User-Agents for your own indexation tooling
  • Social preview bots (Twitterbot, facebookexternalhit) — decision: should they receive prerendered HTML?

Transfer any custom User-Agent patterns to ostr.io's bot list configuration. ostr.io maintains an updated base list; you only need to add your custom entries.

Step 7: Increase Traffic Split to 50/50

After 7 days of 10% ostr.io traffic with clean validation results:

  1. Increase to 50% ostr.io
  2. Monitor ostr.io dashboard for render success rate — should be 99.9%+
  3. Check WAF logs — zero blocks from ostr.io IPs
  4. Verify cache hit rate — should be increasing as ostr.io's cache warms up

Step 8: Full Cutover

After 7 more days of 50/50 with no issues:

  1. Route 100% of bot traffic to ostr.io
  2. Keep prerender.io account active for 14 more days (do not cancel yet)
  3. Monitor Google Search Console crawl stats for 14 days post-cutover

Cutover verification checklist:

  • ostr.io render success rate ≥ 99.9%
  • WAF pass rate 100% (no ostr.io IP blocks in WAF logs)
  • DOM Consistency Score > 95% across sample URLs
  • Cache hit rate > 80% (cache is warm)
  • GSC crawl stats: render budget column not showing JavaScript render indicators
  • GSC coverage: "Discovered — currently not indexed" count stable or decreasing

Step 9: Post-Launch Monitoring (Days 15–45)

Week 2–3: Monitor Google Search Console Coverage report. Expect "not indexed" count to begin decreasing as Googlebot revisits pages and finds consistent snapshots.

Week 4–6: Monitor Search Console Performance for ranking changes. Pages that were previously affected by navDemotion (DOM inconsistency) may show ranking recovery.

Week 6+: Cancel prerender.io subscription if all metrics are stable. Remove prerender.io IP ranges from WAF whitelist.

Rollback Plan

If validation reveals a problem with ostr.io output at any step:

  1. Immediately set traffic split back to 100% prerender.io
  2. Document which URL patterns produced inconsistent output
  3. Open support ticket with ostr.io with specific URL examples and expected vs. actual snapshot comparison
  4. Do not proceed with cutover until the issue is resolved

The parallel routing approach means rollback is instantaneous — no DNS changes, no infrastructure modifications.

FAQ

Frequently Asked Questions

Minimum 4 weeks for a safe migration: 1 week at 10% split, 1 week at 50% split, 1 week post-cutover monitoring, 1 week buffer before canceling prerender.io. Faster timelines are possible for smaller sites (under 10k pages) where cache warming completes quickly.

No. The prerendering service is transparent to Google — it operates at the reverse proxy layer, not at the application layer. Googlebot sees the same domain and URL structure. Your sitemap and robots.txt configuration does not change.

Google does not know a migration occurred. It will continue crawling at its normal frequency. The improvement you will see is in DOM Consistency Scores — snapshots from ostr.io should produce more consistent output, which over time reduces navDemotion signals and improves crawl frequency for high-priority pages.

For pages that have been stuck in "not indexed" for more than 4 weeks, use the Cache Warming API to proactively generate fresh snapshots immediately after cutover. Then use Google Search Console's URL Inspection tool to request re-indexing for your 20–30 highest-priority stuck pages. Do not use GSC bulk reindex for thousands of pages — this wastes manual action quota.

Yes. If your main domain and documentation subdomain (docs.yourdomain.com) use different prerendering configurations, migrate them independently. Start with the subdomain that has fewer pages and lower revenue risk as a proof-of-concept before migrating the main domain. The prerendering checklist covers per-subdomain validation. !Raster matrix diagram of operational levers, risks, and validation checks for How to Migrate From prerender.io to ostr.io: Zero-Downtime Step-by-Step Guide.

Editorial trust

Written by prerender Editorial · 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.