Page Indexed Without Content

What the Google Search Console "Page indexed without content" status means — the page is in Google's index but Googlebot couldn't read it — and how to diagnose it. Often a server/CDN block, not just a JavaScript problem.

First published: Jun 23, 2026 · Last updated: Jul 19, 2026 · Advanced
demand #16 in Indexing#49 in How Search Works#257 in Technical SEO#347 on the site
2 evidence signals on this page

"Page indexed without content" is a Google Search Console Page Indexing status meaning the URL is in Google's index, but Googlebot couldn't read any usable content from it — Google's own docs say cloaking or an unindexable format are possible causes, and explicitly this is not the same thing as a page-level robots.txt block. It's not the same as Crawled/Discovered — currently not indexed (those aren't indexed at all). The dominant assumption is that it's a JavaScript problem; in one January 2026 case John Mueller told a user this usually means a low-level server/CDN block — often IP-based and aimed at Googlebot — that you can't reproduce with curl or a third-party crawler. Other possible causes: cloaking, an empty render, content gated behind clicks, or an unsupported format — treat these as a checklist, not a fixed order. Diagnose with URL Inspection's indexed View Crawled Page for what Google's last crawl saw (note: the live test can't directly re-test this specific status, and a valid live result doesn't guarantee indexing). If the indexed render is blank but the page looks fine in your browser, suspect a Googlebot-targeted block or accidental cloaking. Adding more words won't fix a page Google can't read.

TL;DR — “Page indexedStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. without content” means the URL is in Google’s index but GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. couldn’t read any usable content from it — distinct from Crawled/ Discovered — currently not indexed, which aren’t indexed at all, and distinct from a page-level robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere. block, which is its own separate reason. The default assumption is a JavaScript failure; in one January 2026 case, Mueller told a user this usually means a low-level server/CDN block, often IP-based and aimed at GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer., that you can’t reproduce with curl or a third-party crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index.. Other possible causes: cloaking, an empty render, click-gated content, or an unsupported format — check them as evidence-led branches, not a fixed ranking. Diagnose with URL InspectionA Google Search Console feature that reports how Google sees one specific URL on a property you own. By default it shows the last-indexed snapshot; a separate \"Test live URL\" mode fetches the current version.’s indexed View Crawled Page, keeping in mind Google explicitly lists this status among the ones the live test can’t directly re-test, and a “valid” live result isn’t proof the status has cleared.

What Google’s docs actually say

Google’s Page Indexing reportThe Google Search Console report (formerly Index Coverage) showing how many of your URLs are indexed vs. not indexed, and grouping the not-indexed ones by reason. documentation is short on this one: the page is in the index, but for some reason Google could not read the content. The doc’s own cause examples are that the page might be cloaked to Google, or might be in a format that Google can’t index — and the recommended action is to inspect the URL and look at the Coverage details. Evidence for this claim Google defines Page indexed without content as indexed even though Google could not read the content, citing cloaking or unsupported formats as examples. Scope: Google Search Console Page Indexing status; other diagnoses require inspection. Confidence: high · Verified: Google: Page indexing report (See the Official Docs and Quotes tabs for the verbatim wording and deep links.)

Two things worth being precise about, because guides on this term routinely blur both:

  • Google’s wording is “could not read the content” — it does not describe an internal “blank object” it stores. Treat “blank/empty entry” as shorthand for the reader-facing effect, not a documented mechanism.
  • This status is explicitly not the same thing as a page-level robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere. disallow — that has its own separate reason in the report. Where robots.txt does matter here is indirectly: blocking a critical resource (a JS or CSS file the page needs to render) can still leave the render empty, which is a render-branch cause, not the robots reason itself.

Keep that straight and you won’t confuse this with the “not indexed at all” statuses, or with a robots block.

Don’t assume it’s JavaScript

This is the most important correction in the whole article, so I’ll lead with it.

The reflex — and most of the guides ranking for this term — treat “indexed without content” as a renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM./JavaScript problem. John Mueller pushed back on that in one specific case. Replying on Reddit’s r/TechSEO to a user whose homepage had dropped from roughly position 1 to position 15 after this status appeared, he told them this usually means the server or CDN is blocking Google from receiving any content, and that it isn’t related to JavaScript. He added that it’s typically a fairly low-level block, sometimes based on Googlebot’s IP address — which makes it effectively impossible to test from outside the Search ConsoleA free Google service that reports how a site performs in Google Search and surfaces problems with how Google crawls, indexes, and serves it. It's first-party data straight from Google — but you don't need it to appear in results. testing tools. The affected setup was reportedly Webflow on Cloudflare, a useful concrete example of where a CDN or bot-protection default can quietly starve Googlebot. (I’m paraphrasing a relayed Reddit remark here, not quoting it — treat the framing as the takeaway from one documented case, not a measured statistic about how often each cause occurs.)

That’s the correction worth internalizing: Mueller’s “usually” describes what he saw in that one exchange, not a ranked, universal cause order. Google’s own docs don’t rank the causes either — they just name cloaking and unsupported format as possibilities. So instead of a fixed 1-through-5 list, work through these as evidence-led branches and let what Googlebot actually received point you at the right one:

  • Server / CDN / WAF response — something at the network layer is starving Googlebot of content (often IP-based, often invisible from outside). Mueller’s documented cause.
  • Client-specific serving (cloaking) — Googlebot is served different or empty content than users. This can be intentional cloaking (a spam-policy violation requiring intent to manipulate rankings) or an accidental configuration difference — don’t call the accidental version “cloaking” as if it were the policy violation; call it what it is, a serving bug.
  • Format / parser issue — the response isn’t in a format Google indexes, or the Content-Type header doesn’t match the actual content.
  • Render / resource failure — a JavaScript render that fails, times out, or depends on a blocked resource, leaving the rendered HTML empty.
  • Content gated behind interaction — content that only appears after a click or scroll Google never triggers.
  • Genuinely empty output — the page really does render to nothing.

JavaScript is one branch to check — not the default, and not automatically ranked above or below the others without evidence from your own inspection.

Why this can cost you rankings

Worth flagging the urgency: in that one reported case, the site owner said their page fell from about position 1 to position 15 — a single user’s account, not an independently verified statistic, but a plausible outcome if Google is holding an unreadable version of a page that used to rank. This isn’t a cosmetic report status to shrug off — when it shows up on a page that matters, treat it as worth investigating promptly.

The server/CDN block, in detail

The reason this cause is under-covered is that it’s hard to see. A bot-protection or WAF rule, an IP allowlist, aggressive rate-limiting, or a security default that auto-updated can decide Googlebot looks like abusive traffic and return an empty body, a challenge page, or a non-200 status — but only to Googlebot’s IPs. You, your team, and your third-party crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. all hit the page from normal IPs and see the real thing.

That’s the trap: you can’t reproduce an IP-based Googlebot block with curl or a desktop crawler. They aren’t coming from Googlebot’s IP ranges. The only place you’ll reliably see what Googlebot got is inside Search ConsoleGoogle's free tool for monitoring crawling, indexing, and search performance.’s testing tools, which fetch as Google.

If you suspect this, the move is to verify what’s actually Googlebot (reverse + forward DNS, or Google’s published IP ranges) and then check your CDN’s bot management, firewall/WAF rules, IP allowlists, and rate limits for anything that would block those ranges. The Scripts tab has the verification commands.

Before changing anything, correlate the evidence rather than guessing: pull the indexed View Crawled Page response, your CDN/WAF event logs, and your origin server logs for the same time window, and look for a request ID, client category, and the specific rule or rate limit that denied the request. Then change only the narrowest route, client category, or rule you’ve actually confirmed is responsible — with a security review before you ship it. Broadly allowlisting all of Google’s published IP ranges isn’t something the reviewed sources support as a safe default; it widens your attack surface for a problem that’s usually one misconfigured rule. After the change, watch for confirmed Googlebot requests returning a full response in your logs, then re-check the indexed report on a later crawl — Google doesn’t publish a fixed re-crawl schedule, so this is a “keep checking,” not a “check back on day X,” situation.

The rendering / JavaScript cause (when it is JS)

When the cause genuinely is renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM., the mechanism is straightforward: Google crawls the raw HTML, then a headless Chromium renders the page and runs its JavaScript. Google can only index what ends up in the rendered HTML. If your content is client-side rendered and that render fails, errors out, times out, or depends on a request that Google doesn’t make, the rendered HTML can come back empty — and you get indexed without content.

A specific flavor worth calling out: content gated behind interaction. I’ve written before in my JavaScript SEO guide that elements which only load content when clicked are a problem — Google doesn’t click, so it doesn’t see that content. Same with content that only appears on scroll or after a user action. If your main content needs a tap to exist, assume Google doesn’t have it.

The fix for the JS cause is the usual rendering playbook — server-side rendering or prerendering, making sure content is in the rendered HTML, and exposing navigation through real <a href> links rather than click-only handlers. (Full treatment in JavaScript SEO.)

Diagnosing it: URL Inspection is the whole game

There’s really one diagnostic that matters here, and it’s URL Inspection — but it has two different data sources, and mixing them up leads people to wrong conclusions. Google separates indexed data (what its last indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. crawl saw) from a live test (Google-InspectionTool fetching the URL right now), and they don’t answer the same question:

Indexed dataLive test
What it showsThe rendered HTML, HTTP response, and page resources from Google’s last indexed crawl — the record behind the status you’re seeingWhether Google-InspectionTool can currently reach the page, plus a fresh screenshot
Screenshot available?Not for the indexed viewYes — screenshots are live-test only
Can it test this status?This is the record the status describesNo — Google explicitly lists “Page indexed without contentA Google Search Console status meaning the URL is in Google's index, but Googlebot couldn't read any usable content from it — possible causes include a server/CDN block, cloaking, an empty render, or an unsupported format. Not the same as a page-level robots.txt block.” among the conditions the live test can’t directly re-test
Does a “valid” result mean it’s fixed?N/ANo — a valid live result only means the page is currently reachable to Google’s tester, not that it’s indexed or that the status has cleared

So the actual workflow:

  1. View Crawled Page (indexed data). Read the rendered HTML, HTTP response, and page resources tied to the status — this is what Googlebot’s indexing crawl actually got. Availability of each piece can vary by status; if some fields aren’t shown, that itself is diagnostic (a blocked or non-200 response often shows less than a normal render).
  2. Compare it to your own browser. If the indexed render is blank or stripped but the live page is full in your browser, you’re looking at a block or client-specific serving, not a missing-content problem.
  3. Run Test Live URL anyway, but read it correctly. It won’t directly confirm this status has cleared, but it’s still useful: if the live test itself fails or flags an access problem, that’s real evidence; if it comes back “valid,” treat that as “currently reachable,” not “fixed.” Evidence for this claim URL Inspection can show Google's indexed/crawled information and supports a live test for the current accessible version. Scope: Google Search Console URL Inspection; live test results can differ from the indexed version. Confidence: high · Verified: Google: URL Inspection tool
  4. Read the response and resources. A non-200 status, a challenge/interstitial, or blocked critical resources (JS/CSS the page needs) all point at the cause.

Because IP-based blocks won’t show up from outside, don’t trust an external curl or crawler to clear the page — the Search Console tools are the only thing fetching as Google, and even they need the indexed data, not just the live test, to speak to this specific status.

Telling the causes apart

A quick reference for statuses and causes people conflate with this one:

If you see…It means…Not this status because…
Page-level robots.txt disallowThe URL itself is blocked from crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. — a separate report reasonGoogle’s docs explicitly exclude a page-level robots block from this status
Blocked critical resource (JS/CSS) via robots.txtThe page can be crawled, but a resource it needs to render is blockedThis is a render-branch cause, not the robots reason itself — fix by unblocking the resource
401 or 403 responseReal, dedicated Page Indexing reasons of their ownDistinct statuses in the report, not this one
Browser-only barrier (cookie wall, consent gate, geoGenerative Engine Optimization — visibility inside AI answer engines. rule, login) that returns 200A content difference between what a browser session sees and what Google’s request seesNo real 401/403 was returned, so it won’t show under those reasons — diagnose it as client-specific serving
Intentional different content for bots vs. users, meant to manipulate rankingsCloaking under Google’s spam policy — a policy violationRequires manipulative intent; an accidental empty response to Googlebot is a configuration bug, not proof of a spam violation
Unsupported file type or wrong Content-Type headerA format/parser issueGoogle determines file type mainly from the response header, not just the extension

The myths to drop

  • “Add 600 words and it’ll fix itself.” Word count is a thin-content/quality issue. If Google received no content, adding words to a page it can’t read changes nothing.
  • “It’s a JavaScript problem.” Sometimes — but per Mueller it’s usually a server/CDN block, not JavaScript. Don’t start there.
  • “I can reproduce it with curl.” Not if it’s an IP-based block on Googlebot.
  • “It’s the same as Crawled/Discovered — currently not indexed.” No — those aren’t indexed at all; this one is.
  • “Just hit Request Indexing.” Re-indexing without fixing the underlying block or render just re-confirms an empty page.

After you fix it

Once View Crawled Page shows real content again, use the report’s Validate Fix flow and/or Request Indexing to prompt a re-crawl, then re-inspect to confirm the render now contains your content. Validation without a fix just bounces.

Where this sits

This is one status in the Page Indexing reportThe Google Search Console report (formerly Index Coverage) showing how many of your URLs are indexed vs. not indexed, and grouping the not-indexed ones by reason., which sits inside Google’s broader indexing stage (crawl → render → index → serve). The sibling statuses in that report — the “currently not indexed” pair, duplicate/canonical statuses, and the blocked/error statuses — each fail at a different point in the pipeline. For the rendering mechanics behind the JS cause, see rendering and JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript.; for how the report as a whole works, see the Page Indexing report hub.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.