Brad Holmes web developer, designer and digital strategist.

Dad, husband and dog owner. Most days I’m trying to create fast, search-friendly websites that balance UX, Core Web Vitals, and digital strategy from my studio in Kettering, UK.

If you’re here, you either found something I built on Google or you’re just being nosey. Either way, this is me, the work, the thinking, and the bits in between.

Also found on

Dumping Ground
Brad Holmes examining an open chain while wearing a black hoodie displaying the word LINKS.

I Crawled 50 Ranking Websites. Internal Linking Wasn’t the Pattern I Expected

Brad Holmes By Brad Holmes
12 min read

When I finished auditing 50 real websites for technical SEO, one question was still sitting there.

If speed, schema and clean markup weren’t enough to explain why those pages ranked, could the answer be hiding in the links between them?

Not backlinks. Internal links.

The ordinary links from a homepage to a service, from an article to a useful guide, or from a location page to the thing somebody actually wants to buy.

Google says it uses the links between pages to understand site structure and relative importance. It also recommends linking important pages from other relevant pages and using concise, relevant anchor text. That makes internal linking sound measurable. Crawl the sites, count the links, score the structures and see what the winners have in common.

So that’s what I tried to do.

I went back to the same 50 websites from my technical SEO study. I crawled up to 100 pages on each domain and collected 536,365 internal-link records.

I expected to finish with a neat league table.

I didn’t.

The most useful finding wasn’t which site scored highest. It was how quickly an internal-link score becomes nonsense when you ignore how much of each website you actually managed to see.

That limitation turned out to be the story.

What I measured

I wasn’t interested in producing another list of orphan pages from a crawler and calling it strategy.

I wanted to know whether each site’s structure did five useful things:

  • made important pages easy to discover;
  • spread links across the site instead of concentrating them on a handful of URLs;
  • supported pages with links from relevant content;
  • used anchors that explained where the link went;
  • avoided broken, redirected, noncanonical and nofollow internal targets.

Those became the five parts of the automated score:

CategoryWeightWhat it measured
Discoverability25Click depth, near-orphans and whether the original ranking URL was reachable
Distribution20How widely incoming links were spread and whether a few destinations dominated
Content support20Contextual links into pages and useful links out of content
Anchor quality15Descriptive anchors and whether the same wording pointed to conflicting destinations
Link hygiene10Known broken, redirected, noncanonical and nofollow targets

That produced an automated score out of 90. The final ten points were reserved for a manual relevance review, because a crawler can tell me that a link exists but not whether it genuinely helps the reader.

That distinction matters. Counting links is easy. Judging whether they belong there is the actual work.

How I crawled the sites

All 50 domains were given the same bounded crawl:

  • start at the homepage;
  • follow links breadth-first;
  • record no more than 100 pages per domain;
  • stop at a maximum depth of six;
  • obey robots.txt and any slower crawl delay it declared;
  • remove query strings so tracking parameters didn’t inflate the graph;
  • inventory up to five sitemap files and 5,000 sitemap URLs per domain;
  • keep the original ranking URL as a measurement, without artificially injecting it into the crawl.

The final run produced:

ResultCount
Websites attempted50
Successful on-domain HTML pages3,490
Internal-link records536,365
Template links417,380
Contextual links99,722
Content-module links16,317
Other internal links2,946
Original ranking URLs discovered naturally26

The crawler completed every domain without a runner failure.

But “completed” does not mean “saw the whole website”. That difference changed everything.

The first finding: a crawl limit can create fake confidence

One hundred pages sounds like a respectable sample until you apply it to Duolingo, Reddit, HSBC, YouTube, a national retailer and a local plumber as though they are comparable objects.

They aren’t.

On a small local website, 100 pages may cover most of the useful structure. On a platform with millions of URLs, it is barely a glance through the front door.

If I gave both sites a score anyway, the decimal places would create an illusion of precision. A site might appear to have no orphan pages simply because the crawl never reached the section where they lived. Another might look beautifully shallow because I only saw the pages linked closest to the homepage.

So I added a coverage gate.

CoverageSitesTreatment
A0Crawl queue exhausted before the page cap; eligible
B2At least 70% of the observed sitemap inventory covered and ranking URL represented; eligible
C340–69% covered and ranking URL represented; eligible with an explicit limitation
D28Low or indeterminate coverage; diagnostics retained, score excluded
Unscored17Too few successful pages or too low a successful-response rate

Only five of the 50 websites met the rules for a publishable automated score.

At first, that felt like a failed experiment.

It wasn’t. It exposed a problem I now see in a lot of site-audit reporting: the score gets treated as the truth, while the visibility of the crawler is buried in the settings.

Before believing any internal-link audit, ask one question:

How much of the website did the tool actually see?

If the answer is unclear, the score is unclear too.

Of the 536,365 link records, 417,380 came from repeated template areas such as navigation, footers and other site-wide components.

That is roughly 78% of every link observed.

Contextual links inside the main content accounted for about 19%. Repeated content modules added another 3%.

This doesn’t mean template links are bad. Navigation is what makes a site usable, and Google explicitly recommends a logical, crawlable hierarchy. A homepage should link to categories. Categories should lead to the pages beneath them. Important destinations should not depend on somebody using a search box.

But raw link totals are a terrible proxy for internal-link quality.

A footer repeated across 500 pages can create 500 links to a destination without adding 500 meaningful recommendations. A single well-placed contextual link from the right guide may tell a user—and a crawler—far more about why the destination matters.

This is why the scoring separated template links from body links. Otherwise, the biggest navigation would usually win.

The five sites I could score

The eligible results were:

RankWebsiteCoverageAutomated score /90
1plumblondon.comC85.24
2london-plumber.co.ukB72.92
3wefix.londonC72.25
4spanishhackers.comB65.53
5spanishobsessed.comC49.57

These are not final SEO scores, and they are not evidence that the first site ranks because of internal linking.

They are structural scores for the portion of each site that met the coverage rules. The C-grade sites still carry a clear sampling limitation, and the manual relevance component remains separate.

Even with those caveats, the differences between them are useful.

Plum London: the strongest all-round structure

Plum London scored 85.24 out of 90.

Every scored page was within three clicks. There were no observed near-orphans. Every page received links from at least three internal sources, and the top 10% of destinations accounted for only 26% of the observed link relationships.

It also performed well where navigation alone cannot save you:

  • 82% weighted content-support rate;
  • 91% of content pages included at least two useful body or content-module links;
  • 87% descriptive body anchors;
  • no known broken or redirected internal targets in the scored crawl.

The interesting part is not that it had lots of links. It is that those links were spread through the structure and reinforced by content.

The limitation is coverage C. This is strong evidence about the observed sample, not a claim that every URL on the domain behaves the same way.

London Plumber: strong architecture, weak hygiene

London Plumber reached 72.92 with Coverage B.

Its distribution was excellent. Nearly 94% of scored pages received links from at least three internal sources, 95% of content pages contained useful outgoing links, and only 2.5% of pages were near-orphans.

Then link hygiene dragged the score down.

Of the fetched linked targets used in that part of the calculation, 7.8% were broken and 14.4% redirected. The site was doing the difficult strategic work—connecting pages—but losing points on maintenance.

That is a useful reminder: adding internal links is not a one-off SEO task. Redirect chains, removed pages and changed URLs slowly turn a good structure into an inefficient one.

Wefix London: easy to reach, less supported by content

Wefix London scored 72.25 with Coverage C.

Its discoverability was perfect in the observed crawl. Every scored page was within three clicks, none were near-orphans, and every page had at least three incoming internal sources. Its anchors were also exceptionally clear, with 100% descriptive coverage and almost no destination ambiguity.

The weakness was content support.

Only 34% of content pages had at least two useful outgoing body or module links. In other words, the architecture made pages reachable, but the content itself did less of the work connecting related ideas and services.

Navigation can expose a page. Context helps explain why it matters.

Spanish Hackers and Spanish Obsessed: similar topic, different graphs

Spanish Hackers scored 65.53 with Coverage B. Spanish Obsessed scored 49.57 with Coverage C.

Both kept their scored pages within three clicks. The difference appeared deeper in the graph.

Spanish Hackers spread links more evenly and gave more pages meaningful content support. Its top 10% of destinations attracted roughly 37% of link relationships, compared with about 60% on Spanish Obsessed. It also had a much lower near-orphan rate: 17% versus 37%.

Spanish Obsessed used highly descriptive anchors, but the same or similar wording often pointed to different destinations, and a large share of fetched linked targets redirected.

Good anchor text helps. It cannot compensate for an uneven structure by itself.

What the results do—and don’t—say about rankings

This is the point where it would be tempting to write: “Plum London proves internal linking drives rankings.”

The data does not prove that.

The original 50 pages were selected because they ranked in the earlier study. There is no matched control group of non-ranking sites here, and only five domains achieved enough coverage for comparative scoring. Brand, backlinks, content quality, intent, age and wider authority were not held constant.

So this is not a correlation study between internal-link scores and Google positions.

What it does show is narrower and more useful:

  • a ranking page can exist inside a structure that is only partially visible to a bounded crawler;
  • template links dominate raw counts, so placement matters;
  • shallow click depth does not automatically mean links are well distributed;
  • descriptive anchors do not automatically mean the surrounding link graph is healthy;
  • maintenance problems can undermine an otherwise deliberate structure;
  • crawl coverage must be part of the score, not a footnote beneath it.

Google’s own documentation says links help it discover pages and understand their relevance, while internal linkages can signal the relative importance of pages within a site. That supports the mechanism. It does not turn one metric into a guaranteed ranking lever.

Internal linking is infrastructure, not a cheat code.

What I would check on a real website

This study changed the order in which I would now review internal linking.

1. Prove the crawl coverage first

Check how many indexable pages exist, how many the crawler fetched successfully, whether important sitemap URLs appeared, and whether blocked sections or external redirects distorted the sample.

Do not diagnose the graph until you know which part of it you are looking at.

2. Find pages that are technically reachable but practically unsupported

A page being three clicks from the homepage is not enough.

Look for pages that receive links only from navigation, taxonomy or a sitemap. Then ask where a genuine reader would benefit from discovering that page inside related content.

3. Separate template links from contextual links

Do not celebrate 20,000 internal links until you know where they came from.

Menus explain the hierarchy. Contextual links explain relationships. Both matter, but they do different jobs.

4. Measure distribution, not just volume

Look at the percentage of pages receiving links from several unique sources and how much of the graph is concentrated on the most-linked destinations.

A healthy structure should make priority pages obvious without leaving the rest of the useful site invisible.

5. Review the words and the destination together

Google recommends concise, relevant anchor text. I would add one more test: does the wording consistently mean the same thing?

An anchor can look descriptive in isolation while becoming ambiguous across the site.

6. Maintain what you build

Fix internal links that hit broken pages, redirects and noncanonical URLs. Update the source link rather than relying on the destination to clean things up forever.

The best internal-link strategy still decays if nobody maintains it.

The uncomfortable conclusion

I started this study expecting to rank 50 websites.

The honest result was that I could responsibly rank five.

That sounds less impressive than a giant comparison table. It is also more useful.

The crawl showed that internal linking is not one number. It is a combination of discovery, distribution, context, language and maintenance. More importantly, every one of those measurements depends on coverage.

An audit tool can give you a beautifully precise score for an incomplete graph. The number may be mathematically correct and strategically wrong.

That is the lesson I am taking from the data:

Don’t trust an internal-link score until you trust the crawl behind it.

Internal linking still matters. Google uses links to discover pages, interpret relationships and understand which pages a site treats as important. Users rely on those same pathways to move from a question to an answer, and from an answer to a decision.

But the job is not to add more links until a plugin turns green.

The job is to build clear routes through the site, support important pages from relevant content, use language that sets the right expectation, and keep those routes working.

That is less tidy than a checklist.

It is also much closer to how real websites work.

Download the findings

I’ve published the full workbook, including the site scores, crawl summaries, manual-review sample and scoring method:

Open the 50-site internal-linking findings in Google Sheets

The D and Unscored sites are included for transparency, but their automated diagnostics should not be treated as comparable site-wide scores. The five A–C results are provisional scores out of 90 until the manual relevance review is complete.

What you should read next

Brad Holmes

Brad Holmes

Web developer, designer and digital strategist.

Brad Holmes is a full-stack developer and designer based in the UK with over 20 years’ experience building websites and web apps. He’s worked with agencies, product teams, and clients directly to deliver everything from brand sites to complex systems—always with a focus on UX that makes sense, architecture that scales, and content strategies that actually convert.

Thanks Brad, I found this really helpful
TOP