[Crawl-Date: 2026-04-10]
[Source: DataJelly Visibility Layer]
[URL: https://datajelly.com/blog/crawled-not-indexed]
---
title: Page Crawled But Not Indexed: The Real Reasons | DataJelly
description: Crawled currently not indexed is a delivery failure, not a content problem. Here's what's actually happening - broken HTML, empty shells, and JS rendering failures.
url: https://datajelly.com/blog/crawled-not-indexed
canonical: https://datajelly.com/blog/crawled-not-indexed
og_title: DataJelly - The Visibility Layer for Modern Apps
og_description: Rich social previews for Slack &amp; Twitter. AI-readable content for ChatGPT &amp; Perplexity. Zero-code setup.
og_image: https://datajelly.com/datajelly-og-image.png
twitter_card: summary_large_image
twitter_image: https://datajelly.com/datajelly-og-image.png
---

# Page Crawled But Not Indexed: The Real Reasons | DataJelly
> Crawled currently not indexed is a delivery failure, not a content problem. Here's what's actually happening - broken HTML, empty shells, and JS rendering failures.

---

We see this constantly:

2–5 KB

HTML response

<100

Words of visible text

Empty

<div id="root"> + scripts

Result: Google crawls it, never indexes it, and moves on.
This isn't a content quality problem. It's a delivery failure.

## The Real Problem

"Crawled – currently not indexed" means Google fetched your page and decided it wasn't worth indexing. The Google Search Console message is vague by design — it tells you almost nothing about *why*.

We see this constantly on React, Vite, and [Lovable](https://datajelly.com/blog/lovable-seo-not-ranking) builds. The pattern is always the same:

Browser view

3,000–8,000 words, full UI, interactive components

Raw HTML response

2–5 KB, mostly <script> tags, no usable content

If your `<body>` doesn't contain real text on first response, Google has nothing to evaluate. It crawls the page, sees an empty shell, and drops it.

## What's Actually Happening

Google does not fully render every page. It decides whether to invest in rendering based on the initial HTML response. This is the part most people miss.

Google's actual flow:

1. 1Fetch HTML
2. 2Evaluate HTML (size, structure, text content)
3. 3**Decide whether to render JS** — this is the cutoff
4. 4Attempt render (best effort, not guaranteed)
5. 5Decide to index or drop

**The real cutoff happens at step 2–3.** If your HTML looks like this:

- <10KB total size
- <200–300 words of visible text
- Mostly `<script>` tags
- No meaningful headings

Google often never renders the page at all. And even when it does attempt rendering:

- JS errors break hydration silently
- Slow bundles cause timeouts
- Partial DOM = partial content = dropped page

That's enough for Google to mark the page as "crawled – currently not indexed" forever.

## Concrete Failure Signals

These are the signals we see consistently across real sites. They're not theoretical — they're exactly what [Guard](https://datajelly.com/products/guard) flags during automated audits:
| Signal | Threshold | Risk |
| --- | --- | --- |
| HTML size | <10KB | High |
| Visible text | <200 chars | High |
| Script ratio | >70% scripts | High |
| Missing <title> or empty <h1> | Any | Medium |
| Resource errors | 3+ failed JS/CSS | High |
| Render time | >5 seconds | Medium |
Guard flags these as specific failure types: `script_shell_only` (blank page, no visible text), `critical_bundle_failure` (JS didn't load), and `low_text_density` (HTML exists but content is missing).

## What Most Guides Get Wrong

Most SEO advice about "crawled but not indexed" assumes Google *saw* your content and decided it wasn't good enough. That's almost never the issue.

Bad advice you'll see everywhere:

- "Improve your content quality"
- "Add more keywords"
- "Build more backlinks"
- "Request re-indexing"

None of that matters if Google never saw the content. You can't optimize content that doesn't exist in the HTML response.

This is the same fundamental problem we cover in [React SEO Is Broken by Default](https://datajelly.com/blog/react-seo-broken-by-default) — the HTML is the problem, not the content strategy.

## What We See in Production

These are not rare edge cases. These are standard failures we diagnose every week.

1
## Empty HTML shell

HTML: **3.2KB**. Body: empty root div. JS required for all content.

<html>
  <head><title>My App</title></head>
  <body>
    <div id="root"></div>
    <script src="/main.js"></script>
  </body>
</html>

Result: **never indexed**. Google never renders it. This happens constantly on [Lovable](https://datajelly.com/blog/lovable-seo-not-ranking) , Vite, and static SPA builds.

2
### JS bundle failure

HTML loads fine. `/main.js` returns 404 or fails to execute. React never mounts.

Result: no headings, no text, page dropped. Guard flags this as `critical_bundle_failure`.

Your browser retries and recovers. Googlebot doesn't.

3
### Slow hydration timeout

TTFB: **2.5s**. JS loads at ~4s. Content visible at ~6–8s.

Result: Google captures incomplete DOM. The page *might* look partially rendered but has missing sections. Indexing skipped or incomplete.

We see this a lot on sites with heavy API calls during mount — Google doesn't wait for your data fetching to finish.

4
### Script-heavy HTML

HTML: **25KB** (looks decent). Visible text: **~120 chars**. 80% of the HTML is script tags.

Result: classified as low-value. Not indexed. The file *size* is fine — the *content* ratio is the problem.

5
### Bot mismatch / bot blocking

Humans see full rendered page. Googlebot gets a fallback, error state, or 403 from Cloudflare/CDN bot protection.

Result: Google indexes the broken version (or nothing). You can check this with the [HTTP Debug Tool](https://datajelly.com/seo-tools/http-debug) — compare responses across different user agents.

## Solutions Compared

We covered this in depth in [Prerender vs SSR vs Edge Rendering](https://datajelly.com/blog/prerender-vs-ssr-vs-edge-rendering) , but here's the summary as it applies to indexing failures:
## Prerender (build-time)

Works for small static sites. Breaks with dynamic routes.

<100 static routes

Dynamic pages

Route explosion
### SSR (server-side)

Reliable when working. Expensive and complex.

Full HTML every request

Slow backend = partial render

Hydration mismatches
### Edge snapshot (runtime)

Bots get fully rendered HTML. Humans keep SPA.

No empty shells

No JS dependency

No app rewrite

The key difference: you stop relying on Google to render your app correctly. Instead, bots receive complete HTML snapshots, and [AI crawlers receive clean Markdown](https://datajelly.com/guides/ai-markdown-view) .

## Practical Checklist

Run these checks against your site right now. Most take under 60 seconds.
## 1. Check raw HTML size

Run `curl -s your-url | wc -c`

>20KB = good <10KB = problem <5KB = guaranteed issue
### 2. Measure visible text

Check how many words are in the raw `<body>` HTML (not after JS execution).

300–800+ words = safe <200 words = likely invisible
### 3. Inspect DOM structure

Check for real content in the initial HTML:

Bad:

<div id="root"></div>
<script src="/main.js"></script>

Good:

<h1>Your Page Title</h1>
<p>Real content here...</p>
### 4. Check resource failures

Look for JS 404s, CSS failures, 3+ resource errors. Use the [HTTP Debug Tool](https://datajelly.com/seo-tools/http-debug) to catch these.
### 5. Compare bot vs browser response

Test with normal headers vs bot headers. If the HTML differs, you have a potential indexing risk. The [Bot Test Tool](https://datajelly.com/seo-tools/bot-test) does this comparison automatically.
### 6. Check render timing

Red flags: TTFB >2s, content >5s to appear. Google often stops before your content loads.
### 7. Watch HTML stability

If HTML changes drastically between crawls — DOM drops >40–50%, text disappears — Google treats the page as unreliable and won't index it consistently.

## The Fix

If you're seeing "crawled – currently not indexed" on an SPA or JavaScript-heavy site, you have two real choices:

Rewrite to SSR

High effort. High complexity. Most teams don't finish this.

Add a visibility layer

Edge-based. No app changes. Fixes rendering at the source.
## DataJelly does exactly this:

- Edge proxy serves full HTML snapshots to search bots
- Generates AI Markdown for AI crawlers
- Leaves your React app completely unchanged
- Fixes incomplete HTML at the source — not in your codebase

[Run Visibility Test — Free](https://datajelly.com/#visibility-test) [Talk to Our Team](https://datajelly.com/contact) [Start 14-Day Free Trial](https://datajelly.com/pricing)
## Quick Test: What Do Bots Actually See?

~30 seconds

Most people guess. Don't.

Run this test and look at the actual response your site returns to bots.

1
### Fetch your page as Googlebot

Use your terminal:

`curl -A "Googlebot" https://yourdomain.com`

Look for:

- Real visible text (not just `<div id="root">`)
- Meaningful content in the HTML
- Page size (should not be tiny)

2
### Compare bot vs browser

Now test what a real browser gets:

`curl -A "Mozilla/5.0" https://yourdomain.com`

If these responses are different, Google is indexing a different page than your users see.

Stop guessing — measure it.
### Real example: 253 words vs 13,547

We see this constantly. Here's a real example from production: Googlebot saw 253 words and 2 KB of HTML. A browser saw 13,547 words and 77.5 KB. Same URL — completely different content.
[![Bot vs browser comparison showing 253 words for Googlebot vs 13,547 words for a rendered browser on the same URL](https://datajelly.com/assets/bot-comparison-proof-BSBvKXDf.png) ](https://datajelly.com/assets/bot-comparison-proof-BSBvKXDf.png)
If your HTML doesn't contain the content, Google doesn't either.
[Compare Googlebot vs browser on your site → HTTP Debug Tool](https://datajelly.com/seo-tools/http-debug)

3
### Check for common failure signals

We see this all the time in production:

- HTML under ~1KB → usually empty shell
- Visible text under ~200 characters → thin or missing content
- Missing <title> or <h1> → weak or broken page
- Large difference between bot vs browser HTML → rendering issue
### Use the DataJelly Visibility Test (Recommended)

You can run this without touching curl. It shows you:

- Raw HTML returned to bots (Googlebot, Bing, GPTBot, etc.)
- Fully rendered browser version
- Side-by-side differences in word count, HTML size, links, and content

[Run Visibility Test — Free](https://datajelly.com/#visibility-test)
### What this test tells you (no guessing)

After running this, you'll know:

- Whether your HTML is actually indexable
- Whether bots are seeing partial content
- Whether rendering is breaking in production

This is the difference between *"I think SEO is set up"* and **"I know what Google is indexing."**

If you don't understand why this happens, read: [Why Google Can't See Your SPA](https://datajelly.com/blog/why-google-cant-see-your-spa)
### If this test fails

You have three real options:

SSR

Works if you can keep it stable in production

Prerendering

Breaks with dynamic content and scale

Edge Rendering

Reflects real production output without app changes

If you do nothing, you will not rank consistently. [Learn how Edge Rendering works →](https://datajelly.com/products/edge)

This issue doesn't show up in Lighthouse. It shows up in rankings.

[Run the Test](https://datajelly.com/#visibility-test) [Ask a Question](https://datajelly.com/contact)

## Final Takeaway

"Crawled but not indexed" is a delivery failure. Not a content problem. Not a backlink problem.

If your HTML is too small, too empty, or too dependent on JavaScript — Google will crawl it forever and never index it.

Fix the HTML response first. Everything else is noise.

## Frequently Asked Questions
## Why is my page crawled but not indexed?
## What HTML size causes indexing problems?
## Does Google always render JavaScript?
## How do I verify what Google sees?
## Can JS errors cause non-indexing?
## Why does my site look fine but isn't indexed?
## What's the fastest way to fix this?
## Related Reading

[React SEO Is Broken by Default
Why React apps ship empty HTML and how to fix it.](https://datajelly.com/blog/react-seo-broken-by-default) [Why Google Can't See Your SPA
The rendering gap explained — with diagrams showing what bots actually receive.](https://datajelly.com/blog/why-google-cant-see-your-spa) [How AI Crawlers Read Your Website
AI crawlers don't render JS either. Here's what they actually see.](https://datajelly.com/blog/how-ai-crawlers-read-your-website) [Sitemap Exists But Google Ignores Pages
Why discovery ≠ indexing — and the rendering fix.](https://datajelly.com/blog/sitemap-exists-google-ignores-pages) [SPA SEO Checklist
10 things you must fix before you expect traffic from a single-page application.](https://datajelly.com/blog/spa-seo-checklist) [Prerender vs SSR vs Edge Rendering
Side-by-side comparison of what actually works for SEO in production.](https://datajelly.com/blog/prerender-vs-ssr-vs-edge-rendering) [Bot Test Tool
Compare what bots see vs what browsers render on any URL.](https://datajelly.com/seo-tools/bot-test) [HTTP Debug Tool
Compare raw vs rendered responses across different user agents.](https://datajelly.com/seo-tools/http-debug) [DataJelly Edge
How edge rendering fixes indexing without changing your app.](https://datajelly.com/products/edge) [DataJelly Guard
Automated auditing that catches rendering failures before Google does.](https://datajelly.com/products/guard)

## Structured Data (JSON-LD)
```json
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Why is my page crawled but not indexed?","acceptedAnswer":{"@type":"Answer","text":"Because Google received weak HTML \u2014 typically under 10KB with little visible text \u2014 or a broken render. Google evaluates the initial HTML response before deciding whether to invest in rendering JavaScript. If your HTML looks empty, Google often skips rendering entirely."}},{"@type":"Question","name":"What HTML size causes indexing problems?","acceptedAnswer":{"@type":"Answer","text":"Pages under ~10KB are high risk. Pages under 5KB almost never get indexed unless they come from extremely authoritative domains. If your raw HTML is mostly \u003Cscript\u003E tags with no real content, that\u0027s the problem."}},{"@type":"Question","name":"Does Google always render JavaScript?","acceptedAnswer":{"@type":"Answer","text":"No. Google uses a two-phase indexing system. Raw HTML is processed first, and JavaScript rendering is queued for later \u2014 sometimes hours or days later. If the initial HTML looks low-value, Google often skips rendering entirely."}},{"@type":"Question","name":"How do I verify what Google sees?","acceptedAnswer":{"@type":"Answer","text":"Use curl or view raw page source. If you don\u0027t see real content there, Google doesn\u0027t either. You can also use Google Search Console\u0027s URL Inspection tool to see the rendered HTML, but curl gives you the ground truth faster."}},{"@type":"Question","name":"Can JS errors cause non-indexing?","acceptedAnswer":{"@type":"Answer","text":"Yes. Failed JavaScript bundles or console errors frequently result in incomplete DOM and dropped pages. A single failed script can prevent your entire React app from mounting."}},{"@type":"Question","name":"Why does my site look fine but isn\u0027t indexed?","acceptedAnswer":{"@type":"Answer","text":"Because browsers execute JavaScript fully and retry failed requests. Google often doesn\u0027t \u2014 or fails to render completely. What you see in Chrome is not what Googlebot sees."}},{"@type":"Question","name":"What\u0027s the fastest way to fix this?","acceptedAnswer":{"@type":"Answer","text":"Serve fully rendered HTML to bots at the edge. This removes rendering risk entirely \u2014 bots get complete content without depending on JavaScript execution. No app rewrite required."}}]}
```


## Discovery & Navigation
> Semantic links for AI agent traversal.

* [DataJelly Edge](https://datajelly.com/products/edge)
* [DataJelly Guard](https://datajelly.com/products/guard)
* [Features](https://datajelly.com/#features)
* [Pricing](https://datajelly.com/pricing)
* [Visibility Test](https://datajelly.com/visibility-test)
* [Prerendering](https://datajelly.com/prerendering)
* [Prerender Alternative](https://datajelly.com/prerender-alternative)
* [Lovable SEO](https://datajelly.com/lovable-seo)
* [Visibility Layer Guide](https://datajelly.com/guides/visibility-layer)
* [How Snapshots Work](https://datajelly.com/guides/how-snapshots-work)
* [AI SEO Platform](https://datajelly.com/ai-seo-platform)
* [Bot Detection](https://datajelly.com/bot-detection)
* [Dashboard](https://dashboard.datajelly.com/)
* [SEO Tools](https://datajelly.com/seo-tools)
* [Visibility Test](https://datajelly.com/seo-tools/visibility-test)
* [Site Audit](https://datajelly.com/seo-tools/site-audit)
* [Bot Test](https://datajelly.com/seo-tools/bot-test)
* [Social Card Preview](https://datajelly.com/seo-tools/social-card-preview)
* [Robots.txt Tester](https://datajelly.com/seo-tools/robots-txt-tester)
* [Sitemap Validator](https://datajelly.com/seo-tools/sitemap-validator)
* [Structured Data Validator](https://datajelly.com/seo-tools/structured-data-validator)
* [HTTP Header Checker](https://datajelly.com/seo-tools/http-header-checker)
* [Page Speed Analyzer](https://datajelly.com/seo-tools/page-speed-analyzer)
* [SSL Certificate Checker](https://datajelly.com/seo-tools/ssl-checker)
* [DNS Records Viewer](https://datajelly.com/seo-tools/dns-records-viewer)
* [Guides](https://datajelly.com/guides)
* [Getting Started](https://datajelly.com/guides/getting-started)
* [SPA SEO Guide](https://datajelly.com/guides/spa-seo)
* [JavaScript SEO Guide](https://datajelly.com/guides/javascript-seo)
* [SSR Guide](https://datajelly.com/guides/ssr)
* [Search Engine Crawling Guide](https://datajelly.com/guides/search-engine-crawling)
* [Lovable SEO Guide](https://datajelly.com/guides/lovable-seo)
* [AI SEO Testing Guide](https://datajelly.com/guides/ai-seo)
* [SEO Testing Guide](https://datajelly.com/guides/seo-testing)
* [SERP Tracking Guide](https://datajelly.com/guides/serp-tracking)
* [Security Testing Guide](https://datajelly.com/security)
* [About Us](https://datajelly.com/about)
* [Contact](https://datajelly.com/contact)
* [Blog](https://datajelly.com/blog)
* [Terms of Service](https://datajelly.com/terms)
