Our services

If you can think it, we can make it brainsoft.

Internal linking for a site with a few hundred pages

Written By: BrainSoft In SEO

A few hundred pages is the awkward middle. Too many to link by hand in a spreadsheet without losing your mind, too few to justify a big graph database or a link-recommendation tool. Most of these sites grew organically: someone added a blog, someone else added a services section, and now the only pages with decent internal links are the ones in the main menu.

The fix is not a plugin. It is a short audit to find orphans and weak pages, a deliberate hub-and-spoke structure for each topic, and contextual links written by whoever knows the content. Below is the process I run on client sites of this size, start to finish.

Step 1: crawl the site and get the link graph

You cannot reason about internal links from memory. Crawl the site and export the inlinks for every URL. I usually use a local crawl with a simple tool so I can query the output.

npx site-crawler-cli https://example.com --output crawl.json --max-pages 1000

If you already have Screaming Frog or a similar crawler, export the "All Inlinks" report instead. What matters is a per-URL count of internal links pointing at it, plus the source URL of each link.

Step 2: find orphans and near-orphans

An orphan has zero internal inlinks. A near-orphan has one or two, usually from a sitemap page or a paginated archive nobody reads. Both are the first thing to fix, because everything else assumes the page is reachable.

const pages = require('./crawl.json').pages;
const weak = pages.filter(p => p.inlinks.length < 3);
console.log(weak.map(p => `${p.inlinks.length}\t${p.url}`).join('\n'));

Cross-check against your sitemap. Any URL in the sitemap that is not in the crawl output is either blocked or truly orphaned. That mismatch is almost always a real bug, not a crawler quirk.

Step 3: group pages into topics and pick a hub for each

With a few hundred pages you will end up with something like eight to fifteen topics. For each one, pick a single hub page: a category page, a pillar article, a service overview. The hub links down to every page in its topic, and every page in the topic links back up to the hub. That alone resolves most orphans.

  • Hub pages get linked from the main navigation or a footer section, so they always have inlinks.
  • Spokes link up to the hub in the first or last paragraph, not buried in a sidebar.
  • Cross-topic links are fine but keep them rare. Two or three per page is plenty.

If you are unsure where a page belongs, the answer is usually the topic of the page it most resembles in intent. A comparison post belongs with the product it compares, not with generic blog content.

Step 4: write contextual links, then automate the boring checks

The links that actually help readers are the ones written into sentences. "We covered the migration in detail when we moved the billing service" with a link on "moved the billing service" beats a "Related articles" box every time. Ask whoever wrote the page to add two or three, pointing at the pages they would send a colleague to.

Then automate the hygiene. A small script that flags broken internal links, links to redirects, and pages that lost inlinks since the last crawl will save you a monthly manual pass.

const broken = pages.flatMap(p =>
  p.links.filter(l => l.internal && l.status >= 400)
   .map(l => `${p.url} -> ${l.href} (${l.status})`)
);
console.log(broken.join('\n'));

Run this after every content release. Ten minutes of cleanup beats a quarterly panic. If you want help setting up the crawl and the checks as part of a broader quality process, get in touch.

Frequently asked questions

How many internal links should each page have?

There is no magic number. A page needs at least one link from a page that is itself well linked, plus a link back to its hub. Beyond that, add links where they help a reader move to the next relevant page. Five to ten contextual links per long article is normal.

Should I use a related-posts plugin instead of manual links?

Use both, but treat the plugin as a floor, not a ceiling. Automatic related links keep orphans from appearing, but they are generic. The manual links in the body are what readers actually click.

How often should I re-run the audit?

Monthly is enough for a few hundred pages. Run it immediately after any content migration or URL change, because that is when broken internal links and new orphans appear in bulk.


#SEO