Example output: examples/seo-backlinks-profile-stripe-com-20260514/PROFILE.md
Backlinks Profile
A complete backlink profile audit for a domain. Surfaces composition (where do links come from?), quality (what's the authority distribution?), diversity (concentrated in a few IPs/subnets, or spread out?), trajectory (growing or decaying?), and risk (which links look manipulative?). Output includes a health score and a reviewable disavow-candidate list — never an auto-disavow.
Single-source by design
This skill consults only the SE Ranking backlink index. We don't blend Ahrefs / Moz / Majestic / DataForSEO / Common Crawl into the same report. That's a deliberate choice, not a limitation:
- Internally consistent metrics. Authority scores, anchor counts, and refdomain totals are computed against a single crawl. Multi-source blends produce numbers that look authoritative but actually average across crawls with different sampling, different freshness, and different definitions of "backlink" — the resulting ratios (e.g. dofollow %, anchor distribution) are noise.
- Reproducible health scores. The 100-point health score in this report can be re-run a quarter later against the same source and the deltas are meaningful. With multi-source blends, a score drift can mean anything: source A reweighted, source B refreshed, source C changed its toxic heuristic.
- No data-source independence to model. Any "do these sources agree?" question is unanswerable without a second backlink graph; we don't pretend to answer it. If you need cross-source confirmation (e.g. before legal disavow, before a high-stakes outreach campaign), pair this profile with a manual spot-check against Ahrefs/Majestic — that's a research task, not a skill output.
If your workflow specifically requires multi-source blending (large agencies, link-builders billing on link counts), this skill is the wrong tool — use a vendor that aggregates multiple indexes. For everyone else, single-source produces the more honest report.
Prerequisites
- SE Ranking MCP server connected.
- User provides: a target domain.
- Claude's
WebFetch tool optional (for spot-checking flagged toxic candidates).
mcp__firecrawl-mcp__firecrawl_scrape optional (for the new step 8b — link-source verification).
Process
Validate target & preflight. See skills/seo-firecrawl/references/preflight.md for the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes:
- Normalise domain before continuing.
- Estimated SE Ranking cost for this skill: moderate (full-profile run; no per-keyword multiplier).
- Firecrawl: optional. When
--verify-sources is passed, step 8b (link-source verification) scrapes top-20 referring domains' linking pages to verify each link is still present and what rel it carries (dofollow / nofollow / sponsored / UGC), ~20 Firecrawl credits per run. Default off; pass --no-firecrawl to skip even if available.
- Google APIs: not used.
Profile summary DATA_getBacklinksSummary
- Total backlinks, total referring domains, dofollow/nofollow ratio, link-type distribution (text / image / form / frame), growth velocity over the last 30/90 days.
Referring domains DATA_getBacklinksRefDomains
- Top N referring domains by authority. Pull authority score, link count per domain, domain TLD, country.
Anchor distribution DATA_getBacklinksAnchors
- Top anchor texts by frequency.
- Classify each anchor: branded (contains brand name), exact-match commercial (the target's primary commercial keyword), partial-match, generic ("click here", "read more", "this page"), naked URL, image-alt-derived.
Authority distribution DATA_getBacklinksAuthority and DATA_getDistributionOfDomainAuthority
- Histogram of referring-domain authority: how many DA 0-9, 10-19, 20-29, etc.
- A healthy profile has a long tail; an unhealthy profile is concentrated at DA<10.
IP and subnet diversity DATA_getReferringIps, DATA_getReferringIpsCount, DATA_getReferringSubnetsCount
- Total unique IPs hosting referring domains.
- Total unique /24 subnets.
- Compute concentration ratio:
referring_domains / unique_subnets. Healthy: ~3–10. Unhealthy: many domains share few subnets (PBN signal).
Growth / decay trend DATA_getNewLostBacklinksCount, DATA_getNewLostRefDomainsCount
- Net new backlinks per month (last 6 months).
- Net new referring domains per month.
- Velocity changes — sharp spikes or sharp losses both deserve flags.
Lost links list DATA_listNewLostBacklinks, DATA_listNewLostReferringDomains
- Sample recent losses. Are any high-authority losses?
8b. Optional: live link-source verification mcp__firecrawl-mcp__firecrawl_scrape
- Triggered only when
--verify-sources is passed (default off — credit-conscious).
- For the top 20 referring domains by authority (from step 3), pick the highest-authority linking page per domain. Scrape each (20 Firecrawl credits typical).
- For each scrape, parse the returned
html for <a href> matching the target domain. Capture: link still present (true/false/page-404), rel attribute (dofollow if absent or empty, else the literal value: nofollow, ugc, sponsored, or combinations), surrounding context (anchor text + 50 chars before/after).
- Surface mismatches against the SE Ranking-reported state in
evidence/08b-source-verification.md:
- Link gone — SE Ranking still reports it as live (lag/error).
rel attribute differs from what SE Ranking flagged.
- Source page returns non-200.
- Feeds into step 9: a verified-gone link or
rel=nofollow discovered post-hoc upgrades the toxic-candidate signal for that referring domain.
- If Firecrawl unavailable (or flag not passed): skip entirely. SE Ranking's flagged state remains the source of truth — the skill's "Single-source by design" framing already explains why that's a deliberate trade-off.
Toxic candidate detection (heuristic — see Tips for the rules)
- Apply the toxic heuristic to the referring-domain list.
- Flag candidates. Each row gets a
risk_score and triggers (which heuristic rules fired).
- Never auto-disavow. Output is a reviewable list, not an action.
Synthesise PROFILE.md
Output format
Create a folder seo-backlinks-profile-{target-slug}-{YYYYMMDD}/ with:
seo-backlinks-profile-{target-slug}-{YYYYMMDD}/
├── PROFILE.md (synthesised report — primary deliverable; inlines summary, authority distribution, diversity, trend)
├── 02-referring-domains.md (top N with authority — load-bearing reference for outreach/audit)
├── 03-anchors.md (anchor distribution + classification — load-bearing reference)
├── disavow-candidates.csv (toxic-flagged rows for review — load-bearing CSV)
└── evidence/
├── 01-summary.md (DATA_getBacklinksSummary top-line — raw step output)
├── 04-authority-distribution.md (histogram — raw step output)
├── 05-diversity.md (IPs + subnets + concentration — raw step output)
├── 06-trend.md (last 6 months new/lost — raw step output)
├── 07-losses-sample.md (recent lost backlinks)
└── 08b-source-verification.md (only if --verify-sources ran: live link + rel attribute checks for top-20 sources)
Step files 01, 04, 05, 06 are inlined as sections in PROFILE.md; the copies in evidence/ preserve raw step output for reproducibility. 02-referring-domains.md, 03-anchors.md, and disavow-candidates.csv stay at top level — outreach/audit teams consult them directly.
PROFILE.md follows this shape:
# Backlinks Profile: {domain}
> Snapshot dated {YYYY-MM-DD}
## Health score: **{n}/100**
| Dimension | Score | Notes |
|---|---|---|
| Authority distribution | {n}/20 | {comment} |
| Anchor diversity | {n}/20 | {comment} |
| IP/subnet diversity | {n}/20 | {comment} |
| Growth trajectory | {n}/20 | {comment} |
| Toxic candidate ratio | {n}/20 | {comment} |
## Top-line numbers
| Metric | Value |
|---|---|
| Backlinks | {n} |
| Referring domains | {n} |
| Dofollow / nofollow | {n}% / {n}% |
| Unique IPs | {n} |
| Unique subnets | {n} |
| Domain : subnet ratio | {ratio} |
| New ref-domains last 30d | {n} |
| Lost ref-domains last 30d | {n} |
| Toxic candidates flagged | {n} ({% of total}) |
## Authority distribution
| DA bucket | Domains | % |
|---|---|---|
| 70+ | {n} | {%} |
| 50–69 | {n} | {%} |
| 30–49 | {n} | {%} |
| 10–29 | {n} | {%} |
| 0–9 | {n} | {%} |
## Anchor distribution
| Class | Count | % | Healthy range | Status |
|---|---|---|---|---|
| Branded | {n} | {%} | 30–60% | {✓/⚠} |
| Generic | {n} | {%} | 15–30% | {✓/⚠} |
| Naked URL | {n} | {%} | 10–25% | {✓/⚠} |
| Partial-match | {n} | {%} | 10–20% | {✓/⚠} |
| Exact-match commercial | {n} | {%} | <5% | {✓/⚠ over-optimised} |
| Image-alt-derived | {n} | {%} | <10% | {✓/⚠} |
## Trend (last 6 months)
| Month | New backlinks | Lost backlinks | Net |
|---|---|---|---|
| {M-5} | {n} | {n} | {n} |
| {M-4} | {n} | {n} | {n} |
| ... |
## Toxic candidates ({n} flagged)
See `disavow-candidates.csv`. Top 10 by risk_score:
| Domain | Authority | Triggers | Risk |
|---|---|---|---|
| {domain} | {DA} | {DA<10, sitewide>5, exact-match-anchor} | High |
| ... |
**⚠ NEVER AUTO-DISAVOW.** Hand this list to a human for review. Disavow a domain only after confirming the link is manipulative AND the domain is not delivering referral traffic AND removal requests have failed.
## Recommended next steps
1. {Action}
2. {Action}
3. {Action}
disavow-candidates.csv columns: domain,authority,backlinks_count,sitewide_links,top_anchor,anchor_class,risk_score,triggers,sample_url
Tips
- Respect rate limit. The endpoints in steps 2–8 are ~15 calls; pace sequentially.
- Cost: ~25–40 SE Ranking credits typical for a full profile run. Optional step 8b adds 20 Firecrawl credits when
--verify-sources is passed (one scrape per top-20 source domain).
- Toxic heuristic rules (any 2+ triggers = candidate):
- Authority < 10 (low-trust source).
- Sitewide link count > 5 (footer/sidebar links across many pages — manipulation signal).
- Exact-match commercial anchor on >50% of links from this domain.
- Hosted in known link-farm subnet (when unique IPs / unique subnets ratio is heavily concentrated).
- Domain name is a non-pronounceable string of characters (very strong PBN signal).
- TLD is in the high-spam list (
.xyz, .click, .work historically; verify against current spam-domain reports).
- Healthy anchor distribution: branded should be the largest class (30–60%); exact-match commercial should be small (<5%) — over-optimised commercial anchors trigger Penguin-era penalties.
- Healthy growth: steady 10–20% YoY referring-domain growth is the goal. Sharp spikes (>50% in a month) often indicate paid links and trigger algorithmic suspicion.
- Disavow conservatively. Removing links via outreach is preferred. Disavow only as a last resort; never disavow domains that send referral traffic.
- Pair with
seo-backlink-gap for prospecting (gap analysis vs competitors).
- Pair with
seo-drift to track profile composition over time.
1---2name: seo-backlinks-profile3description: Full backlink profile for a domain — referring domains, anchor text distribution, authority distribution, IP and subnet diversity, growth/decay trend, toxic-candidate flagging. Distinct from `seo-backlink-gap` (which is gap-vs-competitor only). Produces a profile health score and reviewable disavow candidate list (never auto-disavow). Use when the user asks "backlink profile", "link profile audit", "anchor distribution", "toxic links", "disavow candidates", or "backlink health".4---5> Example output: [examples/seo-backlinks-profile-stripe-com-20260514/PROFILE.md](../../examples/seo-backlinks-profile-stripe-com-20260514/PROFILE.md)67# Backlinks Profile89A complete backlink profile audit for a domain. Surfaces composition (where do links come from?), quality (what's the authority distribution?), diversity (concentrated in a few IPs/subnets, or spread out?), trajectory (growing or decaying?), and risk (which links look manipulative?). Output includes a health score and a reviewable disavow-candidate list — never an auto-disavow.1011## Single-source by design1213This skill consults **only the SE Ranking backlink index**. We don't blend Ahrefs / Moz / Majestic / DataForSEO / Common Crawl into the same report. That's a deliberate choice, not a limitation:1415- **Internally consistent metrics.** Authority scores, anchor counts, and refdomain totals are computed against a single crawl. Multi-source blends produce numbers that look authoritative but actually average across crawls with different sampling, different freshness, and different definitions of "backlink" — the resulting ratios (e.g. dofollow %, anchor distribution) are noise.16- **Reproducible health scores.** The 100-point health score in this report can be re-run a quarter later against the same source and the deltas are meaningful. With multi-source blends, a score drift can mean *anything*: source A reweighted, source B refreshed, source C changed its toxic heuristic.17- **No data-source independence to model.** Any "do these sources agree?" question is unanswerable without a second backlink graph; we don't pretend to answer it. If you need cross-source confirmation (e.g. before legal disavow, before a high-stakes outreach campaign), pair this profile with a manual spot-check against Ahrefs/Majestic — that's a research task, not a skill output.1819If your workflow specifically *requires* multi-source blending (large agencies, link-builders billing on link counts), this skill is the wrong tool — use a vendor that aggregates multiple indexes. For everyone else, single-source produces the more honest report.2021## Prerequisites2223- SE Ranking MCP server connected.24- User provides: a target domain.25- Claude's `WebFetch` tool optional (for spot-checking flagged toxic candidates).26- `mcp__firecrawl-mcp__firecrawl_scrape` optional (for the new step 8b — link-source verification).2728## Process29301. **Validate target & preflight.** See `skills/seo-firecrawl/references/preflight.md` for the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes:31 - Normalise domain before continuing.32 - Estimated SE Ranking cost for this skill: moderate (full-profile run; no per-keyword multiplier).33 - Firecrawl: optional. When `--verify-sources` is passed, step 8b (link-source verification) scrapes top-20 referring domains' linking pages to verify each link is still present and what `rel` it carries (dofollow / nofollow / sponsored / UGC), ~20 Firecrawl credits per run. Default off; pass `--no-firecrawl` to skip even if available.34 - Google APIs: not used.35362. **Profile summary** `DATA_getBacklinksSummary`37 - Total backlinks, total referring domains, dofollow/nofollow ratio, link-type distribution (text / image / form / frame), growth velocity over the last 30/90 days.38393. **Referring domains** `DATA_getBacklinksRefDomains`40 - Top N referring domains by authority. Pull authority score, link count per domain, domain TLD, country.41424. **Anchor distribution** `DATA_getBacklinksAnchors`43 - Top anchor texts by frequency.44 - Classify each anchor: branded (contains brand name), exact-match commercial (the target's primary commercial keyword), partial-match, generic ("click here", "read more", "this page"), naked URL, image-alt-derived.45465. **Authority distribution** `DATA_getBacklinksAuthority` and `DATA_getDistributionOfDomainAuthority`47 - Histogram of referring-domain authority: how many DA 0-9, 10-19, 20-29, etc.48 - A healthy profile has a long tail; an unhealthy profile is concentrated at DA<10.49506. **IP and subnet diversity** `DATA_getReferringIps`, `DATA_getReferringIpsCount`, `DATA_getReferringSubnetsCount`51 - Total unique IPs hosting referring domains.52 - Total unique /24 subnets.53 - Compute concentration ratio: `referring_domains / unique_subnets`. Healthy: ~3–10. Unhealthy: many domains share few subnets (PBN signal).54557. **Growth / decay trend** `DATA_getNewLostBacklinksCount`, `DATA_getNewLostRefDomainsCount`56 - Net new backlinks per month (last 6 months).57 - Net new referring domains per month.58 - Velocity changes — sharp spikes or sharp losses both deserve flags.59608. **Lost links list** `DATA_listNewLostBacklinks`, `DATA_listNewLostReferringDomains`61 - Sample recent losses. Are any high-authority losses?62638b. **Optional: live link-source verification** `mcp__firecrawl-mcp__firecrawl_scrape`64 - Triggered only when `--verify-sources` is passed (default off — credit-conscious).65 - For the top 20 referring domains by authority (from step 3), pick the highest-authority linking page per domain. Scrape each (20 Firecrawl credits typical).66 - For each scrape, parse the returned `html` for `<a href>` matching the target domain. Capture: link still present (`true`/`false`/`page-404`), `rel` attribute (`dofollow` if absent or empty, else the literal value: `nofollow`, `ugc`, `sponsored`, or combinations), surrounding context (anchor text + 50 chars before/after).67 - Surface mismatches against the SE Ranking-reported state in `evidence/08b-source-verification.md`:68 - Link gone — SE Ranking still reports it as live (lag/error).69 - `rel` attribute differs from what SE Ranking flagged.70 - Source page returns non-200.71 - Feeds into step 9: a verified-gone link or `rel=nofollow` discovered post-hoc upgrades the toxic-candidate signal for that referring domain.72 - **If Firecrawl unavailable (or flag not passed):** skip entirely. SE Ranking's flagged state remains the source of truth — the skill's "Single-source by design" framing already explains why that's a deliberate trade-off.73749. **Toxic candidate detection** (heuristic — see Tips for the rules)75 - Apply the toxic heuristic to the referring-domain list.76 - Flag candidates. Each row gets a `risk_score` and `triggers` (which heuristic rules fired).77 - **Never auto-disavow.** Output is a reviewable list, not an action.787910. **Synthesise** `PROFILE.md`8081## Output format8283Create a folder `seo-backlinks-profile-{target-slug}-{YYYYMMDD}/` with:8485```86seo-backlinks-profile-{target-slug}-{YYYYMMDD}/87├── PROFILE.md (synthesised report — primary deliverable; inlines summary, authority distribution, diversity, trend)88├── 02-referring-domains.md (top N with authority — load-bearing reference for outreach/audit)89├── 03-anchors.md (anchor distribution + classification — load-bearing reference)90├── disavow-candidates.csv (toxic-flagged rows for review — load-bearing CSV)91└── evidence/92 ├── 01-summary.md (DATA_getBacklinksSummary top-line — raw step output)93 ├── 04-authority-distribution.md (histogram — raw step output)94 ├── 05-diversity.md (IPs + subnets + concentration — raw step output)95 ├── 06-trend.md (last 6 months new/lost — raw step output)96 ├── 07-losses-sample.md (recent lost backlinks)97 └── 08b-source-verification.md (only if --verify-sources ran: live link + rel attribute checks for top-20 sources)98```99100Step files 01, 04, 05, 06 are inlined as sections in `PROFILE.md`; the copies in `evidence/` preserve raw step output for reproducibility. `02-referring-domains.md`, `03-anchors.md`, and `disavow-candidates.csv` stay at top level — outreach/audit teams consult them directly.101102`PROFILE.md` follows this shape:103104```markdown105# Backlinks Profile: {domain}106107> Snapshot dated {YYYY-MM-DD}108109## Health score: **{n}/100**110111| Dimension | Score | Notes |112|---|---|---|113| Authority distribution | {n}/20 | {comment} |114| Anchor diversity | {n}/20 | {comment} |115| IP/subnet diversity | {n}/20 | {comment} |116| Growth trajectory | {n}/20 | {comment} |117| Toxic candidate ratio | {n}/20 | {comment} |118119## Top-line numbers120121| Metric | Value |122|---|---|123| Backlinks | {n} |124| Referring domains | {n} |125| Dofollow / nofollow | {n}% / {n}% |126| Unique IPs | {n} |127| Unique subnets | {n} |128| Domain : subnet ratio | {ratio} |129| New ref-domains last 30d | {n} |130| Lost ref-domains last 30d | {n} |131| Toxic candidates flagged | {n} ({% of total}) |132133## Authority distribution134135| DA bucket | Domains | % |136|---|---|---|137| 70+ | {n} | {%} |138| 50–69 | {n} | {%} |139| 30–49 | {n} | {%} |140| 10–29 | {n} | {%} |141| 0–9 | {n} | {%} |142143## Anchor distribution144145| Class | Count | % | Healthy range | Status |146|---|---|---|---|---|147| Branded | {n} | {%} | 30–60% | {✓/⚠} |148| Generic | {n} | {%} | 15–30% | {✓/⚠} |149| Naked URL | {n} | {%} | 10–25% | {✓/⚠} |150| Partial-match | {n} | {%} | 10–20% | {✓/⚠} |151| Exact-match commercial | {n} | {%} | <5% | {✓/⚠ over-optimised} |152| Image-alt-derived | {n} | {%} | <10% | {✓/⚠} |153154## Trend (last 6 months)155156| Month | New backlinks | Lost backlinks | Net |157|---|---|---|---|158| {M-5} | {n} | {n} | {n} |159| {M-4} | {n} | {n} | {n} |160| ... |161162## Toxic candidates ({n} flagged)163164See `disavow-candidates.csv`. Top 10 by risk_score:165166| Domain | Authority | Triggers | Risk |167|---|---|---|---|168| {domain} | {DA} | {DA<10, sitewide>5, exact-match-anchor} | High |169| ... |170171**⚠ NEVER AUTO-DISAVOW.** Hand this list to a human for review. Disavow a domain only after confirming the link is manipulative AND the domain is not delivering referral traffic AND removal requests have failed.172173## Recommended next steps1741751. {Action}1762. {Action}1773. {Action}178```179180`disavow-candidates.csv` columns: `domain,authority,backlinks_count,sitewide_links,top_anchor,anchor_class,risk_score,triggers,sample_url`181182## Tips183184- Respect rate limit. The endpoints in steps 2–8 are ~15 calls; pace sequentially.185- Cost: ~25–40 SE Ranking credits typical for a full profile run. Optional step 8b adds 20 Firecrawl credits when `--verify-sources` is passed (one scrape per top-20 source domain).186- **Toxic heuristic rules** (any 2+ triggers = candidate):187 - Authority < 10 (low-trust source).188 - Sitewide link count > 5 (footer/sidebar links across many pages — manipulation signal).189 - Exact-match commercial anchor on >50% of links from this domain.190 - Hosted in known link-farm subnet (when unique IPs / unique subnets ratio is heavily concentrated).191 - Domain name is a non-pronounceable string of characters (very strong PBN signal).192 - TLD is in the high-spam list (`.xyz`, `.click`, `.work` historically; verify against current spam-domain reports).193- **Healthy anchor distribution**: branded should be the largest class (30–60%); exact-match commercial should be small (<5%) — over-optimised commercial anchors trigger Penguin-era penalties.194- **Healthy growth**: steady 10–20% YoY referring-domain growth is the goal. Sharp spikes (>50% in a month) often indicate paid links and trigger algorithmic suspicion.195- **Disavow conservatively.** Removing links via outreach is preferred. Disavow only as a last resort; never disavow domains that send referral traffic.196- Pair with `seo-backlink-gap` for prospecting (gap analysis vs competitors).197- Pair with `seo-drift` to track profile composition over time.