Internal linking is the cheapest ranking lever an agency has. No outreach, no budget approval, no waiting on a client's legal team. And yet it's the first thing that falls off the retainer, because it's fiddly, invisible, and hard to bill.
The problem isn't that agencies don't know internal linking matters. It's that doing it well on one site takes an afternoon of judgment, and doing it across 18 client sites takes a system. This is that system: an internal linking strategy at scale that a mid-level SEO can execute in a few hours a month per client, with QA rules that stop it from going sideways.
Why internal linking breaks at agency scale
Walk into most agency retainers and you'll find one of three patterns:
- The hero pass. Someone did a brilliant internal linking audit during onboarding. It was 2023. Nobody has touched it since, and the site has added 94 posts.
- The writer's whim. Links get added by whoever drafts the post, based on what they happen to remember exists. New content gets linked. Nine-month-old content becomes an orphan.
- The plugin. An automated tool inserts 40 links per page on exact-match anchors. It looks like 2011 and the client's engagement metrics quietly tank.
All three fail for the same reason: internal linking is treated as an event instead of a pipeline. The fix is to split the work into two streams — links that get placed automatically at publish time, and links that get retrofitted in monthly batches — and standardize both.
Step 1: Build the link inventory (30 minutes per site)
You cannot plan links without knowing what already exists. Run a crawl (Screaming Frog, Sitebulb, whatever you already pay for) and export four columns into a single sheet:
- URL
- Unique inlinks — how many distinct pages link to it
- Crawl depth — clicks from homepage
- Primary keyword + current position (join from GSC or your rank tracker)
Then add a fifth column manually: page type — money page, hub, supporting content, or junk. On a 400-page site this takes about 20 minutes with filters.
Now sort by inlinks ascending. Everything with 0-2 unique inlinks that isn't junk is your immediate work queue. On a typical 300-post blog, expect 60-90 pages in that bucket. That's not a crisis; it's a backlog with a number attached, which is exactly what you want when you're scoping hours.
The two metrics that actually move
Report on these monthly, per client:
- Orphan + near-orphan count (pages with ≤2 unique inlinks). Target: under 10% of indexable URLs.
- Depth distribution. Target: 90%+ of money pages at depth ≤3.
Both are pulled from the same crawl export, so the reporting cost is near zero. They also translate into plain English for clients, which matters more than you'd think — see our notes on what clients actually read in SEO reports.
Step 2: Define the destinations before the sources
Most teams do this backwards — they open a post and ask "what should I link to?" That produces random links. Instead, start from the destination.
Pick 10-25 priority destinations per client. These are pages where one or two positions is worth real money:
- Commercial service pages (e.g. /services/shopify-seo)
- Location pages with transactional intent
- Blog posts sitting in positions 8-20 for a decent-volume term — the single highest-ROI bucket, because a 3-position lift can double clicks
- Hub pages you're trying to establish as the canonical answer on a topic
Everything else is a potential source. This inversion is what makes the strategy scalable: you're filling a fixed number of buckets, not auditing an infinite number of pages.
Step 3: The link map
One sheet per client, one row per planned link. Columns:
- Target URL
- Target intent/keyword
- Source URL
- Suggested anchor text
- Context note (which section of the source page)
- Status: planned / placed / QA'd
- Date placed
To populate sources fast, use a site: search for each target's topic — site:client.com "shopify speed" — and grab the top 5-8 results that aren't the target itself. That's a 3-minute job per target. For 20 targets, you've built a 100-row link map in an hour.
The status column is the part people skip and the part that makes it work at scale. Without it, nobody knows which of the 100 rows got implemented, and the next person starts over.
Anchor text rules you can hand to a junior
- 2-5 words, descriptive of the destination
- Roughly 30% exact/near-exact, 50% partial variants, 20% natural phrasing
- Never link the same anchor to two different URLs on the same site — that's how you create keyword cannibalization with your own navigation
- Max one link to the same destination per source page (the first one is what counts anyway)
- Links go in body copy, not stuffed in a "related posts" list at the bottom
Step 4: Push links upstream into the brief
Retrofitting is expensive. Placing a link at draft time costs nothing. So every content brief your agency produces should contain a link block:
- Must link out to: 3-5 URLs with suggested anchors (pulled from the link map)
- Will receive links from: 2-3 existing URLs the editor updates on publish day
That second line is the one everyone forgets. New posts almost always ship with outbound internal links and zero inbound ones. Making "add 3 inbound links" part of the publish checklist means no post is ever born an orphan. If you're already templating briefs — and you should be, for consistency and non-generic AI output — adding the link block costs five minutes per brief.
At a 12-post-per-month content velocity, this alone generates ~36 inbound links to older pages per month, for free, as a byproduct of work you were already billing.
Step 5: Run retrofits as a timed monthly batch
Block 2-3 hours per client per month. Work the link map top-down by target priority. A trained SEO places 10-15 contextual links per hour once the map exists, because the thinking has already been done — they're just opening a page, finding the paragraph, and editing.
Cap it. Do not let a retrofit sprint run open-ended. Twenty links a month, every month, on a 300-page site

Nick Quirk
