Home/Technical SEO / Crawling / Crawlability Audit
Crawlability Audit: How to Find and Fix Technical SEO Issues
By Mousume Akter · Published September 12, 2026
A crawlability audit is the process of confirming that search engine and AI crawlers can fetch, discover, and follow links through the pages you want indexed — and pinpointing exactly where that access breaks down when it doesn’t. This is the step-by-step audit process. If you need the underlying concepts first, start with SEORAF’s crawlability overview.
This article builds on the fundamentals in SEORAF’s Crawling hub and turns them into a complete, practical audit methodology — not a definitions glossary. It walks through defining scope, collecting evidence from multiple independent sources, checking each access layer in order, diagnosing conflicting signals, fixing what’s broken, and confirming the fix worked.
A Diagnostic Sequence for Telling Crawlability and Indexability Apart
Crawlability is whether a bot can fetch a URL at all. Indexability is whether a successfully fetched page is eligible to be indexed. A page can pass one gate and fail the other — the crawlability overview covers why that distinction exists. When a page isn’t performing in search, work through these questions in order, stopping as soon as one applies:

- Can the page be fetched at all? Test it directly (Step 3 below). If not, this is a crawlability problem at the access layer — nothing downstream matters until it’s fixed.
- Is it blocked in robots.txt? Also a crawlability problem, just a pre-fetch mechanism.
- Does it fetch cleanly but carry a noindex directive (meta robots or X-Robots-Tag)? This is an indexability problem — the page was crawled, then excluded afterward.
- None of the above, and still missing from the index? The cause likely sits outside crawlability — content quality, canonicalization, or crawl recency.
Step 1: Define the Audit Scope
Before collecting anything, fix what “the site” means for this audit — skipping this step is the most common reason an audit produces confusing findings later.
- Boundary: subdomains included, staging/dev excluded, non-HTML resources in or out of scope
- Objective: general health check, response to a traffic/indexing drop, pre-launch audit, or recurring scheduled audit
- Depth: full-site vs. a scoped section or template type
Step 2: Collect URLs From Multiple Sources
Crawlability can’t be evaluated against a single “true” URL list — evaluate it against several independently-sourced lists, because disagreement between the lists is itself diagnostic data.
URL collection sources and what each represents
| Source | What it represents |
|---|---|
| Sitemap-declared URLs | What the site claims should be crawled/indexed |
| Crawler-discovered URLs | What a crawl simulation finds by following links outward |
| Search-engine-reported URLs | What Google Search Console shows as known to Google |
| CMS/database export | What the site’s own system believes exists |
| Log-file-observed URLs | What bots have actually requested |
Audit principle: Treat disagreements between URL sources as evidence. A URL that exists in one system but disappears from another deserves investigation before you assume the page is simply “missing.
What This Audit Checks, and In What Order
Audit signal map
| Signal | Checked in |
|---|---|
| robots.txt access | Step 3 |
| Meta robots / X-Robots-Tag | Step 4 |
| HTTP status codes & redirects | Step 5 |
| Internal linking & discovery | Step 6 |
| XML sitemap accuracy | Step 7 |
| Canonical conflicts | Step 8 |
| JavaScript rendering | Step 9 |
| Crawl traps & crawl budget | Step 10 |
| Server & access failures | Step 11 |
| Log-file triangulation | Advanced Diagnosis |
| AI crawler access | Scoped extension |
Step 3: Test robots.txt Access
- File is reachable at the root path and returns a successful response
- Every
Disallow/Allowrule mapped against real URL paths, not assumed from intent - Rules checked per user-agent block separately, per the Robots Exclusion Protocol (RFC 9309)
Sitemap:directive, if present, points to a currently valid sitemap
Illustrative example (not a real audited site): a rule intended to block a staging subdirectory, written as Disallow: /staging, also matches /staging-assets/ and any other path beginning with that string — easy to introduce, easy to miss without testing the rule directly.
robots.txt permissions aren’t universal — a rule allowing Googlebot doesn’t automatically apply to Bingbot, GPTBot, or ClaudeBot; each user-agent block is evaluated independently. For robots.txt syntax and directive reference, see SEORAF’s robots.txt guide.
Step 4: Test Meta Robots and X-Robots-Tag
robots.txt operates before a fetch. Meta robots and X-Robots-Tag operate after a successful fetch.
Meta robots vs. X-Robots-Tag
| Directive | Where it lives | How to check it |
|---|---|---|
<meta name="robots"> | Page <head> | View page source or rendered DOM |
X-Robots-Tag | HTTP response header | Inspect HTTP headers directly — not visible in page source |
X-Robots-Tag is easy to miss precisely because it’s invisible in page source — it’s commonly set at the server, CDN, or reverse-proxy level, sometimes left over from a staging configuration never removed after launch.
Step 5: Audit HTTP Status Codes and Redirects
Status code ranges and audit actions
| Status range | Audit action |
|---|---|
| 2xx | Confirm this is the expected outcome for the URL’s intended state |
| 3xx | Follow to final destination; check for chains and loops |
| 4xx | Confirm intentional; flag if internally linked, sitemap-listed, or previously indexed |
| 5xx | Escalate as an infrastructure issue — blocks crawling outright |
Soft 404s: a 200 OK status on a page that’s actually empty or functions as an error page. Google’s own guidance notes this pattern is confusing for both users and crawlers and can limit overall crawl coverage. Source: Google Search Central — How Google handles soft 404 errors.
Redirect chains and loops: a single redirect (A → B) is low-risk. A chain (A → B → C) adds fetch overhead. A loop — eventually pointing back to a previously-visited URL — is a harder failure: the destination is never reached.
Illustrative example: an old product URL redirects to a category page later redirected to a new structure, producing a two-hop chain where a direct redirect to the current destination would suffice.
Step 6: Audit Internal Linking and Discovery
An orphan page — no internal links pointing to it — is effectively invisible to a crawler relying on link-following for discovery.
- Confirm links use real, crawlable
<a href>markup, not JavaScript-only click handlers - Check click depth from key entry points
- Cross-reference against Step 2’s crawler-discovered list: a URL in the CMS but not there is a strong orphan candidate
- Confirm internal links point to live, canonical versions — not redirected or non-canonical duplicates
An orphan page (zero internal links anywhere) and a deep page (linked, but many hops from entry points) are different problems with different fixes. For discovery mechanics beyond this audit-specific check, see SEORAF’s URL discovery guide.
Discovery is not the same as indexing: a URL can be discoverable without being indexed, and an indexed URL must have been discovered and fetched first.
Step 7: Validate XML Sitemap Accuracy
- Sitemap reachable and well-formed (or split via a sitemap index for large sites)
- Every listed URL is canonical, indexable, and returns 200 — no redirects, noindexed URLs, or error pages
- No important, indexable URLs missing entirely
- Sitemap referenced via robots.txt and/or submitted directly
Source for sitemap discovery behavior: Google Search Central — Build and Submit a Sitemap. For full sitemap syntax, see SEORAF’s XML sitemap guide.
Step 8: Check Canonical Conflicts Affecting Crawl Signals
Canonical tags are a consolidation signal, not an access-control mechanism. When a URL is blocked from crawling, Google may be unable to see the canonical declaration on that URL, so audit the two signals separately rather than treating a canonical tag as a substitute for crawl access. Also investigate cases where a canonical points toward a URL carrying a noindex directive, because the signals can conflict.
Step 9: Test JavaScript Rendering
Crawlers fetch raw HTML first, then attempt to render JavaScript separately. Content or directives that only exist post-render introduce a dependency on that rendering step succeeding.
Rendering approach vs. crawlability risk
| Rendering approach | Crawlability risk |
|---|---|
| Server-side rendering / static HTML | Lowest |
| Hybrid / pre-rendered | Low–moderate |
| Fully client-side rendering (CSR) | Highest |
Audit principle: Compare what exists in the raw response with what exists after rendering. A critical link, content block, canonical, or directive that only appears after rendering deserves closer investigation.
For JavaScript SEO fundamentals beyond this audit-specific check, see SEORAF’s JavaScript SEO guide.
Step 10: Identify Crawl Traps and Assess Crawl Budget
Crawl trap patterns and fixes
| Trap type | How it forms | Fix |
|---|---|---|
| Faceted/filter navigation | Every filter combination generates a distinct URL | Canonicalize to the unfiltered version, or block low-value combinations |
| Session/tracking parameters | Identical content at a different URL per session | Strip parameters server-side or canonicalize |
| Infinite pagination/calendars | Sequential pages with no logical end | Cap the crawlable range or noindex beyond a reasonable depth |
| Internal search results | Every query generates a unique, thin URL | Block internal search results from crawling |
Illustrative example: a product listing page with color, size, and availability filters can generate hundreds of URL combinations from what is, content-wise, really one page.
When crawl budget actually matters: when the site is large or has an expansive URL space; when evidence shows crawl activity concentrated on low-value patterns; when important pages show delayed discovery or re-crawl; or after rapid URL-space growth without matching crawl attention. Per Google’s own crawl-budget guidance, this is mainly a concern for larger or rapidly-changing sites, not a routine task for every domain. Source: Google Search Central — Large Site Owner’s Guide to Managing Crawl Budget.
Do not confuse crawl waste with crawlability failure: a crawl-budget problem usually concerns how crawler resources are allocated across a large or complex URL space; it is different from a URL being technically unreachable or blocked.
Step 11: Check Server, Access, and Authentication Issues
- DNS resolves correctly and consistently
- No password/login wall in front of content intended to be publicly crawlable
- Server doesn’t degrade specifically under bot request load
- Response isn’t served conditionally in a way that would differ from a search engine bot
Bot-management/WAF/CDN check: test directly by fetching as the specific bot user-agent and comparing against a standard browser fetch — bot-management defaults vary by provider and a change made for unrelated security reasons can quietly affect legitimate crawler access.
Advanced Diagnosis: Triangulating Crawler Simulation, Search Console, and Log Files
Every check so far relies on a simulation or a search engine’s own reporting. Neither is a direct record of what actually happened.

| Data source | What it shows | What it can’t show |
|---|---|---|
| Crawler simulation tool | What a bot could theoretically access | Whether real bots actually behave that way |
| Google Search Console | What Google reports it has crawled and indexed | Real-time activity, or activity from other bots |
| Server log files | What bots actually requested, when, and how often | Intent — logs show behavior, not reasoning |
A crawler simulation might show a page as fully accessible while log data shows the relevant bot hasn’t requested it recently — that discrepancy points to a discovery or prioritization problem rather than an access problem.
Interpret the mismatch: If a URL is crawlable in a simulator but absent from real bot logs, investigate discovery and crawl prioritization. If logs show requests but the crawler receives errors, investigate server or access controls.
Scoped Extension: Auditing AI Crawler Access
The same access-then-discovery-then-verification logic applies to AI crawlers — with one key difference: permission is granted independently per bot.
| Signal | Traditional search bot check | AI crawler check |
|---|---|---|
| robots.txt | Googlebot/Bingbot blocks | GPTBot, ClaudeBot, PerplexityBot, Google-Extended, checked separately |
| Server/WAF | Fetch-test as Googlebot | Fetch-test as each AI crawler’s specific user-agent |
| Discovery | Standard link-following and sitemaps | Same mechanisms generally apply |
| Documentation | Google Search Central | Each vendor’s own crawler documentation, evaluated separately |
Sources for current AI crawler behavior: Google’s Common Crawlers, Anthropic’s crawler documentation, OpenAI’s bot documentation, and Perplexity’s robots.txt guidance. For the conceptual framing of AI crawler governance, see SEORAF’s crawlability overview.
Prioritizing Findings

Business-value adjustment: Prioritize a page-level issue higher when the affected URL is commercially important, strategically important, or central to a major site section.
Fixing Common Crawlability Issues
| Issue | Fix | Where to verify |
|---|---|---|
| Overly broad robots.txt Disallow | Narrow the pattern to the intended path | Re-fetch as the relevant bot |
| Unintended noindex | Remove or correct the directive at its source | Re-fetch; check Search Console status |
| Redirect chain | Point the original reference directly at the final destination | Re-fetch; confirm single-hop |
| Redirect loop | Correct the rule causing the cycle | Re-fetch; confirm termination |
| Orphan URL | Add internal links from relevant crawlable pages | Re-run crawl simulation |
| Inaccurate sitemap entries | Correct to reflect live, canonical, indexable URLs only | Re-validate entries |
| Canonical conflict | Correct the target, or merge/redirect duplicates | Re-fetch; confirm resolution |
| JS-dependent content gap | Move critical content out of render-dependency | Re-compare raw vs. rendered output |
| Crawl trap | Apply parameter handling, canonicalization, or selective blocking | Confirm activity decreases |
| Selective bot-blocking | Adjust bot-management rules for legitimate crawlers | Re-fetch as the affected user-agent |
| Blocked critical resource | Unblock required CSS/JS | Re-render and compare |
Validating a Fix
- Re-test the specific mechanism that was broken
- Confirm re-crawl activity via logs, if available
- Confirm the status change in Search Console
- Allow a reasonable observation window — timing varies by site rather than a fixed schedule
Building a Recurring Monitoring Routine
Monitor regularly: Search Console’s Coverage report, crawl stats trends, and any newly launched section against the same checks above. Run a full audit periodically, or when triggered: a major migration, a significant traffic/indexing drop, a platform change, or a new large content section.
Conclusion
Most crawlability problems aren’t mysterious once you know where to look — they’re missed because the check happens out of order, or against a single data source that doesn’t tell the whole story. The crawlability overview covers what each signal is; this article is the process for finding, prioritizing, fixing, and confirming problems on a live site — access checked before signals, evidence triangulated across multiple sources, and every fix validated against real crawler behavior rather than assumed from a corrected setting.
Use the checklist below as a working document for your next audit.
Complete Crawlability Audit Checklist
Frequently Asked Questions
Editorial note: This article’s EEAT Experience requirement is honestly unresolved — no first-hand practitioner finding was available at time of publication, and none has been fabricated to fill it. All internal links were verified against live fetches of seoraf.com; unconfirmed targets (a dedicated Canonical Tags page, a standalone Crawl Budget guide, a standalone Log File Analysis guide, and a standalone AI Crawler Access guide) were not found live and are intentionally left unlinked rather than guessed.