Internal Linking Skill
Description
Activate this skill when the user wants to build, audit, or optimise the internal link structure across a set of pages or a full site. Trigger phrases include: "internal linking strategy", "find internal link opportunities", "link these pages together", "internal link map", "suggest anchor text", "fix orphan pages", "internal links for [page or topic]", "link equity distribution".
Input Format
{
"pages": [
{
"title": "string β page or post title",
"url": "string β URL if published, leave blank if not yet live",
"primary_keyword": "string β the keyword this page targets",
"page_type": "pillar | cluster-article | landing-page |
blog-post | product-page",
"content_summary": "string β 1-2 sentences describing the page"
}
],
"focus_page": "string β title of the page you most want to
boost with incoming links",
"cluster_context": "string β optional, paste content cluster
output to inform link map",
"product_pages": ["string β product, signup, pricing, or demo pages that should receive relevant CTAs"],
"audit_findings": "string β optional orphan, cannibalization, or priority findings"
}For a foundational content system, ensure every article has a contextual path to a relevant product, signup, pricing, demo, or next-step page. Do not add the same CTA or exact-match anchor mechanically to every article; match the destination to the readerβs intent.
Link Type Definitions
This skill recognises four distinct link types. Every suggestion must be labelled with one:
| Link Type | Direction | SEO Purpose |
|---|---|---|
| Pillar β Cluster | Pillar page links to cluster post | Distributes authority downward |
| Cluster β Pillar | Cluster post links back to pillar | Consolidates authority upward β highest priority |
| Cluster β Cluster | Cluster post links to related post | Builds semantic depth across the topic |
| Contextual Boost | Any page β focus page | Concentrates link equity on target page |
Rule: Every cluster article must have at least one Cluster β Pillar link. No exceptions.
Anchor Text Rules
Anchor text is critical. Follow these rules on every suggestion:
| Rule | Limit |
|---|---|
| Exact match anchor (keyword as-is) | Max 1 per target page across site |
| Partial match anchor (keyword + words) | Max 2 per target page across site |
| Branded anchor (site or product name) | Unlimited |
| Generic anchor ("click here", "read more") | Never use β flag as error |
| Naked URL as anchor | Avoid unless no alternative |
If the skill detects the same exact-match anchor being used more than once for the same target page, flag it as a Cannibalization Risk in the output.
Output Structure
The skill must always produce output in this exact format:
# Internal Linking Report
## Summary
| Metric | Value |
|---------------------------------|------------|
| Total Pages Analysed | [n] |
| Total Link Opportunities Found | [n] |
| Orphan Pages Detected | [n] |
| Cannibalization Risks | [n] |
| Focus Page Incoming Links | [n] |
| Pages Exceeding Link Limit | [n] |
---
## Orphan Page Alert
Pages with no incoming internal links β these are invisible
to search engines and must be linked immediately:
| Page Title | URL | Fix |
|-----------------------------|----------------------|----------------------------------|
| [title] | [url or "unpublished"]| Link from [suggested source page]|
---
## Link Opportunities
Listed in priority order β highest impact first.
---
### π΄ High Priority β Do These First
**Link [n]**
| Field | Value |
|--------------------|---------------------------------------------------|
| Link Type | [Cluster β Pillar / Pillar β Cluster / etc] |
| Source Page | [title] |
| Target Page | [title] |
| Anchor Text | [suggested anchor text] |
| Anchor Type | Partial match / Exact match / Branded |
| Placement | [Where in the source page β intro / body / CTA] |
| Context Sentence | "[Write the sentence the anchor should appear in, |
| | with anchor text in brackets like [this]]" |
| Impact | [Why this link matters for SEO or AEO] |
---
**Link [n]**
[same format]
---
### π‘ Medium Priority β Do These Second
**Link [n]**
[same format]
---
### π’ Low Priority β Polish Round
**Link [n]**
[same format]
---
## Cannibalization Risks
Anchor text conflicts that could confuse search engines:
| Anchor Text Used | Used On | Points To | Fix |
|---------------------|----------------------|----------------------|----------------------------|
| [anchor] | [source page title] | [target page title] | [alternative anchor text] |
If none detected: β
No cannibalization risks found.
---
## Link Equity Map
Visual representation of how authority flows across the content:
[Focus Page / Pillar: {page title}]
β receives links from:
βββ [Cluster Article 1] β anchor: [text]
βββ [Cluster Article 2] β anchor: [text]
βββ [Cluster Article 3] β anchor: [text]
β sends links to:
βββ [Cluster Article 1] β anchor: [text]
βββ [Cluster Article 2] β anchor: [text]
Cross-links between cluster articles:
[Article 1] β [Article 3] β anchor: [text]
[Article 2] β [Article 4] β anchor: [text]
---
## Links Per Page Check
| Page Title | Incoming Links | Outgoing Links | Status |
|---------------------|----------------|----------------|---------------------------------|
| [title] | [n] | [n] | β
Healthy / β οΈ Too many outgoing|
**Rule:** No page should have more than 100 outgoing internal links.
**Rule:** Focus page should have the highest incoming link count.
---
## Action Checklist
- [ ] All orphan pages have been linked
- [ ] Every cluster article has a Cluster β Pillar link
- [ ] No exact-match anchor used more than once per target
- [ ] No generic anchors ("click here", "read more") present
- [ ] Focus page has the highest incoming link count
- [ ] No page exceeds 100 outgoing internal links
- [ ] Cannibalization risks resolvedExecution Steps
- Read
cluster_contextif provided β use it to understand the pillar/cluster relationships before mapping any links - Index all pages by
page_typeβ pillar pages should receive the most incoming links by default - Run orphan detection β flag any page with zero incoming links from other pages in the input set
- Build semantic overlap matrix β match pages by
primary_keywordsimilarity andcontent_summaryto identify natural linking opportunities - Assign each opportunity a link type from the Link Type Definitions table
- Write a context sentence for every suggestion β the sentence should flow naturally and make the anchor text feel editorially placed, not forced
- Check anchor text across all suggestions β flag any exact-match anchor used more than once for the same target page as a Cannibalization Risk
- Sort all opportunities into High, Medium, and Low priority tiers based on link type and focus page impact
- Build the Link Equity Map showing authority flow
- Run the Links Per Page check β flag any page exceeding 100 outgoing links
- Check product-page paths separately β confirm each foundational article has at least one relevant conversion route
- Execute
scripts/link_suggester.pyto verify semantic overlap scores programmatically β if unavailable, complete manually and note "Script verification skipped" in Summary
Script Reference
Script: scripts/link_suggester.py
Invocation: python scripts/link_suggester.py --pages "[json_array_of_pages]" --focus "[focus_page_title]"
Outputs: semantic similarity scores between pages,
orphan page list, anchor frequency report
Fallback: if script unavailable, complete all checks
manually using the checklists above and note
"Script verification skipped" in the Summary section
Connected Skills
- Receives output from:
content-cluster,content-quality-auditor - Feeds output to:
schema-generator