Skip to content
← Back to blog
Engineering

AI internal linking: a PR-review workflow that scales

AI internal linking breaks first when publishing speeds up. How to add a link-suggestion step, review additions like a PR diff, and audit link equity.

By Mitrasish, Co-founderAug 6, 202613 min read
AI internal linking: a PR-review workflow that scales

Internal linking is the first thing to break when you publish faster. A human writer half-remembers what they wrote last quarter and drops in a link out of habit. An AI writer has no such habit. It sees the draft in front of it and nothing else, so AI internal linking either doesn't happen at all or happens badly: generic anchors, no anchor diversity, links to whatever the model half-recalls from its own training data instead of what's actually on your site.

The fix isn't a smarter prompt. It's building link suggestion into your content pipeline as a diffable, reviewable step, the same way you already gate code changes, and then auditing the resulting link graph on a schedule instead of assuming it stays healthy on its own.

Why AI internal linking breaks down first when publishing speeds up

Every other SEO task degrades gracefully when you scale AI writing. A weak headline still ranks for something. A thin section still gets indexed. Internal linking doesn't degrade, it goes to zero, because a model drafting a post in isolation has no reason to produce a link unless something forces it to look outward.

Ask an LLM to write a blog post and you get a self-contained document. It does not know what else lives in content/blog/, what clusters you've built, or which posts are currently orphaned and need an inbound link more than others. Unless you explicitly feed it that context, every draft starts from zero internal links and stays there unless a human adds them by hand afterward, which is exactly the manual bottleneck we covered in internal linking automation: holding your entire back catalog in your head gets impossible past a few dozen posts, and an AI writer has even less of that context than a human does by default.

This is the same blind spot that makes raw output from a tool like ChatGPT unpublishable on its own: a single prompt gives you fluent prose with no awareness of what you've already written, so it can't link to it, can't avoid duplicating it, and can't tell you which of your existing posts the new one should reinforce.

The orphan-page math gets worse, not better, as volume goes up

The intuition says more posts means more link opportunities, and that's true in theory. In practice, more posts published faster means more posts that never get a first inbound link, because nobody goes back to update older posts once the new one ships. Google is explicit that every page you care about should have a link from at least one other page on your site, both as a relevancy signal and as how crawlers find the page at all. A blog publishing five posts a week without a linking step is manufacturing orphan pages five times a week, not once in a while.

The scale of this problem tracks the scale of AI adoption in content generally. An April 2025 Ahrefs analysis of 900,000 newly created English-language webpages found 74.2% contained at least some AI-generated content, split between 2.5% pure AI and 71.7% a human and AI mix, and a companion survey of 879 marketers found 87% already use AI to create or assist with content. Most of the web is now publishing at a speed that has no equivalent human habit of "go back and link the old stuff."

Yes, but only when the suggestion step is grounded in your actual post graph and constrained by explicit rules, not left to a model's judgment about what feels relevant. Three checks decide whether an AI-suggested link is safe to ship: topical relevance, anchor diversity, and a hard cap on link volume.

Topical relevance, not keyword matching

The cheap version of link suggestion scans for shared words and links anything that mentions a similar term. That's keyword matching, and it produces exactly the kind of irrelevant links a reviewer has to catch by hand. The right version does semantic matching: does this post genuinely belong in the same cluster or answer a related buyer question, the methodology we cover in semantic SEO automation.

The gap between the two approaches is bigger than most teams assume. A LinkStorm study of 2.5 million contextual internal links across 1,700 websites found only 8% of anchors were strongly topically aligned with their target page (a similarity score above 0.7), while 28% showed no meaningful similarity at all. That's not a niche failure mode, it's the majority pattern: most internal linking in the wild, AI-assisted or not, is closer to keyword adjacency than genuine topical relevance. An AI suggestion step that isn't explicitly built to clear that 0.7 bar will reproduce the same 28% problem at whatever speed you're now publishing.

Which cluster a post belongs to is the input a relevance check should actually read from, since topic cluster strategy is what defines "genuinely related" in the first place. A suggester that only sees flat text similarity, with no concept of your cluster taxonomy, will happily link two posts that share vocabulary but serve unrelated buyer questions.

Anchor text diversity across the whole target page, not just the new post

A single new post rarely creates an anchor concentration problem on its own. The concentration builds up across dozens of posts each contributing one more link to the same popular target, all using a similar phrase because that phrase is the obvious one. Google recommends anchor text be descriptive, reasonably concise, and relevant, and explicitly warns against generic anchors like "click here" and against keyword-stuffed anchors, which its spam policies treat as link spam.

The same LinkStorm dataset found 81% of anchors were keyword-rich and 61% contained just one to three words, the pattern that produces concentration at scale even when no single post is the offender. Checking anchor diversity means checking the target page's existing inbound anchors, not just the anchor the new draft wants to use, which is why the link-suggestion step needs access to the whole graph and not just the new post's text.

One link per target page per new post is the practical rule. If a draft mentions a topic five times, the strongest mention gets the link, not all five. This matters more, not less, once suggestions are automated, because a model with no cap will happily link the same target from every paragraph that mentions it, and John Mueller has warned about exactly that outcome: "if you do dilute the value of your site structure by having so many internal links that we don't see a structure anymore, then that does make it harder for us to understand what you think is important on your website."

Building an AI internal linking step into your content pipeline

A link-suggestion step is a pipeline stage that runs after the draft is written and before it's proposed for merge. It reads two things the draft alone can't provide, your existing post graph and your anchor history, and it outputs something a human can review in seconds rather than something that just appears already inserted.

Feed the model the existing post graph, not just the new draft

The single change that fixes most bad AI internal linking is giving the model the list of existing posts, their clusters, their tags, and their current inbound anchors before it drafts a single suggestion. Without that context, a model can only guess. With it, the task changes from "invent plausible-sounding links" to "match this new post against a known, bounded set of candidates," which is a much narrower and more checkable job.

This is the same principle behind why autonomous AI SEO agents that stop at a pull request are structurally different from ones that auto-publish: seeing the whole repo, not just the current task, is what lets an agent link a new post into the existing graph and add inbound links from related posts in the same pass, instead of shipping something that has to be manually cross-referenced afterward.

The output of the suggestion step should be a small, structured list, not links silently inserted into prose. Each row needs three fields: the target URL, the exact anchor text, and the sentence the link would sit in. That shape is what turns a link suggestion from a black box into something reviewable:

code
target: /blog/topic-cluster-strategy-2026/
anchor: "topic cluster strategy"
sentence: "Which cluster a post belongs to is the input a
           relevance check should read from, since topic
           cluster strategy is what defines 'genuinely
           related' in the first place."

A reviewer scanning five of these can approve four and reject the fifth in under a minute. A reviewer scanning a 2,000-word post looking for which sentences quietly got a link inserted cannot do that at all.

Treat link suggestions the way you treat any other code change: as a diff that has to be read before it merges, not a feature you trust and ship. This is the same control-model question that decides whether an AI SEO agent is safe to connect to your CMS at all: does a human decision happen before the change goes live, or does the tool publish first and hope nobody notices a bad link.

When a link-suggestion step is wired into a Git-based blog, its output shows up as part of the same pull request that adds the new post: the new markdown file, plus a small set of line-level edits to older posts adding an inbound link each. A reviewer opens the PR and sees exactly what changed, in the same view they'd use to review any other content edit, target, anchor, and surrounding sentence all visible in the diff itself.

That's a meaningfully different experience from a dashboard that applies link changes directly to a live page, or a spreadsheet-style review where each suggestion sits in its own cell disconnected from the sentence around it. A rendered diff in a pull request is the format editors already know how to review quickly, which is the whole point of putting the step there instead of somewhere else in the pipeline.

Three failure modes show up reliably in an AI-suggested link diff, and all three are easy to catch if the reviewer knows to look:

  1. Irrelevant targets. The suggested link is topically adjacent but not actually related, the exact failure mode a semantic relevance check should have filtered out before the diff reached review.
  2. Repeated anchors. The same target page keeps getting the identical anchor phrase across successive PRs, building toward the concentration problem even though each individual PR looks fine in isolation.
  3. Dead slugs. The suggested target was renamed or removed since the model's context was last refreshed, and the link points at a slug that 404s. A GitHub Actions broken-link check running on every content PR is the mechanical backstop for exactly this case: it catches a dead-slug link before merge regardless of whether the human reviewer happened to click it.

None of these three require deep editorial judgment to catch, which is exactly why they belong in a review step instead of being left to trust. A reviewer checking a rendered diff against these three patterns takes a fraction of the time a full manual internal-linking pass would, while still keeping a human decision in the loop before anything ships.

Reviewing each PR's link additions catches problems at the point of insertion. It does not catch problems that accumulate slowly across dozens of individually-fine PRs, an anchor phrase that was reasonable the first three times and manipulative by the twentieth, or a post that never received an inbound link because nothing after it happened to mention its topic. That's what a periodic link-graph audit is for, and it's the same discipline you'd apply to any other system you've put on autopilot: check the aggregate output, not just each individual step.

Finding orphan pages and anchor-text concentration after the fact

An orphan-page audit is a straightforward query against your own content: for every published post, does at least one other post link to it? Anything with zero inbound links is an orphan, full stop, and Google's own guidance is that every page you care about should have a link from at least one other page on your site. On a blog publishing at AI-assisted speed, this check has to run against the whole archive, not just the newest posts, because the review step described above only catches problems in the PR it runs on; it says nothing about posts published six months ago that never picked up a link from anything written since.

Anchor concentration is the second half of the same audit: for each of your highest-value target pages, pull every inbound anchor across the whole site and check the distribution. If one exact-match phrase accounts for most of the links to your pricing page, that's the pattern Google's spam guidance calls out, even if every individual link was added in good faith by a different PR months apart. Rotating anchor language deliberately, exact-match sometimes, descriptive often, branded occasionally, is what keeps that distribution from drifting toward concentration as more posts accumulate.

How often to re-run the audit as post count grows

Tie the link-graph audit to the same cadence you already use for content refresh, since both are periodic passes over the existing archive rather than one-time fixes. Content refresh strategy recommends a quarterly cycle for an active blog's top pages, and a link audit fits the same rhythm: run it every quarter, and again after any batch of posts that shipped during a period when the review step was skipped or under-resourced. The audit doesn't need to be exhaustive every time. It needs to happen often enough that an orphan page or a concentrated anchor gets caught within a few months of appearing, not a few years.

The volume math is the reason this can't just be an annual chore. A blog adding dozens of AI-assisted posts a quarter changes its link graph faster than a blog adding a handful a year, so the audit interval has to scale down as publishing speed scales up, the same relationship that makes the PR-review step non-optional in the first place.

AI internal linking only works when link suggestions are grounded in your real post graph, reviewed as a diff before they merge, and audited on a schedule as the archive grows. Lyra builds that into the pipeline itself: she sees your whole blog, suggests links with diversified anchors, and opens every addition as a pull request you approve before it ships.

Try Lyra → · see the plans

FAQ

Frequently asked

Can AI reliably suggest internal links for a blog post?+

Only if it is grounded in your actual post graph, not just the new draft. A model with no visibility into your back catalog will suggest generic or keyword-matched links, or none at all. Feed it the existing posts, clusters, and anchor history, and treat every suggestion as a proposal to review, not an action to auto-apply.

How should you review AI-suggested internal links before they ship?+

The same way you review a code change: as a diff. Each suggested link should show the target post, the exact anchor text, and the sentence it sits in, so a reviewer can approve, edit, or reject it in seconds without re-reading the whole draft.

What is anchor text concentration and why does it matter for SEO?+

It is what happens when a page accumulates too many links using the same exact-match anchor. Google's own spam policies name aggressive, optimized anchor text as a link spam signal, so a target page that always gets linked with the identical phrase reads as manipulation rather than editorial linking, even if every individual link is genuine.

How often should you audit internal links on an AI-scaled blog?+

Run a link-graph audit every time you'd otherwise refresh content, roughly quarterly for an active blog, and after any batch of posts that came from a period without review discipline. Check for orphan pages, anchor concentration on your top conversion targets, and links pointing at slugs that no longer exist.

Built by the tool you're reading about

This post is the kind of thing Lyra ships on her own.

Lyra finds the topics worth ranking for, writes them in your repo's voice, fact-checks every claim, and opens a pull request scored and ready to merge. You review and hit merge. Want to see what she'd write for you? Start free with three posts, no card.

AI Internal LinkingInternal Linking Strategy SEOLink Suggestion AIInternal Link AuditPR Review Internal LinksAnchor Text Diversity