Skip to content
    HadoSEO

    [ 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.

    view-source:acme-app.com · via HadoSEO
    1+<html>
    2+ <head>
    3+ <title>Acme · know why customers leave</title>
    4+ <meta name="description" content="…">
    5+ <meta property="og:image" content="…">
    6+ </head>
    7+ <body>
    8+ <h1>Churn analytics for SaaS</h1>
    9+ <p>Acme watches every account…</p>
    10+ <a href="/pricing">Pricing</a> <a href="/docs">Docs</a>
    11+ <div id="root"></div>
    12+ </body>
    13+</html>

    ✓Full page, title and meta, served to every crawler.

    [ how it works ]

    One request path. Two audiences, served right.

    [ request routing ]

    yourdomain.com→routing rules · 301 · 302 · proxy
    human→your live appunchanged
    crawler→HadoSEO render→cached HTML200 · cached · 38ms
    yourdomain.com

    ↓

    routing rules · 301 · 302 · proxy

    ↓

    human → your live app · unchanged

    crawler → HadoSEO render → cached HTML 200

    1. 1connect your domainOne DNS record at your registrar, or the HadoSEO Worker on your own Cloudflare zone.
    2. 2we route by visitorHumans reach your live app untouched; crawlers are sent to the HadoSEO edge.
    3. 3bots get rendered HTMLWe render your app and serve fully-formed HTML: title, meta, content, links.

    DNS

    no-code · prerendering automatic

    One record at your registrar.

    Connect with DNS →

    Cloudflare Worker

    cloudflare worker · prerendering opt-in

    A small Worker on your own zone.

    Deploy the Worker →
    [ + ]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.

    01 · search console

    search.google.com
    Page indexing38 pages
    /pricingIndexed
    /features/alertsIndexed
    /blog/churn-signalsIndexed

    ✓Pages leave the queue

    02 · google

    google.com
    site:acme-app.com

    acme-app.com › pricing

    Pricing · Acme

    acme-app.com › blog

    5 churn signals to watch · Acme

    ✓Every page can be found

    03 · chatgpt

    chatgpt.com
    best tool to predict SaaS churn

    ChatGPT · searched 6 sites

    …tools like Acme flag at-risk accounts from usage data acme-app.com

    ✓Readable, so it can be quoted

    04 · slack

    app.slack.com

    You 10:42 AM launched: acme-app.com

    acme-app.com

    Acme · know why customers leave

    Spot churn risk early.

    ✓Your title, your image

    [ 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.

    cache hit97.4%p50 render210msedge served<50ms

    99.9% uptime

    [ cache policy · by path ]
    • /ttl 24hdeploy · sitemap change7h old
    • /pricingttl 24hdeploy3h old
    • /blog/*ttl 3ddeploy · new URL in sitemap1d old
    • /docs/*ttl 7ddeploy2d 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.

    [ freshness · /pricing ]
    • 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)

    Purge on deploy

    Add a deploy hook; changed pages re-render automatically.

    POST /v1/cache/purge { "paths": ["/pricing"] }

    Warm from sitemap

    New URLs in your sitemap are rendered before the first bot arrives.

    sitemap.xml · 3 new URLs → rendered

    Manual purge

    Purge a page or a path pattern from the dashboard in one click.

    Purge /blog/*✓ purged 42 snapshots

    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.

    rules active12rule types301 · 302 · proxy
    app.hadoseo.com/acme-app.com/routing-rules
    acme-app.com▾

    Routing rules

    first match wins · showing 5 of 12
    #source → targettypeon
    • 1301 permanent/old-pricing→/pricinglegacy URL
    • 2301 permanent/itemdetail?item=abc123→/items/acme-widgetquery-param cleanup · CSV import
    • 3301 permanent/blog/*→/articles/*section rename · remainder carries over
    • 4302 temporary/promo→/pricingcampaign · temporary on purpose
    • 5proxy/docs/*→docs.partner-host.com/*served from another service, same domain

    Rules run top-down; the first match wins. Reorder by priority, toggle to disable, bulk-import from CSV.

    Test a path

    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.

    Lovablesupported
    Base44supported
    Reactsupported
    Angularsupported
    Flootsupported
    Any client-side appsupported
    works when your app is hosted on
    LovableBoltReplitVercelNetlifyCloudflare Pages

    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

    99% served

    12,690served in full

    46% of reads

    [ proof it paid off ]

    5,906answer fetches

    14% likely cited

    824likely cited

    23% clicked

    189visits from AI

    Funnel, last 30 days (illustrative sample)
    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
    Sample site, one month. Bar heights are compressed so small numbers stay visible.→ 189 people from AI answers this month

    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 ]

    How much of your site can AI actually see?

    Start free trial

    No signup required · results in ~60 seconds