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.