A low Rendering Score indicates a high Ghost Ratio. This means the HTML delivered to crawlers contains far less text than what users see after JavaScript executes. AI crawlers like GPTBot typically do not render JavaScript, so they miss your content entirely.
SEODiff estimates the ghost ratio using framework-aware heuristics:
| Pattern | Estimated Ghost Ratio |
|---|---|
| Static / WordPress / Hugo | 0.00 – 0.05 |
| Next.js with SSR markers | 0.05 |
| React SPA, 200+ words visible | 0.35 |
| React SPA, <200 words visible | 0.80 |
| Angular / Vue SPA | 0.50 – 0.80 |
The rendering score is then: 100 × (1 − GhostRatio^1.5). A ghost ratio of 0.80 yields a rendering score of only ~28.
Configure your framework to render pages on the server. This ensures the initial HTML contains all content.
# Next.js — use getServerSideProps or make pages Server Components
export async function getServerSideProps() {
const data = await fetchData();
return { props: { data } };
}
Pre-render pages at build time. Best for content that doesn't change frequently.
# Next.js
export async function getStaticProps() {
const data = await fetchData();
return { props: { data }, revalidate: 3600 };
}
Use a service like Prerender.io or Rendertron to serve pre-rendered HTML to bot user agents. This is a quick fix but adds latency and complexity.
Even if you use a SPA, inline the most important text (title, description, key data) in the initial HTML as a <noscript> fallback or inside <script type="application/ld+json">.
curl -s https://yoursite.com/ | wc -w — compare word count to what you see in the browser.