Backlink Profile Analysis

Backlink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis.

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit AgriciDaniel/claude-seo/skills/seo-backlinks#main ~/.claude/skills/seo-backlinks

For one project only, change the path to .claude/skills/seo-backlinks. This skill also uses backlinks_auth.py, moz_api.py, keywordseverywhere_api.py, commoncrawl_graph.py, bing_webmaster.py, verify_backlinks.py — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text304 lines
seo-backlinks/SKILL.md304 lines15.0 KBpushed 11d agoRawView on GitHub

Backlink Profile Analysis

Source Detection

Before analysis, detect available data sources:

  1. DataForSEO MCP (premium): Check if dataforseo_backlinks_summary tool is available
  2. Moz API (free signup): "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check moz --json
  3. Bing Webmaster (free signup): "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check bing --json
  4. Keywords Everywhere (free signup, single-metric): "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check keywordseverywhere --json
  5. Common Crawl (always available): Domain-level graph with PageRank
  6. Verification Crawler (always available): Checks if known backlinks still exist

Run "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check --json to detect all sources at once.

If no sources are configured beyond the always-available tier:

  • Still produce a report using Common Crawl domain metrics
  • Suggest: "Run /seo backlinks setup to add free Moz and Bing API keys for richer data"

Quick Reference

Command Purpose
/seo backlinks <url> Full backlink profile analysis (uses all available sources)
/seo backlinks gap <url1> <url2> Competitor backlink gap analysis
/seo backlinks toxic <url> Toxic link detection and disavow recommendations
/seo backlinks new <url> New and lost backlinks (DataForSEO only)
/seo backlinks verify <url> --links <file> Verify known backlinks still exist
/seo backlinks setup Show setup instructions for free backlink APIs

Analysis Framework

Produce all 7 sections below. Each section lists data sources in preference order.

1. Profile Overview

DataForSEO: dataforseo_backlinks_summary → total backlinks, referring domains, domain rank, follow ratio, trend.

Moz API: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py metrics <url> --json → Domain Authority, Page Authority, Spam Score, linking root domains, external links.

Keywords Everywhere: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run keywordseverywhere_api.py rank <domain> --json → 0-10 domain rank only (no link counts). Use as a fallback when Moz isn't configured; do not use in place of Moz when both are available.

Common Crawl: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run commoncrawl_graph.py <domain> --json → PageRank, harmonic centrality, and low-confidence rank/presence data.

Scoring:

Metric Good Warning Critical
Referring domains >100 20-100 <20
Follow ratio >60% 40-60% <40%
Domain diversity No single domain >5% 1 domain >10% 1 domain >25%
Trend Growing or stable Slow decline Rapid decline (>20%/quarter)

2. Anchor Text Distribution

DataForSEO: dataforseo_backlinks_anchors

Moz API: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py anchors <url> --json

Bing Webmaster: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run bing_webmaster.py links <url> --json (extract anchor text from link details)

Healthy distribution benchmarks:

Anchor Type Target Range Over-Optimization Signal
Branded (company/domain name) 30-50% <15%
URL/naked link 15-25% N/A
Generic ("click here", "learn more") 10-20% N/A
Exact match keyword 3-10% >15%
Partial match keyword 5-15% >25%
Long-tail / natural 5-15% N/A

Flag if exact-match anchors exceed 15% as a review heuristic; it may indicate unnatural or link-spam patterns.

3. Referring Domain Quality

DataForSEO: dataforseo_backlinks_referring_domains

Moz API: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py domains <url> --json → domains with DA scores

Common Crawl: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run commoncrawl_graph.py <domain> --json → domain-level rank/presence data, no verified referring-domain counts

Analyze:

  • TLD distribution: .edu, .gov, .org = high authority. Excessive .xyz, .info = low quality
  • Country distribution: Match target market. 80%+ from irrelevant countries = PBN signal
  • Domain rank distribution: Healthy profiles have links from all authority tiers
  • Follow/nofollow per domain: Sites that only nofollow = limited SEO value

4. Toxic Link Detection

DataForSEO: dataforseo_backlinks_bulk_spam_score + toxic patterns from reference

Moz API: Raw vendor spam_score from "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py metrics <url> --json (source-label the value; apply thresholds only if verified against current Moz docs)

Verification Crawler: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run verify_backlinks.py --target <url> --links <file> --json (verify suspicious links still exist)

High-risk indicators (flag immediately):

  • Links from known PBN (Private Blog Network) domains
  • Unnatural anchor text patterns (100% exact match from a domain)
  • Links from penalized or deindexed domains
  • Mass directory submissions (50+ directory links)
  • Link farms (sites with 10K+ outbound links per page)
  • Paid link patterns (footer/sidebar links across all pages of a domain)

Medium-risk indicators (review manually):

  • Links from unrelated niches
  • Reciprocal link patterns
  • Links from thin content pages (<100 words)
  • Excessive links from a single domain (>50 backlinks from 1 domain)

Load ../seo/references/backlink-quality.md for the full 30 toxic patterns and disavow criteria.

5. Top Pages by Backlinks

DataForSEO: dataforseo_backlinks_backlinks with target type "page"

Moz API: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py pages <domain> --json

Find:

  • Which pages attract the most backlinks
  • Pages with high-authority links (link magnets)
  • Pages with zero backlinks (internal linking opportunities)
  • 404 pages with backlinks (redirect opportunities to reclaim link equity)

6. Competitor Gap Analysis

DataForSEO: dataforseo_backlinks_referring_domains for both domains, then compare

Bing Webmaster: "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run bing_webmaster.py compare <url1> <url2> --json only when both properties are registered and accessible to the same Bing API account. For arbitrary competitors, use DataForSEO, Moz, or Common Crawl.

Moz API: Compare DA/PA between domains via "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py metrics <url> --json for each

Output:

  • Domains linking to competitor but NOT to target = link building opportunities
  • Domains linking to both = validate existing relationships
  • Domains linking only to target = competitive advantage
  • Top 20 link building opportunities with domain authority

7. New and Lost Backlinks

DataForSEO only: dataforseo_backlinks_backlinks with date filters for 30/60/90 day changes

Verification Crawler: For known links, verify current status with "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run verify_backlinks.py --target <url> --links <file> --json

Note: Free sources cannot track new/lost links over time. If this section is requested without DataForSEO, inform the user: "Link velocity tracking requires the DataForSEO extension. Free sources provide point-in-time snapshots only."

Red flags:

  • Sudden spike in new links (possible negative SEO attack)
  • Sudden loss of many links (site penalty or content removal)
  • Declining velocity over 3+ months (content not attracting links)

Backlink Health Score

Calculate a 0-100 score. When mixing sources, apply confidence weighting:

Factor Weight Sources (preference order) Confidence
Referring domain count 20% DataForSEO > Moz 1.0 / 0.85
Domain quality distribution 20% DataForSEO > Moz DA distribution 1.0 / 0.85
Anchor text naturalness 15% DataForSEO > Moz > Bing anchors 1.0 / 0.85 / 0.70
Toxic link ratio 20% DataForSEO > Moz spam score 1.0 / 0.85
Link velocity trend 10% DataForSEO only 1.0
Follow/nofollow ratio 5% DataForSEO > Bing details 1.0 / 0.70
Geographic relevance 10% DataForSEO > Bing country 1.0 / 0.70

Data sufficiency gate: Count how many of the 7 factors have at least one data source available.

  • 4+ factors with data: Produce a numeric 0-100 score (redistribute missing weights proportionally)
  • Fewer than 4 factors: Do NOT produce a numeric score. Instead display:
    Backlink Health Score: INSUFFICIENT DATA (X/7 factors scored)
    
    Show individual factor scores that ARE available with their source and confidence. Recommend: "Configure Moz API (free) for a scoreable profile. Run /seo backlinks setup"

MUST NOT: score what you did not measure

When Common Crawl is the only available source, you MUST NOT produce a numeric score of any kind -- not a health score, not a per-factor score, not an "approximate" or "estimated" figure. Common Crawl supplies rank and presence signals only. Report low-confidence rank/presence data and the literal string Not Assessed in place of every number.

A finding written with source: not-assessed MUST NOT carry a numeric score.

A numeric score with fewer than 4 data sources is misleading: it implies poor health when the reality is that we simply lack data.

Validation gate (required, not optional)

This rule has been stated in this skill before and was violated anyway, so it is now checkable. Before writing any backlink output, run the validator:

"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run validate_backlink_report.py --report <report>.json --json

Pass the sources you actually collected (cc_data, moz_data, bing_data, dataforseo_data, scoring_factors, and your findings list). The source_score_consistency check fails the report with status: FAIL when:

  • a numeric score is present but no scoreable source (Moz, Bing, or DataForSEO) supplied data -- i.e. the Common-Crawl-only case, and
  • any finding marked source: not-assessed carries a numeric score, value, or health_score.

If the validator returns status: FAIL, do not present the report. Fix the findings -- replace the offending numbers with Not Assessed -- and re-run until it passes.

Output Format

Backlink Health Score: XX/100 (or INSUFFICIENT DATA)

Section Status Score Data Source
Profile Overview pass/warn/fail XX/100 Moz (0.85)
Anchor Distribution pass/warn/fail XX/100 Moz (0.85)
Referring Domain Quality pass/warn/fail XX/100 CC (0.50)
Toxic Links pass/warn/fail XX/100 Moz Spam (0.85)
Top Pages info N/A Moz (0.85)
Link Velocity pass/warn/fail XX/100 DataForSEO only

Critical Issues (fix immediately)

High Priority (fix within 1 month)

Medium Priority (ongoing improvement)

Link Building Opportunities (top 10)

Error Handling

Error Cause Resolution
No sources configured No API keys, no DataForSEO Run /seo backlinks setup
Moz rate limit Free tier: 1 req/10s Wait 10 seconds, retry. Built into script.
Bing site not verified Site not verified in Bing Verify at https://www.bing.com/webmasters
CC download timeout Large graph file, slow connection Use --timeout 180 flag
DataForSEO unavailable Extension not installed Run ./extensions/dataforseo/install.sh
No backlink data returned Domain too new or very small Note: small sites may have <10 backlinks

Fallback cascade:

  1. DataForSEO available? → Use as primary (confidence: 1.0)
  2. Moz configured? → Use for DA/PA/spam/anchors (confidence: 0.85)
  3. Bing configured? → Use for registered-property links and comparison only when both properties are accessible (confidence: 0.70)
  4. Moz not configured but Keywords Everywhere is? → Use for a Profile Overview rank-only fallback (confidence: 0.60; single metric, no link counts/anchors)
  5. Always: Common Crawl for domain-level metrics (confidence: 0.50)
  6. Always: Verification crawler for known link checks (confidence: 0.95)
  7. Nothing works? → "Run /seo backlinks setup to configure free APIs"

Pre-Delivery Review (MANDATORY)

Before presenting any backlink analysis to the user, run this checklist internally. Do NOT skip this step. Fix any issues found before showing the report.

Fact-Check Every Claim

  • Schema claims: Did parse_html return @type for each block? If any @type is missing, re-check, it may use @graph wrapper (valid JSON-LD, not malformed).
  • "link_removed" findings: Is the page JS-rendered? If unverifiable_js, say so, never report a JS-rendered page as "link removed" (that's a false negative).
  • H1 findings: Are any H1s in the h1_suspicious list? If so, note they are likely counters/stats, not semantic headings.
  • Reciprocal links: If site A links to site B AND B links back to A, flag it as a reciprocal link pattern. Check outbound links against verified inbound sources.
  • Health score: Are 4+ of 7 factors scored? If not, report INSUFFICIENT DATA, never show a misleading numeric score.

Verify Data Source Labels

  • Every metric in the report has a source label (e.g., "Parsed (0.95)", "CC (0.50)")
  • Every "not found" result distinguishes between "not crawled" vs "below threshold" vs "error"
  • Social media pages flagged as unverifiable_js (not link_removed)

Cross-Check Consistency

  • Platform detection matches actual signals (check for wp-content, shopify CDN, etc.)
  • Referring domain count in summary matches the actual verified links list
  • No claim is presented without a data source backing it

If ANY check fails, fix the finding before presenting. Never present inferred data as fact.

Post-Analysis

After completing any backlink analysis command, always offer: "Generate a professional PDF report? Use /seo google report"

Reference Documentation

Load on demand (do NOT load at startup):

  • skills/seo/references/backlink-quality.md -- Detailed toxic link patterns and scoring methodology (shared reference, load when analyzing toxic links or spam scores)
  • skills/seo/references/free-backlink-sources.md -- Source comparison, confidence weighting, setup guides (shared reference, load when configuring free backlink APIs)
1---
2name: seo-backlinks
3description: "Backlink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis. Works with free APIs (Moz, Bing Webmaster, Common Crawl) and DataForSEO extension. Use when user says backlinks, link profile, referring domains, anchor text, toxic links, link gap, link building, disavow, or backlink audit."
4user-invocable: true
5argument-hint: "<url>"
6license: MIT
7compatibility: "Free: Common Crawl + verify always available. Optional: Moz API, Bing Webmaster, Keywords Everywhere (free signup). Premium: DataForSEO extension."
8metadata:
9 author: AgriciDaniel
10 version: "2.3.1"
11 category: seo
12---
13 
14# Backlink Profile Analysis
15 
16## Source Detection
17 
18Before analysis, detect available data sources:
19 
201. **DataForSEO MCP** (premium): Check if `dataforseo_backlinks_summary` tool is available
212. **Moz API** (free signup): `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check moz --json`
223. **Bing Webmaster** (free signup): `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check bing --json`
234. **Keywords Everywhere** (free signup, single-metric): `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check keywordseverywhere --json`
245. **Common Crawl** (always available): Domain-level graph with PageRank
256. **Verification Crawler** (always available): Checks if known backlinks still exist
26 
27Run `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run backlinks_auth.py --check --json` to detect all sources at once.
28 
29If no sources are configured beyond the always-available tier:
30- Still produce a report using Common Crawl domain metrics
31- Suggest: "Run `/seo backlinks setup` to add free Moz and Bing API keys for richer data"
32 
33## Quick Reference
34 
35| Command | Purpose |
36|---------|---------|
37| `/seo backlinks <url>` | Full backlink profile analysis (uses all available sources) |
38| `/seo backlinks gap <url1> <url2>` | Competitor backlink gap analysis |
39| `/seo backlinks toxic <url>` | Toxic link detection and disavow recommendations |
40| `/seo backlinks new <url>` | New and lost backlinks (DataForSEO only) |
41| `/seo backlinks verify <url> --links <file>` | Verify known backlinks still exist |
42| `/seo backlinks setup` | Show setup instructions for free backlink APIs |
43 
44## Analysis Framework
45 
46Produce all 7 sections below. Each section lists data sources in preference order.
47 
48### 1. Profile Overview
49 
50**DataForSEO:** `dataforseo_backlinks_summary` → total backlinks, referring domains, domain rank, follow ratio, trend.
51 
52**Moz API:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py metrics <url> --json` → Domain Authority, Page Authority, Spam Score, linking root domains, external links.
53 
54**Keywords Everywhere:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run keywordseverywhere_api.py rank <domain> --json` → 0-10 domain rank only (no link counts). Use as a fallback when Moz isn't configured; do not use in place of Moz when both are available.
55 
56**Common Crawl:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run commoncrawl_graph.py <domain> --json` → PageRank, harmonic centrality, and low-confidence rank/presence data.
57 
58**Scoring:**
59 
60| Metric | Good | Warning | Critical |
61|--------|------|---------|----------|
62| Referring domains | >100 | 20-100 | <20 |
63| Follow ratio | >60% | 40-60% | <40% |
64| Domain diversity | No single domain >5% | 1 domain >10% | 1 domain >25% |
65| Trend | Growing or stable | Slow decline | Rapid decline (>20%/quarter) |
66 
67### 2. Anchor Text Distribution
68 
69**DataForSEO:** `dataforseo_backlinks_anchors`
70 
71**Moz API:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py anchors <url> --json`
72 
73**Bing Webmaster:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run bing_webmaster.py links <url> --json` (extract anchor text from link details)
74 
75**Healthy distribution benchmarks:**
76 
77| Anchor Type | Target Range | Over-Optimization Signal |
78|-------------|-------------|-------------------------|
79| Branded (company/domain name) | 30-50% | <15% |
80| URL/naked link | 15-25% | N/A |
81| Generic ("click here", "learn more") | 10-20% | N/A |
82| Exact match keyword | 3-10% | >15% |
83| Partial match keyword | 5-15% | >25% |
84| Long-tail / natural | 5-15% | N/A |
85 
86Flag if exact-match anchors exceed 15% as a review heuristic; it may indicate unnatural or link-spam patterns.
87 
88### 3. Referring Domain Quality
89 
90**DataForSEO:** `dataforseo_backlinks_referring_domains`
91 
92**Moz API:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py domains <url> --json` → domains with DA scores
93 
94**Common Crawl:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run commoncrawl_graph.py <domain> --json` → domain-level rank/presence data, no verified referring-domain counts
95 
96Analyze:
97- **TLD distribution**: .edu, .gov, .org = high authority. Excessive .xyz, .info = low quality
98- **Country distribution**: Match target market. 80%+ from irrelevant countries = PBN signal
99- **Domain rank distribution**: Healthy profiles have links from all authority tiers
100- **Follow/nofollow per domain**: Sites that only nofollow = limited SEO value
101 
102### 4. Toxic Link Detection
103 
104**DataForSEO:** `dataforseo_backlinks_bulk_spam_score` + toxic patterns from reference
105 
106**Moz API:** Raw vendor spam_score from `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py metrics <url> --json` (source-label the value; apply thresholds only if verified against current Moz docs)
107 
108**Verification Crawler:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run verify_backlinks.py --target <url> --links <file> --json` (verify suspicious links still exist)
109 
110**High-risk indicators (flag immediately):**
111- Links from known PBN (Private Blog Network) domains
112- Unnatural anchor text patterns (100% exact match from a domain)
113- Links from penalized or deindexed domains
114- Mass directory submissions (50+ directory links)
115- Link farms (sites with 10K+ outbound links per page)
116- Paid link patterns (footer/sidebar links across all pages of a domain)
117 
118**Medium-risk indicators (review manually):**
119- Links from unrelated niches
120- Reciprocal link patterns
121- Links from thin content pages (<100 words)
122- Excessive links from a single domain (>50 backlinks from 1 domain)
123 
124Load `../seo/references/backlink-quality.md` for the full 30 toxic patterns and disavow criteria.
125 
126### 5. Top Pages by Backlinks
127 
128**DataForSEO:** `dataforseo_backlinks_backlinks` with target type "page"
129 
130**Moz API:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py pages <domain> --json`
131 
132Find:
133- Which pages attract the most backlinks
134- Pages with high-authority links (link magnets)
135- Pages with zero backlinks (internal linking opportunities)
136- 404 pages with backlinks (redirect opportunities to reclaim link equity)
137 
138### 6. Competitor Gap Analysis
139 
140**DataForSEO:** `dataforseo_backlinks_referring_domains` for both domains, then compare
141 
142**Bing Webmaster:** `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run bing_webmaster.py compare <url1> <url2> --json`
143only when both properties are registered and accessible to the same Bing API
144account. For arbitrary competitors, use DataForSEO, Moz, or Common Crawl.
145 
146**Moz API:** Compare DA/PA between domains via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run moz_api.py metrics <url> --json` for each
147 
148Output:
149- Domains linking to competitor but NOT to target = link building opportunities
150- Domains linking to both = validate existing relationships
151- Domains linking only to target = competitive advantage
152- Top 20 link building opportunities with domain authority
153 
154### 7. New and Lost Backlinks
155 
156**DataForSEO only:** `dataforseo_backlinks_backlinks` with date filters for 30/60/90 day changes
157 
158**Verification Crawler:** For known links, verify current status with `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run verify_backlinks.py --target <url> --links <file> --json`
159 
160**Note:** Free sources cannot track new/lost links over time. If this section is requested without DataForSEO, inform the user: "Link velocity tracking requires the DataForSEO extension. Free sources provide point-in-time snapshots only."
161 
162**Red flags:**
163- Sudden spike in new links (possible negative SEO attack)
164- Sudden loss of many links (site penalty or content removal)
165- Declining velocity over 3+ months (content not attracting links)
166 
167## Backlink Health Score
168 
169Calculate a 0-100 score. When mixing sources, apply confidence weighting:
170 
171| Factor | Weight | Sources (preference order) | Confidence |
172|--------|--------|---------------------------|------------|
173| Referring domain count | 20% | DataForSEO > Moz | 1.0 / 0.85 |
174| Domain quality distribution | 20% | DataForSEO > Moz DA distribution | 1.0 / 0.85 |
175| Anchor text naturalness | 15% | DataForSEO > Moz > Bing anchors | 1.0 / 0.85 / 0.70 |
176| Toxic link ratio | 20% | DataForSEO > Moz spam score | 1.0 / 0.85 |
177| Link velocity trend | 10% | DataForSEO only | 1.0 |
178| Follow/nofollow ratio | 5% | DataForSEO > Bing details | 1.0 / 0.70 |
179| Geographic relevance | 10% | DataForSEO > Bing country | 1.0 / 0.70 |
180 
181**Data sufficiency gate:** Count how many of the 7 factors have at least one data source available.
182- **4+ factors with data:** Produce a numeric 0-100 score (redistribute missing weights proportionally)
183- **Fewer than 4 factors:** Do NOT produce a numeric score. Instead display:
184 ```
185 Backlink Health Score: INSUFFICIENT DATA (X/7 factors scored)
186 ```
187 Show individual factor scores that ARE available with their source and confidence.
188 Recommend: "Configure Moz API (free) for a scoreable profile. Run `/seo backlinks setup`"
189 
190### MUST NOT: score what you did not measure
191 
192**When Common Crawl is the only available source, you MUST NOT produce a numeric
193score of any kind** -- not a health score, not a per-factor score, not an
194"approximate" or "estimated" figure. Common Crawl supplies rank and presence
195signals only. Report low-confidence rank/presence data and the literal string
196`Not Assessed` in place of every number.
197 
198**A finding written with `source: not-assessed` MUST NOT carry a numeric score.**
199 
200A numeric score with fewer than 4 data sources is **misleading**: it implies poor
201health when the reality is that we simply lack data.
202 
203### Validation gate (required, not optional)
204 
205This rule has been stated in this skill before and was violated anyway, so it is
206now checkable. **Before writing any backlink output, run the validator:**
207 
208```bash
209"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run validate_backlink_report.py --report <report>.json --json
210```
211 
212Pass the sources you actually collected (`cc_data`, `moz_data`, `bing_data`,
213`dataforseo_data`, `scoring_factors`, and your `findings` list). The
214`source_score_consistency` check fails the report with `status: FAIL` when:
215 
216- a numeric score is present but no scoreable source (Moz, Bing, or DataForSEO)
217 supplied data -- i.e. the Common-Crawl-only case, and
218- any finding marked `source: not-assessed` carries a numeric `score`, `value`,
219 or `health_score`.
220 
221**If the validator returns `status: FAIL`, do not present the report.** Fix the
222findings -- replace the offending numbers with `Not Assessed` -- and re-run until
223it passes.
224 
225## Output Format
226 
227### Backlink Health Score: XX/100 (or INSUFFICIENT DATA)
228 
229| Section | Status | Score | Data Source |
230|---------|--------|-------|-------------|
231| Profile Overview | pass/warn/fail | XX/100 | Moz (0.85) |
232| Anchor Distribution | pass/warn/fail | XX/100 | Moz (0.85) |
233| Referring Domain Quality | pass/warn/fail | XX/100 | CC (0.50) |
234| Toxic Links | pass/warn/fail | XX/100 | Moz Spam (0.85) |
235| Top Pages | info | N/A | Moz (0.85) |
236| Link Velocity | pass/warn/fail | XX/100 | DataForSEO only |
237 
238### Critical Issues (fix immediately)
239### High Priority (fix within 1 month)
240### Medium Priority (ongoing improvement)
241### Link Building Opportunities (top 10)
242 
243## Error Handling
244 
245| Error | Cause | Resolution |
246|-------|-------|-----------|
247| No sources configured | No API keys, no DataForSEO | Run `/seo backlinks setup` |
248| Moz rate limit | Free tier: 1 req/10s | Wait 10 seconds, retry. Built into script. |
249| Bing site not verified | Site not verified in Bing | Verify at https://www.bing.com/webmasters |
250| CC download timeout | Large graph file, slow connection | Use `--timeout 180` flag |
251| DataForSEO unavailable | Extension not installed | Run `./extensions/dataforseo/install.sh` |
252| No backlink data returned | Domain too new or very small | Note: small sites may have <10 backlinks |
253 
254**Fallback cascade:**
2551. DataForSEO available? → Use as primary (confidence: 1.0)
2562. Moz configured? → Use for DA/PA/spam/anchors (confidence: 0.85)
2573. Bing configured? → Use for registered-property links and comparison only
258 when both properties are accessible (confidence: 0.70)
2594. Moz not configured but Keywords Everywhere is? → Use for a Profile Overview
260 rank-only fallback (confidence: 0.60; single metric, no link counts/anchors)
2615. Always: Common Crawl for domain-level metrics (confidence: 0.50)
2626. Always: Verification crawler for known link checks (confidence: 0.95)
2637. Nothing works? → "Run `/seo backlinks setup` to configure free APIs"
264 
265## Pre-Delivery Review (MANDATORY)
266 
267Before presenting any backlink analysis to the user, run this checklist internally.
268Do NOT skip this step. Fix any issues found before showing the report.
269 
270### Fact-Check Every Claim
271- [ ] **Schema claims**: Did parse_html return `@type` for each block? If any `@type` is missing,
272 re-check, it may use `@graph` wrapper (valid JSON-LD, not malformed).
273- [ ] **"link_removed" findings**: Is the page JS-rendered? If `unverifiable_js`, say so, never
274 report a JS-rendered page as "link removed" (that's a false negative).
275- [ ] **H1 findings**: Are any H1s in the `h1_suspicious` list? If so, note they are likely
276 counters/stats, not semantic headings.
277- [ ] **Reciprocal links**: If site A links to site B AND B links back to A, flag it as a
278 reciprocal link pattern. Check outbound links against verified inbound sources.
279- [ ] **Health score**: Are 4+ of 7 factors scored? If not, report INSUFFICIENT DATA, never
280 show a misleading numeric score.
281 
282### Verify Data Source Labels
283- [ ] Every metric in the report has a source label (e.g., "Parsed (0.95)", "CC (0.50)")
284- [ ] Every "not found" result distinguishes between "not crawled" vs "below threshold" vs "error"
285- [ ] Social media pages flagged as `unverifiable_js` (not `link_removed`)
286 
287### Cross-Check Consistency
288- [ ] Platform detection matches actual signals (check for wp-content, shopify CDN, etc.)
289- [ ] Referring domain count in summary matches the actual verified links list
290- [ ] No claim is presented without a data source backing it
291 
292If ANY check fails, fix the finding before presenting. Never present inferred data as fact.
293 
294## Post-Analysis
295 
296After completing any backlink analysis command, always offer:
297"Generate a professional PDF report? Use `/seo google report`"
298 
299## Reference Documentation
300 
301Load on demand (do NOT load at startup):
302- `skills/seo/references/backlink-quality.md` -- Detailed toxic link patterns and scoring methodology (shared reference, load when analyzing toxic links or spam scores)
303- `skills/seo/references/free-backlink-sources.md` -- Source comparison, confidence weighting, setup guides (shared reference, load when configuring free backlink APIs)
304 

Discussion

Alternatives

Also in SEO & keywords
Claude opus as SEO auditorAct as Claude Opus, an expert SEO auditor, analyzing and optimizing websites for improved search engine performance.Marketing · CC0-1.0Baidu SEO SpecialistExpert Baidu search optimization specialist focused on Chinese search engine ranking, Baidu ecosystem integration, ICP compliance, Chinese keyword research, and mobile-first indexing for the China market.Business & ops · MITSEO SpecialistExpert search engine optimization strategist specializing in technical SEO, content optimization, link authority building, and organic search growth. Drives sustainable traffic through data-driven search strategies.Business & ops · MITDirectory submissionsWhen the user wants to submit their product to startup, SaaS, AI, agent, MCP, no-code, or review directories for backlinks, domain rating, and discovery. Also use when the user mentions "directory submissions," "submit to directories," "backlinks from directories," "list my product," "submit to Product Hunt," "BetaList," "TAAFT," "Futurepedia," "G2 listing," "Capterra listing," "AlternativeTo," "SaaSHub," "AI directories," "MCP registry," "agent directory," "dofollow backlinks," "launch directories," or "directory tracker." Use this whenever someone is planning the directory layer of a product launch or an ongoing backlink campaign. For the broader launch moment, see launch. For programmatic SEO pages that should live behind these backlinks, see programmatic-seo. For AI citation optimization, see ai-seo.Marketing · MIT