Every internal link on a site does one of five jobs. It holds the site together (structural), declares what a section contains (hub), connects an idea to the page that explains it (contextual), offers the next thing to read or buy (related), or tells the user and the crawler where they are (breadcrumb). I call this the Five Layers. Each layer has its own job, template rules and anchor rules, and no layer may do another's job. When a site's linking feels chaotic, it is almost always because the layers have collapsed into one another. This is the operating version of my internal linking guide.
- Structural
- Hub
- Contextual
- Related
- Breadcrumb
When to use this
Use the Five Layers when a site has enough templates that linking cannot be done by hand: e-commerce, marketplaces, publishers, SaaS documentation, and any programmatic SEO build. It is also the right tool when an audit has found important pages at depth five or more, orphans, or crawl budget spent on the wrong things.
On a small site the layers still apply, but you can implement them in an afternoon. The framework earns its keep when you need rules a developer can build into a template or a script can apply across thousands of pages.
The five layers
Layer 1: Structural. The links that make the site a site.
Inputs: the site architecture and the list of commercially important sections. Actions: decide which sections appear in the navigation and in what order; keep the footer to a short set of useful links; make sure the home page links to every top-level hub. Outputs: a navigation and footer spec. Checks: every hub is one click from home, and the navigation is identical in the raw HTML and the rendered page. Anchor rule: short, literal section names.
Layer 2: Hub. The links that declare what a section contains.
Inputs: the category tree or topic map, with tiers from the topical authority framework. Actions: every hub links to every child it owns, directly or through crawlable pagination; every child links back to its hub above the fold. Outputs: a hub rule per template: which fields drive the child list, how many children show, how pagination works. Checks: no child is reachable only through filters, site search or deep pagination. Anchor rule: the child's own title; the hub's own name going up.
Layer 3: Contextual. The links inside sentences that carry meaning.
Inputs: the content brief's linking plan and an entity-to-URL map, where each important concept has one canonical destination. Actions: link the first meaningful mention of a mapped concept, to the most specific page that serves it rather than the hub; link to commercial pages only where the context is genuinely commercial. Outputs: a maintained entity-to-URL map. Checks: each important page receives contextual links from several relevant pages, never from one source only. Anchor rule: descriptive, varied, natural phrasing. Never the same exact-match anchor on every page.
Layer 4: Related. The links that offer the next step.
Inputs: a relatedness rule: same hub, shared entities, shared attributes or behavioural data. Actions: define the rule per template, cap the count at four to eight, and bias it towards pages that need links. Outputs: a related-items rule per template. Checks: the block is in the raw HTML, varies between pages, and surfaces under-linked pages. Anchor rule: the target page's title.
Layer 5: Breadcrumb. The links that locate the page.
Inputs: one primary parent per page; a page can have many tags but only one breadcrumb parent. Actions: one trail per page, marked up with structured data, consistent with the hub structure. Checks: every page has a trail that ends one level above it and matches Layer 2. Anchor rule: the parent's literal name.
Rules per template
I write the rules as a matrix: templates down the side, layers across the top, each cell saying what that template must emit. It is what a developer builds from and what an auditor checks against. Here is the shape for a typical e-commerce site.
| Template | Structural | Hub | Contextual | Related | Breadcrumb |
|---|---|---|---|---|---|
| Home | Nav, footer, every top hub | Featured hubs, priority pages | Intro copy to key hubs | None | None |
| Category hub | Nav, footer | All subcategories; paginated list | Description to buying guides | Sibling categories | Home > Parent > Category |
| Product | Nav, footer | Up to primary category | Description to guides, specs | Same-category products, capped | Home > Category > Product |
| Guide / article | Nav, footer | Up to pillar; pillar lists it | Per brief, 5 to 12 links | Same cluster, biased to low-link pages | Home > Learn > Pillar > Article |
| Programmatic page | Nav, footer | Up to parent entity hub | Generated from data fields | Nearest entities by attribute | Home > Hub > Page |
Depth targets
Click depth is the shortest path from the home page. I set targets per page class, because a blanket "everything within three clicks" is impossible on a large site and meaningless on a small one.
- Hubs and pillars: depth 1.
- Money pages (top categories, core product and service pages, pillar children): depth 2, never more than 3.
- Supporting content and ordinary products: depth 3, tolerable at 4.
- Long-tail programmatic pages: depth 4, with a route that does not rely on deep pagination.
- Depth 5 or more is a finding. Zero inbound links is an orphan, which I treat as a defect; the orphan pages experiment shows what happens when they are reconnected.
Worked example (hypothetical)
Imagine a marketplace for used cars in India with city pages, make pages, model pages, individual listings and a buying-guide section. This is a made-up example, not a client.
The audit finds that model pages, which carry the most valuable queries ("used swift in pune"), sit at depth four: home, city, make, paginated listings, then model. There is no hub layer for models; the model name is a filter. Listings link only to other listings. Buying guides link to the home page and to each other, never to a city or model page. Breadcrumbs follow the URL path rather than the hub structure.
Applying the layers: a model hub template is created and linked from every make page and from a "popular models" block on city pages (Layer 2). Listings link up to their model and city hubs (Layer 2) and to a capped set of similar listings (Layer 4). Buying guides get contextual links from the entity map, so a guide on checking service history links to the models it mentions (Layer 3). Breadcrumbs are rebuilt as home, city, make, model (Layer 5). Model pages move to depth three, with a depth-two route for top models.
Prioritising link work
When there are more opportunities than engineering time, I score them. Value (1 to 5) is the commercial importance of the targets. Deficit (1 to 5) is how under-linked they are. Scale (1 to 5) is how many pages one rule touches. Effort (1 to 5) is implementation cost. Score is Value times Deficit times Scale, divided by Effort.
| Opportunity (from the example) | Layer | Value | Deficit | Scale | Effort | Score |
|---|---|---|---|---|---|---|
| Listings link up to model and city hubs | Hub | 4 | 5 | 5 | 1 | 100.0 |
| Create model hub template, link from make and city pages | Hub | 5 | 5 | 5 | 3 | 41.7 |
| Guides link to model and city pages via entity map | Contextual | 4 | 4 | 3 | 2 | 24.0 |
| Rebuild breadcrumbs to hub structure | Breadcrumb | 3 | 3 | 5 | 2 | 22.5 |
| Similar listings block, capped | Related | 2 | 3 | 5 | 2 | 15.0 |
The listing-to-hub link scores highest because it is a one-line template change touching every listing. The model hub is more work and the bigger structural win, so both ship in the first release.
The audit method
Crawl and classify
Crawl the site and tag every link by layer using its position in the template. Most crawlers can do this with custom extraction. The output is a link graph with a layer label on every edge.
Measure per template
For each template, count inbound and outbound links by layer and click depth. Compare against the rules matrix. Every mismatch is a finding.
Find the gaps and check anchors
List orphans, pages whose inbound links all come from one layer, pages beyond their depth target, and hubs that do not link to all their children. For each important target, flag where one exact anchor dominates or every anchor is generic.
Verify in the raw HTML
Repeat the counts on the raw HTML. Related blocks and hub lists loaded by JavaScript are the most common reason a linking plan looks fine in a browser and does nothing for crawling; the JavaScript SEO guide covers how to check.
What to automate, and what not to
Layers 1, 2, 4 and 5 should be generated by templates and rules; hand-placing hub links on ten thousand pages is a maintenance problem waiting to happen. Layer 3 is the exception. Contextual links should be rule-assisted but human-approved, because "link every mention of X to page Y" produces the exact-match anchor pattern that reads as manipulation. I generate suggestions from the entity map and have the editor accept or reject them at the brief stage.
Programmatic sections are different, because the context is itself structured: a model page can safely link to its city pages and competing models from attribute data. I tested this in the internal linking at scale experiment; what held up was rule-generated structure with a cap per page and a bias towards under-linked targets.
Common failure modes
Collapsed layers
A related block does the hub's job, so the hub only lists what is popular and the long tail orphans itself.
Filters as the only hub
Important page sets reachable only through faceted navigation that is blocked or canonicalised. The pages exist; nothing links to them.
Links to the hub instead of the page
Contextual links pointing at the category rather than the page that answers the mention, so that page never accumulates signals.
No post-release check
Rules were implemented, nobody re-crawled, and a later template change removed the breadcrumbs.
Run it yourself
- List your templates and draw the rules matrix, one cell per template and layer.
- Set depth targets per page class; list which pages are money pages.
- Build the entity-to-URL map for contextual links, one destination per concept.
- Crawl, tag every link by layer, and measure inbound links, depth and anchors per template.
- List orphans, depth violations, single-layer dependencies and anchor monotony.
- Score opportunities by Value, Deficit, Scale and Effort; ship the top of the list.
- Verify the raw HTML contains every layer the rules say it should.
- Re-crawl after release and add link counts per template to your monitoring.
Internal linking is one of the first things I fix in a technical SEO engagement, because it is cheap, within the site's control, and compounds with every page published afterwards. The technical SEO and content architecture case study shows the Five Layers applied alongside an audit and a content rebuild.
FAQ
How many internal links should a page have?
As many as the layers require and no more. The number matters less than whether each link does a job and whether important targets receive links from more than one layer.
Should I use nofollow on internal links?
Almost never. If a page should not be crawled or indexed, handle it with robots rules or noindex. Nofollow on internal links mostly wastes the signal.
Do internal links still matter if the site has strong backlinks?
More, not less. Internal links are how external authority reaches the pages that need it. A strong domain with poor internal linking has a home page that ranks and nothing else.
How is this different from building topic clusters?
Topic clusters decide what the hubs and children are. The Five Layers decide how every template links to them, including non-editorial templates like product pages and footers. They are designed to be used together.