How to fix missing internal links
You fix missing internal links by making every page you care about reachable through real anchor links with descriptive text, within a few clicks of your homepage. A page with 0 links pointing to it is an orphan, and crawlers rarely find orphans. Google's SEO starter guide is blunt about the stakes: “the vast majority of the new pages Google finds every day are through links.” Link the page, or accept that engines may never see it.
The symptom: pages that exist but might as well not
You published the page months ago. It is live, it loads, it is in the sitemap. And it has no impressions, no ranking, and in Search Console it sits in "Discovered, currently not indexed" or does not appear at all. When we trace pages like this, the finding is usually the same: nothing on the site links to them. They are orphans. The only path to them is typing the URL.
The softer version of the symptom is depth. The page is linked, but the only route to it runs homepage to blog to archive page 7 to post. Crawlers allocate attention from the pages they know toward the pages those link to. A page buried five clicks down gets a thin trickle of that attention, and readers never make the journey at all.
The cause: publish-and-forget, and links that are not links
Orphans are made two ways. The first is workflow: a page gets published, nobody goes back to older pages to link toward it, and the site's link graph never learns the page exists. Navigation menus do not save you here. A menu links the same dozen pages from everywhere, and everything outside the menu depends on in-body links that nobody wrote.
The second cause is links that look like links but are not. Google's documentation on making links crawlable states the rule: “Generally, Google can only crawl your link if it's an <a> HTML element (also known as anchor element) with an href attribute.” A div with a click handler navigates fine for a human with JavaScript running and does nothing for a crawler walking the HTML. Sites built on JS frameworks hit this constantly: the whole site works, and the crawler sees a set of disconnected pages.
<!-- A crawler cannot follow this. It is a div, not a link. --> <div class="card" onclick="goTo('/services/roof-repair')">Learn more</div> <!-- A crawler follows this. Real anchor, descriptive text. --> <a href="/services/roof-repair">Roof repair services and pricing</a>
The fix: a hub, spokes, and anchors that say something
For a small site, one pattern covers almost everything: hub and spoke. Pick the page that best represents each topic you want to be known for. That is the hub. Every related page (a spoke) links up to the hub, the hub links down to every spoke, and spokes link sideways to each other where the content genuinely connects. Do this and three problems die at once: no orphans, shallow click depth, and a topic cluster whose pages explain each other.
Then write the anchor text like it matters, because it does. The crawlable-links documentation defines the target: “Good anchor text is descriptive, reasonably concise, and relevant to the page that it's on and to the page it links to.” "Click here" and "learn more" tell a reader and an engine nothing about the destination. "Roof repair services and pricing" tells both exactly what they will get. The starter guide makes the same point from the reader's side: with appropriate anchor text, people and search engines understand what the linked page contains before they visit.
Three habits keep the graph healthy after the cleanup:
- Every new page ships with 2 or 3 inbound links added to existing pages the same day it publishes. Linking is part of publishing, not a someday task.
- Every link is a real
<a href>. If a component navigates, it renders an anchor. Style it however you like; the HTML underneath must be a link. - Important pages stay shallow. If a page earns money or answers your customers' biggest question, it should be reachable from the homepage in a few clicks, not archaeology.
Be honest: internal links are plumbing, not magic
SEO folklore treats internal linking as a juice-pumping scheme, with elaborate "link sculpting" ratios and invented percentages. We will not give you numbers like that, because the official documentation does not contain them and we do not invent metrics. What the docs actually establish is narrower and more useful: links are how new pages get discovered, anchor text is how the destination gets understood, and only real anchor elements count. That is discovery and context. It is plumbing. A perfectly linked site full of thin pages still loses, which is why this fix pairs with fixing thin content rather than replacing it.
Verify: count your orphans and your click depth
The hand check: pick your five most important pages and, starting from your homepage, try to reach each one by clicking. Count the clicks. Then pick a handful of older pages and search your own site's HTML for links pointing at them. Pages you cannot reach by clicking are orphans no matter what the sitemap claims, because a sitemap nominates pages for crawling but does not replace the link graph that discovery actually follows.
The machine check does this exhaustively. Brimm's corpus checks crawl your pages the way Googlebot does, following only real anchor elements, then count the orphans and measure the click depth of every page from home. Paste your link into the full Brimm audit and we will print the disconnected pages and the ones buried too deep, in fix order. While you are restructuring, make sure the pages you connect are worth connecting: titles that say what the page is and one canonical URL per page keep the graph you just built pointing at the right things.