What you need before you start
This is a fix pass on a site that already exists, not a plan for one you're about to build. Twenty minutes of setup, then eight checks you can run in an afternoon on a site under a few thousand URLs.
Three inputs. A crawler — Screaming Frog's free tier handles 500 URLs, which covers most business sites. Search Console, for the Links report and for the query data you'll use to judge which pages deserve links. And your own list of money pages: the service, product, pricing and contact URLs that actually produce revenue. Write that list down first. Every check below is judged against it.
Checks one to four: the structural problems
These four are about shape — how link value flows through the site and whether Google can tell what matters.
Check 1 — navigation bloat
A mega-menu that links 140 URLs from every page sounds helpful and behaves like a tax. Link value divides across the links on a page, so a template that fires 140 links from every URL gives each one a slice of nothing. It also flattens your hierarchy: if everything is in the nav, nothing is prioritised.
The signal: crawl the site and sort by outlinks per page. If your average page has more than roughly 100 internal links and most of them are identical across every page, your navigation is doing the linking and your content isn't.
Check 2 — one anchor, several destinations
Anchor text tells Google what the target page is about. If "SEO services" points at four different URLs across the site, you've told Google that four pages compete for the same idea — and Google will pick one, probably not the one you wanted.
The signal: export the crawler's anchor text report, group by anchor, count distinct target URLs. Anything with three or more targets goes on the fix list. This check doubles as a cannibalisation detector — the same anchor pointing at several pages usually means several pages chasing one query.
Check 3 — orphaned URLs
An orphan is a page with no internal links pointing at it. It may be in the sitemap, it may even be indexed, but nothing on the site says it matters, so Google crawls it rarely and ranks it worse.
The signal: a list comparison. Crawl the site to get every URL reachable by following links. Separately, pull every URL from your XML sitemap, plus every URL that received an impression in the last 12 months from Search Console. Anything in the second list and not the first is orphaned. Screaming Frog does this automatically once you connect the Search Console API, but a spreadsheet and a VLOOKUP works fine.
Check 4 — click depth past three
Click depth is the number of clicks from the homepage to a page. Depth isn't a ranking factor in itself, but it correlates hard with crawl frequency and it's a decent proxy for how important your own site says a page is.
The signal: the crawl depth column in your crawler. Sort descending, then cross-reference against your money-page list. A pricing page at depth 5 is a structural error. A 2019 blog post at depth 5 is fine and should probably stay there.
Checks five to eight: the ones costing you money
These four are about waste — links that leak value, links that don't exist as far as a crawler is concerned, and pages that earn nothing from their own site.
Check 5 — money pages with fewer links than blog posts
This is the finding that shows up on almost every site, and it's the one worth fixing first for return. Blog posts accumulate internal links naturally because they get linked from other posts, category pages, related-post widgets and archives. Service and pricing pages get linked from the nav and nowhere else.
The signal: sort every URL by unique inlinks, descending. If a four-year-old blog post has 90 inbound internal links and your highest-value service page has 6, your own site is voting for the wrong page. Fix it by adding contextual links from your best-performing content — the posts already getting traffic — with anchor text that describes the destination.
Check 6 — broken and redirected internal links
Internal 404s waste crawl and dead-end users. Internal 301s are subtler: they still work, but every hop is an unnecessary request and a link pointing at a URL you already decided to retire.
The signal: the crawler's internal response-code report. Filter for 3xx and 4xx, then use the "inlinks" panel to see which pages contain the offending link. Update the source link to the final destination. This is the cheapest fix in the whole audit and usually the largest single count.
Check 7 — links a crawler cannot follow
A link is a link when it's an anchor tag with an href. A clickable div with a JavaScript handler is not, and neither is a link that only appears after a client-side route change. If your "related products" carousel is rendered entirely in the browser, those links may not be counted.
The signal: crawl once with JavaScript rendering off and once with it on, then compare internal link counts per page. A large gap tells you how much of your linking depends on rendering. Also filter for internal links marked nofollow — usually a plugin default nobody chose deliberately.
Check 8 — everything living in the footer
Google distinguishes between links in the main content and links in boilerplate. A footer link repeated on every page carries less weight than a link in a sentence that explains why you should click it, and it tells Google nothing about context.
The signal: your crawler's link position classification — content, navigation, footer, sidebar. If your money pages' inbound links are 90% footer, they have volume and no meaning. Fix by earning them contextual links from relevant body copy instead.
The order to fix them in
Ascending risk. Start with the changes that can't break anything and end with the ones that touch every page on the site.
- Ship steps 1 to 3 together. They're additive and nothing can regress.
- Ship step 6 on its own, on a quiet week, with nothing else changing. If traffic moves, you want to know it was the nav.
| Order | Fix | Risk | Rough effort |
|---|---|---|---|
| 1 | Repoint broken and redirected internal links | None | An hour or two, mostly find-and-replace |
| 2 | Link every orphaned page that deserves to exist | None | Half a day, plus deletions for the ones that don't |
| 3 | Add contextual links from top-traffic content to money pages | Low | A day, done properly |
| 4 | Pull money pages up to depth 3 or less | Medium — changes templates | A day, needs a developer |
| 5 | Deduplicate anchor text across competing pages | Medium — often reveals a content merge | Varies with how bad it is |
| 6 | Trim navigation bloat | High — affects every URL | Do last, ship alone, measure |
What to measure afterwards, and when
Internal linking rarely produces a step change in traffic. It produces a slow, unglamorous improvement in which of your pages Google considers important, and that shows up in leading indicators long before it shows up in revenue.
Four things to check, and the honest timeline for each:
- Impressions and average position in Search Console, filtered to the specific pages you added links to. Expect movement at 4–8 weeks, not 4–8 days.
- Crawl stats — pages crawled per day, in Settings → Crawl stats. Fixing orphans and redirect chains usually shows up here first, sometimes within two weeks.
- Indexed page count for the section you fixed. If orphans were the problem, previously excluded URLs should start moving into the indexed bucket.
- Re-crawl the site at the 30-day mark and compare the two exports: average click depth, inlinks to money pages, count of 3xx and 4xx internal links. This is the only number that proves you actually did the work.