Internal linking fails in two modes: random (every page points everywhere) and robotic (depth-first without intent). We built a framework for a B2B client with 4k+ templates that respected user intent first, crawl second.
Step one: cluster map, not URL list
We grouped URLs by task—evaluate, integrate, compare, troubleshoot. Each cluster got a parent and two lateral links max on the template. No “related” soup.
Step two: anchor text rules humans can follow
Descriptive anchors for bodies; nav handles brand terms. We banned sitewide auto-insert of money keywords into sentences that did not contain the concept.
Step three: programmatic guardrails
Rule example:
IF page.type == "integration_guide"
THEN link.parent = product_hub
AND link.lateral IN (auth_doc, rate_limits_doc)
UNLESS user journey flag == "evaluator" → add pricing_compare
Engineering implemented as data in the build, not as a WordPress plugin guessing context.
Measurement
We watched engaged sessions per entry page and search console position on head terms—not raw “internal link count.”
Where this breaks down
When product renames SKUs monthly and the graph rots. When SEO asks for links finance has not approved on regulated pages.
Our read
Scale without intent is noise. We link the way a good sales engineer hands someone the next document—not every PDF in the folder.