Cloudflare Pages SEO
Your Cloudflare Pages App Is Invisible to Google
Cloudflare Pages is fast, free, and easy to deploy to. But if your app is a client-side rendered SPA -- React, Vue, Svelte, or anything that renders in the browser -- Google sees an empty HTML shell when it crawls your site. No content, no meta tags, nothing useful to index.
Your app works perfectly for humans. But search engines need the rendered HTML, and Cloudflare Pages does not provide server-side rendering out of the box.
What RndrKit Does
RndrKit sits in front of your Cloudflare Pages app and handles bot traffic. When Googlebot or any other crawler visits, RndrKit renders the page with a headless browser and returns the fully rendered HTML. Human visitors are proxied directly to your Cloudflare Pages app -- no change to their experience.
Setup
Step 1: Find Your Cloudflare Pages URL
Every Cloudflare Pages project has a default URL:
your-project.pages.dev
Find this in the Cloudflare dashboard under Workers & Pages > your project. This is your origin URL.
Step 2: Remove Your Custom Domain from Cloudflare Pages
This must happen before you change DNS. If your custom domain is still configured in Cloudflare Pages, it will conflict with RndrKit.
- Go to the Cloudflare dashboard.
- Navigate to Workers & Pages and select your project.
- Go to Custom domains.
- Remove your custom domain (e.g.,
www.example.com). - Keep the default
*.pages.devURL as your origin.
Step 3: Sign Up for RndrKit
Create your account at rndrkit.io.
Step 4: Add Your Domain
Click Add Domain in the RndrKit dashboard:
| Field | Example | Description |
|---|---|---|
| Custom Domain | www.example.com | The domain your visitors use |
| Origin URL | your-project.pages.dev | Your Cloudflare Pages default URL |
Step 5: Configure DNS
Since your domain is likely already on Cloudflare, you can add the CNAME record right in the Cloudflare DNS dashboard:
| Type | Name | Value | Proxy Status |
|---|---|---|---|
| CNAME | www | cname.rndrkit.io | DNS only |
Important: The proxy status must be DNS only (gray cloud icon). If the orange cloud (Proxied) is enabled, Cloudflare will intercept the traffic and RndrKit's bot detection will not work.
You can switch to orange cloud (Proxied) later after verifying everything works, but start with gray cloud during setup.
See DNS Configuration for more details.
Step 6: Verify
# Bot request -- should return fully rendered HTML
curl -s -A "Googlebot/2.1" "https://www.example.com/" | head -50
# Human request -- should return your SPA shell
curl -s "https://www.example.com/" | head -50
Platform-Specific Notes
Remove Custom Domain from Pages First
If your custom domain is still attached to your Cloudflare Pages project, Cloudflare will route traffic directly to Pages and bypass RndrKit entirely. You must remove it from the Pages custom domains before updating DNS.
Gray Cloud During Setup
When you first add the CNAME record, use DNS only (gray cloud). This ensures traffic flows directly to RndrKit so you can verify bot detection and rendering work correctly.
Once everything is confirmed working, you can optionally enable the orange cloud (Proxied) if you want Cloudflare's CDN caching in front of RndrKit.
Cloudflare Workers and Functions
If you use Cloudflare Workers or Pages Functions for server-side logic, those will continue to run on your *.pages.dev origin. RndrKit proxies human traffic to your origin unchanged, so your backend logic stays intact.
Already Using Cloudflare DNS?
If your domain's nameservers are already on Cloudflare (which is common), the DNS change is easy -- just edit the CNAME record right in the Cloudflare dashboard. No nameserver changes needed.
SEO Quick Wins
Once RndrKit is serving rendered HTML to bots, make sure your app includes:
- Title tags on every page -- unique and descriptive
- Meta descriptions for each page
- Open Graph tags for social media previews
- Canonical URLs pointing to your custom domain, not
pages.dev - Structured data (JSON-LD) where appropriate
Verify It Works
curl -s -A "Googlebot/2.1" "https://www.example.com/" | head -100
You should see your page content in the HTML. If you see an empty shell, double-check that the custom domain was removed from Cloudflare Pages and that the CNAME is set to DNS only.
See troubleshooting if you run into issues.
Next Steps
- Analytics -- See which bots are crawling your site
- Cache Warming -- Pre-render important pages ahead of time
- SEO Audit -- Identify SEO issues on your pages
- Sitemaps -- Submit a sitemap to search engines