RGM-203 · SEO Mastery · Module 2 of 8

Crawl, Indexation & Rendering

Three sequential gates stand between every URL and a ranking: crawl, render, index. On popular sites, 16% of valuable pages never make it through the last one. This module is the diagnostic discipline for all three — log files, the two-wave rendering model, every “why pages aren’t indexed” status decoded, and the instruments we use to find out exactly where your pages are dying.

What you will learn12 sections
GATE 1CRAWLfetch the bytesGATE 2RENDERexecute, second passGATE 3INDEXa decision, not a default

The three sequential gates

Search visibility is gated by three sequential processes: crawl (Google's bots discover and fetch your pages), render (Google's renderer processes the fetched page including JS), index (Google decides whether to store the rendered page in its searchable index). If any gate fails, the page can't rank no matter how good the content is or how many links it has.

This module is for the diagnostic and remediation work behind those three gates. The Technical SEO Foundations module covers the artifacts (robots.txt, sitemaps, canonicals); this module covers the systems and the diagnostic discipline.

By the numbers The attrition is real — and measurable
What actually survives the pipeline
16%
of valuable, indexable pages on popular sites never get indexed at all (Onely / Tomek Rudzki).
96.55%
of pages get zero Google traffic — Ahrefs, across 14 billion pages. Indexed ≠ visited.
2 MB
of HTML is all Googlebot processes for indexing per page (15 MB infra default; 64 MB PDFs).
longer for Google to crawl JS-dependent content than plain HTML; render median ~5s, queue lag up to weeks.

Sources: Onely indexing research · Ahrefs search traffic study · Google — Inside Googlebot (2026) · Onely rendering queue.

Crawl budget

Crawl budget = the number of URLs Googlebot can and wants to crawl on your site in a given period. It has two components:

For sites under ~10k URLs, crawl budget is rarely a concern — Google can crawl everything quickly. For sites with 100k+ URLs, crawl budget becomes a real constraint. For sites with millions of URLs (ecommerce, news, classifieds), crawl budget management is one of the highest-leverage SEO disciplines.

Symptoms of crawl budget problems

Common crawl budget wasters

Anatomy of waste Where crawl budget actually goes on an unaudited large site
Typical fetch distribution before cleanup — RGM analysis from client log audits
Faceted params
38%
Redirect chains
14%
Soft 404s / thin
11%
Internal search
9%
Real, canonical pages
28%

Directional pattern, labeled RGM analysis — your logs will draw your own version. The point survives every audit we run: most unaudited large sites spend under a third of Googlebot’s attention on pages that matter.

RGM EXPERT TRICK
Prune with 410, not 404 — and bank the reclaimed crawl

When we prune dead sections, we return 410 Gone, not 404. Google treats 410 as a firmer signal: pages drop faster and Googlebot stops re-fetching sooner.

Then we read the dividend in the logs. Within two or three weeks the fetches that used to burn on the graveyard shift to live templates — we screenshot the before/after and put it in the client deck.

noindex for pruning is the rookie move: it requires Google to keep crawling the page to keep seeing the tag. You pay crawl budget forever for a page you killed.

WHY IT’S RARE · Most platforms only emit 404s, so nobody asks for the 410 — and nobody measures pruning in reclaimed fetches.

URL discovery and prioritization

Google discovers URLs through:

  1. Following links from already-crawled pages (the primary mechanism).
  2. XML sitemaps you submit.
  3. The IndexNow protocol (Bing-led; Google doesn't use yet).
  4. External signals: links from other sites, mentions on social.
  5. Direct URL submission (Search Console, but limited per-day).

Google prioritizes which URLs to crawl based on perceived importance: link equity, freshness signals, sitemap inclusion, recent updates. URLs that have been crawled and found low-value get re-crawled less often.

Log file analysis: the diagnostic that exposes everything

Server access logs record every request Googlebot makes. They show: which URLs were crawled, when, how often, what status code Google saw, what the response time was. No other data source gives you this level of ground truth.

What to look for in log analysis

Tools for log analysis

Read the raw truth One log line, decoded
Every Googlebot visit leaves this fingerprint — learn to read it at a glance
66.249.66.1 - - [10/Jun/2026:04:12:33 +0000] "GET /products/blue-widget?color=blue&sort=price HTTP/1.1" 200 48733 312ms "Mozilla/5.0 ... Googlebot/2.1; +http://www.google.com/bot.html"
66.249.66.1 - - [10/Jun/2026:04:12:41 +0000] "GET /old-category/ HTTP/1.1" 301 0 95ms "... Googlebot/2.1 ..."
66.249.66.1 - - [10/Jun/2026:04:12:48 +0000] "GET /products/blue-widget?sessionid=8f3a HTTP/1.1" 200 48733 301ms "... Googlebot/2.1 ..."
IP — verify it is really Google (reverse DNS)URL — is this a page you care about?Status — what Google saw, at scaleResponse time — slow to bots = crawled less

Line 1 and line 3 are the same product fetched twice via different parameters — that is crawl waste with a timestamp on it. Line 2 is a redirect Googlebot keeps paying for. Three lines in, you already have two remediation tickets.

Rendering deep dive

Google's rendering happens in two passes:

  1. First pass: Googlebot fetches the HTML response. Initial indexing happens based on this HTML alone.
  2. Second pass: The Web Rendering Service (WRS) executes JavaScript and renders the full DOM. Index is updated with rendered content.

The second pass can lag the first by hours to weeks depending on render queue length. For JS-rendered content, this means a page can be partially indexed (HTML-only) for an extended period before the rendered version is incorporated.

What the WRS supports and doesn't

What breaks rendering

WAVE 1Raw HTMLindexed in minutes-hoursINDEXFirst versionwhat your HTML saysWAVE 2WRS rendermedian ~5s, queue variesUPDATERendered DOMwhat your JS addedTHE RISKAnything only in Wave 2competes late — or never, if rendering breaks
Even though Googlebot can render JavaScript, we don’t want to rely on that.
Martin Splitt, Google Search Relations — JavaScript rendering Q&A, Botify
Cautionary case · Hulu.com · the JS bet that went wrong
-56%search visibility404served to Googlebot200served to users

Hulu moved to client-side JavaScript rendering and its search visibility dropped by more than half. The widely cited diagnosis: rendering errors meant Googlebot was effectively seeing 404s on pages that returned 200 to humans — the site looked alive to users and dead to the crawler. Nobody noticed for weeks because every dashboard the team watched measured humans, not bots. The lesson this module keeps repeating: monitor what Googlebot experiences, not what your browser shows you. (LinkResearchTools / Elephate-Onely case write-up)

RGM EXPERT TRICK
The JS-off diff crawl: find rendering debt in ten minutes

We crawl every new client twice in Screaming Frog: once with JavaScript rendering on, once off. Then we diff word count and internal link count per template.

Any template losing more than ~20% of its words or links with JS off goes straight onto the SSR candidate list. No waiting for Google, no arguing with feelings — a spreadsheet decides.

The same diff catches the quiet killers: client-side canonical rewrites and meta-robots tags injected by JS, which Wave 1 never sees.

WHY IT’S RARE · Teams test rendering by eyeballing one page in URL Inspection. The per-template diff turns an anecdote into an inventory.

JS framework patterns

FrameworkSEO-recommended pattern
Next.jsSSG (getStaticProps) for marketing content; ISR for refreshable pages; SSR (getServerSideProps) for dynamic data. Avoid pure CSR for indexable pages.
NuxtUniversal mode (SSR) or static generation. Avoid SPA mode for indexable content.
RemixAlways server-rendered by design; SEO-friendly out of the box.
SvelteKitSSR or prerendering. Avoid client-only routes for SEO content.
AstroStatic-first with islands of interactivity. SEO-friendly.
React (CRA)Add prerendering (Prerender.io) or migrate to Next.js for SEO content.
Vue (no framework)Add server-side rendering or static generation; consider Nuxt.
AngularUse Angular Universal for SSR.
Interactive Pick your stack — get the SEO-safe pattern
Eight stacks, eight verdicts
Next.js · verdict: excellent — choose the right mode per template

SSG for marketing pages, ISR for refreshable catalogs, SSR for truly dynamic data. The trap is shipping indexable templates in pure client mode because the default felt fine in dev.

Nuxt · verdict: excellent in universal mode

Universal (SSR) mode or full static generation. SPA mode for anything indexable is the classic Nuxt mistake — it quietly turns your content site into a rendering-queue gamble.

Remix · verdict: SEO-friendly by design

Server-rendered by architecture; there is no client-only escape hatch to misuse. Your remaining risks are ordinary ones: canonicals, status codes, and redirects.

SvelteKit · verdict: good — prerender what you can

SSR by default with per-route prerendering. Watch for client-only load functions on indexable routes and verify with the JS-off diff crawl.

Astro · verdict: excellent for content

Static-first islands architecture: HTML ships complete, interactivity hydrates per component. For content-heavy sites this is the lowest-risk modern stack on the board.

React (CRA / bare SPA) · verdict: liability for indexable content

Pure client rendering: empty shell, render-queue dependency, invisible to AI crawlers. Migrate indexable routes to Next.js or add prerendering as a bridge — and treat the bridge as debt.

Vue (bare SPA) · verdict: same liability, Vue flavor

Identical failure mode to bare React. Nuxt universal mode is the standard exit; prerendering services are the temporary patch.

Angular · verdict: fine with Universal, risky without

Angular Universal provides SSR; without it you are betting your revenue pages on the second wave. Hybrid rendering per route landed in recent versions — use it.

Indexation controls

MechanismEffectWhen to use
robots.txt DisallowBlocks crawling. Page may still be indexed without content if linked externally.Block crawl budget waste, never sole indexation control.
meta robots noindexAllows crawling, blocks indexing. Most reliable indexation control.Thin content, duplicates, internal pages.
X-Robots-Tag noindexHTTP-header version of noindex. Works for non-HTML resources.PDFs, images, downloadable files you don't want indexed.
Canonical tagHints to Google which version is preferred among duplicates.Cross-protocol, parameter variations, syndicated content.
301 redirectPermanent move; passes link equity.URL changes, consolidating duplicate pages.
404 / 410Removes page from index over time.Deleted content. 410 is faster than 404 for removal.
Search Console Remove URLsTemporary 6-month removal.Emergency removals (PII leak, accidental sensitive page indexed).
Speed of removal How fast each mechanism gets a page out of the index
Relative de-indexing speed — RGM analysis from remediation projects
Removals tool
hours (temporary)
410 Gone
days
404
days-weeks
noindex
next recrawl+
robots.txt alone
may never

The Removals tool hides for ~6 months while you fix the real signal — it is an emergency brake, not a removal. robots.txt alone can leave a ghost listing indexed forever. Pair the brake with 410/noindex so the temporary becomes permanent.

Monitoring indexation health

Decoder “Why pages aren’t indexed” — every status, what it really means, what to do
The eight statuses you will actually meet — tap each one
Google knows the URL, never fetched itCRAWL DEMAND

Google found the URL (links, sitemap) but decided fetching it was not worth the trip yet. At scale this is a crawl-demand verdict: weak internal links, weak perceived value, or a crawl budget spent elsewhere.

THE FIX · Strengthen internal links from high-crawl pages, confirm the template is in a segmented sitemap, and reduce waste so demand concentrates. Mass “request indexing” does not move this.
Google fetched it and declined to keep itQUALITY VERDICT

The most misread status in Search Console. Google spent the fetch, evaluated the page, and chose not to index it. This is feedback about the page, not a bug in the pipeline.

THE FIX · Sample 20 affected URLs and bucket them: thin, duplicative, or orphaned. Prune, consolidate, or differentiate — then watch the bucket shrink over 4-8 weeks.
You forgot to declare a preferenceCANONICAL GAP

Google found near-identical pages and no canonical to arbitrate, so it picked one to fold the rest into. Sometimes its pick is fine; sometimes your money URL just got consolidated into a parameter variant.

THE FIX · Add self-referencing canonicals on the preferred version and canonical-to-parent on variants. Verify with URL Inspection: declared and Google-selected should match.
You declared, Google disagreedSIGNAL CONFLICT

You set a canonical and Google overrode it — which means your other signals (internal links, sitemaps, redirects, content similarity) point somewhere else. Google believes your site more than your tag.

THE FIX · Audit the contradiction: which URL do internal links use? Which is in the sitemap? Align every signal on one URL and Google usually concedes within a few crawls.
Working exactly as designedNO ACTION

The page canonicals to another URL and Google agrees. Faceted variants, print pages, UTM-tagged duplicates — this is the system doing its job.

THE FIX · Nothing. Spend your attention on statuses 02 and 04. Treating this bucket as a problem is how teams burn weeks on non-issues.
You asked Google not to index itVERIFY INTENT

Indexing is blocked by your own meta robots or X-Robots-Tag. Fine if intentional — catastrophic if a staging flag shipped to production, which we have seen take out entire template families.

THE FIX · Diff the noindexed list against your intended exclusions every month. Anything unexpected is a sev-1: find the tag source (template, CMS plugin, JS injection) and ship the fix same-day.
Returns 200 but Google read “empty”PHANTOM PAGE

The server says success; the content says nothing. Empty category pages, JS shells that never painted, “0 results” pages — Google classifies them as soft 404s and drops them.

THE FIX · Make empties honest: return a real 404/410, or fill the page (related items, content). For JS shells, this status is your rendering failure alarm — run the JS-off diff crawl.
Blocked from crawling — not from indexingWRONG TOOL?

robots.txt stops the fetch, not the listing. If the block is intentional waste control, good. If you meant to deindex, the page can linger as a ghost listing — Google can never see your noindex.

THE FIX · For waste control: leave it. For removal: unblock, serve noindex or 410, wait for the drop, then re-block if needed. Sequence matters.
Calculator Your indexation rate — the one KPI this module reports to
Two numbers from the Pages report → a verdict
80%indexed
AT THE HEALTHY LINE

Thresholds are RGM analysis: ≥90% strong · 80–89% watch · 60–79% structural problem · <60% systemic. Context from Google: indexing 100% never happens — see the quote below. Segment sitemaps by template to see WHERE the gap lives.

It’s completely normal that we don’t index everything off of the website… it’s never going to be the case that we index 100% of everything that’s on a website.
John Mueller, Google Search Advocate — Google SEO office hours, via Search Engine Journal
RGM EXPERT TRICK
Sitemaps as instrumentation, not navigation

Google does not need your sitemap to find pages on a well-linked site. So we stopped treating sitemaps as discovery and started treating them as measurement.

We split them by template and age cohort: products-2026.xml, products-legacy.xml, articles-2026.xml. The Pages report then shows indexation rate per segment — a per-template health dashboard Google maintains for free.

When articles-2026 indexes at 96% and products-legacy at 41%, the roadmap writes itself. One number per sitemap tells us which template Google dislikes this month.

WHY IT’S RARE · Most sites ship one monolithic sitemap, so their indexation rate is a site-wide average that diagnoses nothing.

The deprecation graveyard: crutches Google took away

Half of the crawl-control advice still circulating on the internet references tools that no longer exist. Google has spent seven years removing every manual override and replacing them with one answer: fix your architecture. If a playbook you inherit mentions any of these, you are reading archaeology — tap each headstone for what replaced it.

Interactive Five retired controls — and what replaced each
RIP: the manual-override era, 2019–2024
rel=prev/next † — pagination hints

Google admitted it had ignored the markup “for years” before announcing the deprecation. Replaced by: self-referencing canonicals per paginated page and real internal links from page one. The lesson that aged best: Google drops signals quietly and tells you later.

URL Parameters tool † — Search Console

Retired April 26, 2022; Google said only ~1% of stored configurations were even useful for crawling. Replaced by: canonicalization, robots rules, and not generating junk parameter URLs in the first place.

Sitemaps ping endpoint †

The “ping Google when the sitemap changes” endpoint went away. Replaced by: accurate lastmod values — which Google now actually reads, making sitemap honesty a feature.

Crawl-rate limiter † — Search Console

Removed January 8, 2024, after a decade. Crawl rate is now fully automatic, set by how fast your server responds. Replaced by: server performance — the only crawl-rate lever left is being fast.

cache: operator † — Google Search

The cache view died in 2024; Google now points to the Wayback Machine instead. Replaced by: URL Inspection’s rendered HTML — the only remaining way to see a page through Google’s eyes.

Sources: Yoast on rel=prev/next · Google — URL Parameters tool · Google — sitemaps ping retirement · Google — crawl limiter goodbye · Search Engine Land — cache retired.

Advanced playbook

Step by step The 10-minute “why isn’t this page indexed?” decision path
Run the gates in order — stop at the first failure
  1. URL Inspection first. Always.One lookup answers five questions: known? crawled? indexed? which canonical did Google choose? what did the rendered HTML contain?
  2. Gate 1 — can it be fetched?Check robots.txt for the path, then the status code Googlebot sees (curl with a Googlebot UA). A 200 for you can be a 404 for the bot — ask Hulu.
  3. Gate 2 — does the content survive rendering?Compare raw HTML to the Inspection tool’s rendered HTML. Headline, body, links present in both? If only in rendered, you are betting on Wave 2.
  4. Gate 3 — is indexing blocked or redirected?noindex (meta or header)? Canonical pointing away — and does Google’s selected canonical match yours? Misalignment = your other signals disagree.
  5. Check crawl demand.How many internal links point here, from where, how deep is it? An orphan at depth 6 is not unindexed — it is unloved.
  6. Check the quality verdict.If it was crawled and declined, compare it honestly against what already ranks. Thin, duplicative, or templated pages do not need a fix — they need a reason to exist.
  7. Fix the failed gate, then re-request once.One re-index request after a real fix is signal. Ten requests without a fix is noise Google learned to ignore years ago.

Common mistakes

Operating checklist — score yourself

The operating checklist — tick what is true today
Pipeline discipline, scored. Progress saves on this device.0/14
CASE-method test

Prove it. Earn your passcode.

Ten questions, CASE method (Context · Analysis · Strategy · Execution). Pass at 90% to unlock this module’s completion passcode — retake as many times as you like.