SPA SEO: bots can still see a shell
Your SPA can look correct to users and still fail crawler fetches if critical HTML is missing at response time.
What crawlers fetch
Crawlers and social bots first evaluate server response HTML. If title, canonical, metadata, and meaningful body content are missing, indexing and sharing quality can degrade even when the browser UI eventually hydrates.
The empty-shell failure mode
A typical failure mode is an almost-empty response:
<div id="root"></div>
Application content appears only after client-side JavaScript executes. Some bots execute less JavaScript than real browsers, and execution timing can vary.
Observable contract over assumptions
RenderShield focuses on an explicit response contract for crawler routes:
- Stable title and meta description
- Correct canonical URL
- OG and Twitter metadata
- Route-specific body content
- JSON-LD for the page type
Human vs bot check example
# Googlebot-style request
curl -sS -D - -o /tmp/bot.html \
-A 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' \
'https://yoursite.com/prerender/spa-seo' \
| rg -i 'HTTP/|x-rendershield:'
# Browser-style request
curl -sS -D - -o /tmp/human.html \
-A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' \
'https://yoursite.com/prerender/spa-seo' \
| rg -i 'HTTP/|x-rendershield:'
Expected header behavior:
- Bot request:
x-rendershield: bot-hit - Human request:
x-rendershield: pass-through