Dead Ends — Pages With Zero Outbound Links to the Rest of Your Crawl
links/dead-ends flags every crawled page (the homepage aside) whose outbound links include zero URLs that point to another page in the same crawl, the forward-flow gap that strands Googlebot and traps link equity, a warning a model-railway shop's 1,400 product listings hit when each turnout and locomotive page links only out to a vendor, never deeper into the store.
Test your site for dead ends — pages with zero outbound links to the rest of your crawl
What it detects
links/dead-ends walks every page in your audited corpus, skips the root URL, and for each remaining page counts how many of its resolved outbound links point to another page that is also in the crawl. The check is strict: a link only counts if its target is in the known-URL set and is not a self-link back to the same page. When that count lands at exactly zero, the page is a dead end and the rule emits a warning naming the URL.
The test is corpus-scoped, not page-local. A page can carry dozens of links to external vendors, social profiles, or PDFs and still be a dead end, because none of those targets is another crawled page on your own site. Forward flow is the only thing measured: does standing on this page give a crawler, or a reader, any path deeper into the rest of the corpus.
Severity is fixed at warning. A dead end is not a broken page or a thin page; it renders fine and may read well. It simply terminates the internal link graph at that node, so anything that travels along links, crawl reach and ranking signal alike, stops there instead of moving on to the next page.
Why it matters
Googlebot discovers and re-crawls pages largely by following links from pages it already knows. A dead-end page is a node the crawler can arrive at but never leave, so it contributes nothing to discovering the rest of your site. On a small site one dead end is harmless. On a 1,400-page programmatic catalogue where most leaf pages dead-end, the internal graph collapses into a wide, shallow fan that the crawler exhausts in a single hop, leaving deeper inventory undiscovered for weeks.
Link equity, the ranking signal that propagates along internal links, behaves the same way. It flows into a dead-end page and then has nowhere to go. Every page that terminates the graph is a place where authority pools and stops compounding across the rest of the corpus, which is wasteful on exactly the deep long-tail pages programmatic sites most need to rank.
The fix is also the cheapest in the link family: a dead end becomes a live node the moment it links to even one other crawled page. Unlike orphan pages, which no page links to, a dead end is reachable but is itself a one-way valve. Adding a handful of contextual internal links forward turns a terminal node back into a junction the crawler and link equity can pass through.
A page that fails
RailYardHobbies.example ships 1,400 product pages for HO gauge locomotives, rolling stock, turnouts, ballast, and weathering powder. Each listing template renders the price, an add-to-cart button, and a single outbound link to the manufacturer's spec sheet on an external domain. It links to nothing else on the store: no category page, no related locomotive, no diorama guide. Every one of those 1,400 pages counts zero outbound links to another crawled URL, so links/dead-ends fires a warning on each. In one illustrative run the crawler reached barely 38% of the catalogue before exhausting its budget, leaving the deep aisles unindexed for 9 weeks. A crawler that lands on the Atlas GP38 diesel listing can read it, then has to retreat the way it came, because the page offers no path forward into the other 1,399.
A page that passes
The same RailYardHobbies catalogue, with the listing template reworked so every product page links forward into the corpus. The Atlas GP38 listing now links to its parent category (HO gauge diesel locomotives), to three related items a crawler can follow (a matching DCC decoder, a length of flex track, a bottle of rust weathering powder), and to a buying guide on bedding turnouts in ballast. The external manufacturer link stays, but it no longer stands alone. Each page now counts four or more outbound links to other crawled URLs, the dead-end warnings clear across all 1,400 pages, and in the same illustrative scenario crawl reach climbs from 38% to 94% within 12 days as the graph stops dead-ending. A crawler arriving on any listing can travel deeper into the store instead of hitting a wall.
How to fix it
- 1Add contextual internal links from every leaf page to a handful of genuinely related crawled pages, so each node offers the crawler a path forward rather than a one-way valve.
- 2Link each product or article up to its parent category or hub page, which alone is usually enough to clear the warning while also restoring a route back into the broader corpus.
- 3Build a related-items or related-reading block into the page template, since dead ends on programmatic sites almost always trace to a template that renders only external links.
- 4Audit your link resolver: relative hrefs, JavaScript-injected menus, or trailing-slash mismatches can make real internal links resolve to URLs outside the known set, so a linked page still reads as a dead end.
- 5Distinguish a dead end from a deliberately terminal page like a checkout or thank-you screen, and exclude only those that should not feed the crawl, never the content pages you want indexed.
- 6Re-crawl after editing the template, because dead ends are usually template-wide: one fix to the shared listing layout clears the warning on hundreds of pages at once.
SpamBrain context
Dead ends are not a spam policy. Google has never published a rule that says a page must link onward, and a single dead-end page will not draw a manual action or a SpamBrain demotion. links/dead-ends sits in the crawlability family, not the integrity family, and it ships at warning severity for that reason: it describes a structural inefficiency in your internal link graph, not a violation.
Where it intersects scaled-content territory is shape. The programmatic sites Google's March 5, 2024 scaled-content-abuse update targeted tend to share a tell beyond thin or duplicated text: a flat, terminal link graph where thousands of generated leaf pages link out to nothing on the same site. That shape is what makes a corpus feel like a database export rather than a navigable publication, and a wall of dead-end warnings is one of the clearest structural readouts of it.
So treat a dead-end finding as a crawl-efficiency and architecture signal, not a penalty risk. Clearing it makes Googlebot's job cheaper and lets link equity compound across your deep pages. On a programmatic catalogue, pairing dead-end fixes with the integrity rules that judge content is how a generated grid starts reading like a site someone actually built to be browsed.
Frequently asked questions
- What exactly counts as a dead-end page in pseolint?
- A page in your crawled corpus, other than the root URL, whose outbound links include zero URLs that point to another page also in the crawl. The rule resolves every href on the page, then keeps only the ones whose target is in the known-URL set and is not a self-link back to the same page. If that surviving count is zero, the page is a dead end and gets a warning. Links to external sites, files, or anchors on the same page do not count, because none of them carries a crawler forward into the rest of your corpus.
- How is a dead end different from an orphan page?
- They are mirror images. An orphan page is one that no other crawled page links to, so a crawler struggles to reach it in the first place. A dead end is the opposite: the crawler can reach the page fine, but the page links to nothing else in the corpus, so the crawler cannot leave it for another internal URL. A page can be both at once, fully stranded, but the two rules describe different failures. Orphans are a discovery problem on the way in; dead ends are a forward-flow problem on the way out.
- Why is this only a warning and not an error?
- Because a dead-end page is structurally inefficient, not broken or deceptive. The page renders, indexes, and may serve users perfectly well in isolation. What it fails to do is pass crawl reach and link equity onward to the rest of the site. That is a real cost on a large corpus, but it is not a content-quality violation or a spam signal, so the rule reports it at warning severity, flagging an architecture issue worth fixing rather than a penalty risk demanding it.
- My model-railway store links every product to its manufacturer. Why are these still dead ends?
- Because manufacturer links point to an external domain, and the rule only counts links to other pages inside your own crawl. A listing for a brass HO gauge locomotive can carry a link to the maker's spec sheet, a link to a review video, and a link to a parts PDF, and still be a dead end, because not one of those targets is another page on your store. The moment that listing also links to its category, to a related rolling-stock item, or to a ballasting guide on your own site, it stops being a dead end. In one illustrative scenario a store whose $2,300 brass locomotive pages all dead-ended this way saw them sit unindexed for 8 weeks until the template linked them forward. Forward flow has to stay on your domain to count.
- Does a dead-end page hurt my rankings directly?
- Not by itself, and not the way a thin or duplicate page can. The harm is indirect and graph-shaped. A dead end is where link equity arrives and stops compounding, and where a crawler runs out of road, so the cost lands on the pages downstream that never get the signal or the crawl budget the dead end absorbed. On a small site this is negligible. On a programmatic catalogue with hundreds of terminal pages, the cumulative drag on crawl reach and internal authority flow is exactly the kind of architectural waste worth clearing across the whole template at once.
Related rules
- links/orphan-pagesOrphan Pageslinks/orphan-pages scans every URL in the crawl, counts the inbound internal links pointing at each one, and fires at error severity on any page with exactly 0 of them — the dead-zone shape that leaves Googlebot unable to reach a URL through your own navigation, a structural gap the March 27, 2026 core update treats as a discoverability failure rather than a content one.Read →
- links/link-depthLink Depthlinks/link-depth runs a breadth-first search from your root URL and measures the shortest click-distance to every page, flagging anything past the default ceiling of 3 clicks as info and anything Googlebot cannot reach from the root at all as a warning, because a page Google crawls last is a page Google ranks last.Read →
- links/cluster-connectivityCluster Connectivitylinks/cluster-connectivity groups every crawled URL by its parent directory, and for each cluster of 2 or more pages it checks whether a single internal crawl link enters from another cluster or leaves toward one — firing a warning when neither exists, because Google cannot diffuse authority into a directory that no other section of your site references or is referenced by.Read →
Want to know whether this rule actually fires on your site?
Run pseolint against your sitemap. The audit is free, takes about a minute, and returns a per-URL list of every rule that fired — including this one — with the exact metric values so you can prioritise the fix queue.