[ prerendering ]
Your app, visible to every crawler.
HadoSEO is a prerendering service for JavaScript apps. If your site was built with React or an AI app builder, Google and ChatGPT may be seeing a blank page. We fix that, with no code changes: your visitors keep the live app, and every crawler gets a full, readable page, via one DNS record, or a Cloudflare Worker if you'd rather keep traffic on your own zone.
✓Full page, title and meta, served to every crawler.
[ how it works ]
One request path. Two audiences, served right.
[ request routing ]
↓
routing rules · 301 · 302 · proxy↓
human → your live app · unchanged
crawler → HadoSEO render → cached HTML 200
- 1connect your domainOne DNS record at your registrar, or the HadoSEO Worker on your own Cloudflare zone.
- 2we route by visitorHumans reach your live app untouched; crawlers are sent to the HadoSEO edge.
- 3bots get rendered HTMLWe render your app and serve fully-formed HTML: title, meta, content, links.
DNS
no-code · prerendering automaticOne record at your registrar.
Cloudflare Worker
cloudflare worker · prerendering opt-inA small Worker on your own zone.
[ + ][ − ]compare the two paths
| feature | DNS | Cloudflare Worker |
|---|---|---|
| best for | DNSClient-side apps: Lovable, Base44, React, Angular | Cloudflare WorkerServer-rendered sites, or client-side apps you run on Cloudflare |
| setup | DNSAn A record at your domain provider. No code, no redeploy. About 5 minutes. | Cloudflare WorkerA small Worker on your Cloudflare zone, with your API key. About 10 minutes. |
| you need | DNSAccess to your domain's DNS settings | Cloudflare WorkerYour domain on Cloudflare |
| traffic flows | DNSThrough HadoSEO's edge | Cloudflare WorkerThrough your own Cloudflare zone |
| crawl analytics | DNS✓ every request | Cloudflare Worker✓ every request |
| prerendering for bots | DNS✓ automatic | Cloudflare WorkerYour choice: prerendered pages, or analytics-only |
[ the payoff ]
What crawlers actually receive.
Rendered HTML changes four things you can check yourself: the index, the AI answers, the link previews, and the titles.
[ caching ]
Cached everywhere, fresh where it matters.
In plain English: bots get a fresh, fast copy of every page, and you decide how often it's refreshed, from daily to monthly, per path. Deploys or purges refresh it sooner, instantly.
99.9% uptime
- /ttl 24h24hdeploy · sitemap change7h old
- /pricingttl 24h24hdeploy3h old
- /blog/*ttl 3d3ddeploy · new URL in sitemap1d old
- /docs/*ttl 7d7ddeploy2d old
- /app/*ttl ——never prerendered · excluded via Blocked Paths— old
Freshness runs from daily (the 24h minimum) to monthly, per path. Deploys and purges refresh sooner.
- 10:02deploy webhook received → snapshot v13 queued
- 10:02re-rendered · 204ms · v13
- 10:03GPTBotHIT200 · 38ms(age 1m)
- 10:41GooglebotHIT200 · 42ms(age 39m)
- 12:30BingbotHIT200 · 40ms(age 2h)
- +24hClaudeBotSTALETTL passed · served v13, revalidating in background
- +24hre-rendered · v13 (content unchanged)
Every snapshot is versioned. See which version each bot was served in crawl analytics →
[ routing rules ]
Real redirects, for an app that can't send them.
Changed a page's address? Make sure Google and ChatGPT follow it to the new one instead of hitting a dead end. An app built in the browser can't send a real redirect, so the old address stays indexed. These rules run before your app: permanent moves, temporary campaigns, or serving a path from another service. They apply to every visitor, human or bot, so the old address redirects the same way for everyone.
Routing rules
first match wins · showing 5 of 12- 1301 permanent/old-pricing→/pricing · legacy URL301 permanent
- 2301 permanent/itemdetail?item=abc123→/items/acme-widget · query-param cleanup · CSV import301 permanent
- 3301 permanent/blog/*→/articles/* · section rename · remainder carries over301 permanent
- 4302 temporary/promo→/pricing · campaign · temporary on purpose302 temporary
- 5proxy/docs/*→docs.partner-host.com/* · served from another service, same domainproxy
Rules run top-down; the first match wins. Reorder by priority, toggle to disable, bulk-import from CSV.
GET /itemdetail?item=abc123
→ matched rule #2 · 301 permanent redirect
HTTP/1.1 301 Moved Permanently
Location: /items/acme-widget
The first matching rule decides. Paths that match nothing fall through to your app, humans and bots alike.
[ compatibility ]
Works with the stack you already ship on.
Any JavaScript-heavy web app. If your site renders client-side, HadoSEO can serve crawlers a rendered version. More on SPA SEO for React, Lovable and Base44 apps, or the guides for Lovable SEO and Base44 SEO.
Building or hosting somewhere else? Email us and we'll tell you whether we support it.
[ then what ]
Prerendering gets you crawled. Analytics tells you what happened next.
Because HadoSEO sits in the request path, it measures the whole journey from real request logs, not sampling: crawler reads, answer fetches, likely cited, visits from AI.
[ HadoSEO does the work ]
12,840crawler reads
12,690served in full
[ proof it paid off ]
5,906answer fetches
824likely cited
189visits from AI
| stage | count | conversion |
|---|---|---|
| crawler reads | 12,840 | — |
| served in full | 12,690 | 99% served |
| answer fetches | 5,906 | 46% of reads |
| likely cited | 824 | 14% likely cited |
| visits from AI | 189 | 23% clicked |
12,840
crawler reads
12,690
served in full · 99%
5,906
answer fetches · 46% of reads
824
likely cited · 14%
189
visits from AI · 23%
[ questions ]
Prerendering, answered.
[ free scan ]

