You published 400 pages. Search Console reports 140 as indexed. The other 260 are sitting in the “Pages” report under statuses nobody on your team can explain, and every one of them earns zero impressions, zero clicks and zero pipeline no matter how much you spent producing it.
Indexation failure is one of the few SEO problems where the cost is binary. A page that is not in the index cannot rank, cannot be cited, and cannot convert organic traffic. The good news is that the causes are finite and diagnosable. This guide walks through nine of them, grouped by the layer where they break: server and architecture, rendering, and content quality. For each, you get the symptom, the check, and the fix.
Discovered Currently Not Indexed vs. Crawled Currently Not Indexed: The Critical Distinction
Most teams treat these two Search Console statuses as the same problem. They are not, and fixing the wrong one wastes weeks.
| Status | What it means | Where the problem usually lives | First move |
|---|---|---|---|
| Discovered – currently not indexed | Google knows the URL exists (sitemap or link) but has not fetched it yet | Crawl priority, server capacity, internal linking, perceived site quality | Fix access and priority |
| Crawled – currently not indexed | Google fetched the page, evaluated it and chose not to index it | Content value, duplication, rendering output | Fix value and rendered content |
A simple rule: Discovered means Google has not spent the resources to look. Crawled means Google looked and was not convinced. The first is mostly an architecture problem. The second is mostly a content or rendering problem.
Two neighbouring statuses are worth separating as well. “Duplicate without user-selected canonical” and “Alternate page with proper canonical tag” are canonicalization outcomes, not crawl failures, so treat them as a consolidation question. For the wider framework of how crawling, rendering, indexing and the other technical systems interact, see our complete technical SEO guide.
Reason 1 to 3: Server and Architectural Blockers
Reason 1: Header Responses and Directive Conflicts
This is the cheapest cause to rule out and the most embarrassing to find. Common patterns:
- A staging
noindexdirective that shipped to production in a deployment. - An
X-Robots-Tag: noindexheader set at the CDN, server or framework level, which never appears in the page source. - A canonical tag pointing to a different URL (often the homepage, or a pre-migration path).
- Intermittent 5xx or 429 responses under load, which cause Google to slow crawling of the host.
Check the response headers, not just the HTML:
curl -sI https://example.com/your-page/ | grep -iE "HTTP/|x-robots-tag|link:|location"
Then check the HTML directives:
curl -s https://example.com/your-page/ | grep -iE "<meta name=\"robots\"|rel=\"canonical\""
Two robots.txt facts that trip up experienced teams. First, Google stopped supporting a noindex rule inside robots.txt in 2019, so that file cannot de-index or protect anything. Second, if a URL is blocked in robots.txt, Google cannot fetch the page to see an on-page noindex, so a blocked URL can stay known to Google while its content is never evaluated. Choose one mechanism per URL and make sure they do not contradict each other.
Fix: remove the unintended directive at its source (template, header rule, CDN config), confirm a clean 200 response, then validate in Search Console.
Reason 2: Crawl Waste and Low-Value URL Inventory
Crawl budget is not a concern for most small sites. Google’s own guidance frames it as relevant mainly to very large sites (on the order of a million pages) or sites with tens of thousands of frequently changing pages. I am citing those thresholds from memory, so verify them against Google’s current crawl budget documentation before using them in a client conversation. If your site is small and still shows “Discovered” URLs, the cause is more likely quality or linking than budget.
Where crawl waste is real, it usually comes from these sources:
- XML sitemaps that list redirected, non-canonical, noindexed or 404 URLs. This teaches Google to distrust the sitemap.
- Redirect chains (A to B to C) that burn requests before reaching content.
- Orphan pages that exist in the sitemap but have no internal links pointing to them.
- Soft 404s: pages that return a 200 status but display “not found” or empty-state content.
Run a Screaming Frog crawl and compare three lists: URLs in the sitemap, URLs reachable by internal links, and URLs indexed in Search Console. The gaps between them are your diagnosis.
Fix: make the sitemap contain only indexable, canonical, 200-status URLs; collapse redirect chains to single hops; link every priority page from at least one crawlable, relevant parent page; return real 404 or 410 codes for removed content.
Reason 3: Parameter Traps and Faceted Navigation Loops
Filters, sorting, session IDs, tracking parameters and calendar widgets can generate effectively unlimited URL combinations from a few hundred real pages. Google spends its crawl effort on the noise and your real pages wait in the “Discovered” queue.
An example of a trap: /shoes/?color=red&size=9&sort=price&page=3 and /shoes/?size=9&color=red&page=3&sort=price are different URLs that show the same products. Add four more filters and the combinations multiply quickly.
A starting point for parameters that carry no unique content:
User-agent: *
Disallow: /*?sessionid=
Disallow: /*?sort=
Disallow: /*&sort=
Treat that as an illustration, not a copy-paste rule. Disallowing the wrong pattern can block pages you want indexed, so test any change against real URLs first. Note also that the old URL Parameters tool in Search Console was retired in 2022, so you can no longer rely on it for this.
Better long-term fixes are structural: canonicalize filtered URLs to the clean category, generate internal links only to the clean version, and keep genuinely valuable filter combinations (for example, a high-demand “color + category” page) as intentional, indexable landing pages with unique copy. For how canonicals, redirects and duplication interact, see our breakdown of duplicate content and why it can hurt rankings without a penalty.
Reason 4 to 6: Rendering and JavaScript Bottlenecks
Reason 4: Client-Side Rendering Without Server-Rendered HTML
If your raw HTML response is an empty application shell, indexing depends entirely on Google’s rendering queue succeeding, on every page, every time.
<!-- What the server returns -->
<body>
<div id="root"></div>
<script src="/static/bundle.js"></script>
</body>
Compare that against the rendered DOM in Chrome DevTools (Elements panel, after load). If your headings, body copy, internal links and canonical only exist in the second version, you are placing a bet on rendering.
The usual fix is moving critical content to server-side rendering or static generation, so the first HTML response already contains the content, links and metadata. This is the point where engineering involvement is unavoidable.
Reason 5: Content and Links Googlebot Cannot Reach
Google follows links, not clicks. Navigation built from elements with JavaScript handlers instead of real anchors is invisible as a crawl path:
<!-- Not crawlable as a link -->
<span onclick="router.push('/pricing')">Pricing</span>
<!-- Crawlable -->
<a href="/pricing">Pricing</a>
The same applies to content that loads only after a click, a tab change or an “infinite scroll” trigger with no paginated URL fallback. Pages reachable only through those interactions often end up undiscovered, or discovered but deprioritized.
Fix: use real <a href> links for all navigation and pagination, and make sure each indexable item has its own stable URL.
Reason 6: Render Failures, Blocked Resources and False 200s
Three failure modes that look fine to a human visitor:
- JavaScript, CSS or API endpoints blocked in robots.txt, so Google renders a broken or empty page.
- Runtime errors that stop rendering partway through, leaving partial content.
- Single-page-app routing that returns HTTP 200 for non-existent URLs and renders a “not found” message client-side, creating soft 404s at scale.
Also check for directive changes between raw and rendered HTML. As I understand Google’s documentation, a noindex in the original HTML can lead Google to skip rendering, so a script that tries to remove it later may never get the chance to run. Verify this behaviour in Google’s current JavaScript SEO documentation before relying on it.
For rendering-level troubleshooting, use the URL Inspection tool’s live test and view the rendered HTML and screenshot. If they differ materially from what you see in a browser, you have found the issue.
Reason 7 to 9: Content Quality and Entity Thresholds
Google has been clear that it does not index everything it crawls. When a page is technically accessible and still reported as “Crawled – currently not indexed,” the diagnosis shifts from access to value.
Reason 7: Thin, Templated or Near-Duplicate Pages
Programmatic pages with the same template and a swapped city, product or keyword are the classic case. If the unique content is a few lines surrounded by identical boilerplate, Google can reasonably treat them as redundant. Audit a sample of unindexed URLs side by side: if you can describe two of them with the same sentence, one of them probably does not need to exist.
Fix: consolidate overlapping pages, add genuinely distinct data or analysis to the ones that justify existing, and noindex or remove the rest.
Reason 8: No Information Gain Over Pages Already in the Index
A well-written page can still be skipped if it restates what dozens of indexed pages already say. Before investing in a page, look at the top results for its target query and answer one question: what does this page contain that those do not (original data, a tool, a framework, first-hand experience)? If the answer is nothing, expect the page to stay out or to drift in and out of the index.
Fix: add something that is only on your page, strengthen internal links to it from relevant, already-indexed pages, and request a recrawl once it is materially different.
Reason 9: Weak Site-Level and Entity Trust
New domains, sites with no external references, and sites that have recently published a large volume of low-value pages often see slow and selective indexing. Google has said site-wide quality signals can influence how it treats content across a site, though it does not publish the thresholds, so treat any specific number you read online with caution.
Practical signals that help: a clear organization identity (consistent name, About page, authorship), accurate structured data, mentions and links from credible third-party sources, and a publishing history that favours quality over volume. Pruning or consolidating weak pages is often more effective than adding more.
Inspecting URLs with Google Search Console and Log File Verification
Use this decision flow for any single URL that should be indexed but is not:
Start: URL Inspection in Search Console
│
├─ "URL is on Google"? → Indexed. Check you searched the right canonical.
│
├─ "Blocked by robots.txt" or "Excluded by noindex"?
│ → Reason 1. Fix the directive at source.
│
├─ "Page with redirect" / "Not found (404)" / "Soft 404"?
│ → Reason 2 or 6. Fix status codes and sitemap.
│
├─ "Alternate page with proper canonical" / "Duplicate"?
│ → Reason 3 or 7. Canonical decision: consolidate or differentiate.
│
├─ "Discovered – currently not indexed"?
│ → Check internal links, sitemap, crawl waste (Reasons 2, 3, 5), server health.
│
└─ "Crawled – currently not indexed"?
→ Run Live Test, compare rendered HTML to browser.
├─ Content missing in render → Reasons 4 to 6
└─ Content present and accessible → Reasons 7 to 9
A few operational notes. “Request indexing” in URL Inspection has limited quota and does not fix underlying causes, so use it after a fix, not as the fix. Always compare the “Live Test” result against the indexed version, because a difference tells you what changed or what Google sees differently.
Log file verification. Search Console samples and delays data. Server logs show what Googlebot actually requested. A quick status-code breakdown for Googlebot requests (adjust the field number to your log format):
grep "Googlebot" access.log | awk '{print $9}' | sort | uniq -c | sort -rn
Spoofed user agents are common, so verify suspicious IPs with a reverse DNS lookup (host <ip>) and confirm the hostname resolves to a Google domain such as googlebot.com. Then look for patterns: are priority URLs never requested, are parameter URLs dominating requests, is Googlebot hitting redirects and 404s more than real pages? Those answers tell you whether you have a crawl-path problem or a content-value problem.
When Indexation Failures Require a Technical SEO Specialist to Re-Architect Crawl Paths
Everything above can be diagnosed in-house with Search Console, a crawler and access to server logs. Many teams fix Reasons 1 and 2 in an afternoon.
The cases that stall are the ones where several causes overlap: a JavaScript front end generating parameter URLs that fall into soft 404s, with an inconsistent canonical setup and a sitemap built from a different data source. Fixing one layer exposes the next, and each change needs engineering time, validation and re-crawling.
That is the point where a technical SEO specialist for indexation and crawl architecture earns the cost: reading logs against crawl data, translating findings into developer-ready tickets, and sequencing fixes so you are not re-testing the same pages for months. If you are not sure whether the problem is technical, editorial or both, an independent SEO audit is a clean way to establish the root cause before committing engineering time.
For most teams, the practical order is: confirm the status in Search Console, rule out directives and status codes, check the rendered HTML, then evaluate content value. Work in that order and you will find the cause faster than by starting with content rewrites.