Link-Build Competitor Mining — the Link Intersect playbook
This is a PLAYBOOK the off-page sub-agent runs, not a live pipeline step. It only runs once the off-page phase is open (blogs proven + traffic rising —
STRATEGY.md"Off-page (later)" + the off-page sub-agent charterexamples/off-page-subagent-AGENTS.md). Its single deliverable is a vetted prospect list; the actual reaching-out happens in/outreach. Nothing here contacts anyone.
The fastest links to win are the ones our competitors already earned: someone who linked to a rival's "best AI girlfriend apps" roundup is, by construction, a person who links to pages like ours. Don't guess who might link — replicate the links competitors already have (STRATEGY.md Lesson 9: "replicate competitor links"). This skill turns a few competitor domains into a ranked, trash-filtered, not-already-linking-to-us prospect queue.
Data layer: Ahrefs MCP (
mcp__ahrefs__*). Read../research/references/ahrefs-mcp-cheatsheet.mdfirst — params are comma-separated strings not JSON arrays,select+country/modeare required on most endpoints, and for any tool you haven't used this run calldoc {tool:"..."}to get its exact schema. Never invent tool names. Ahrefs is the sole backlink source; if it's down, HALT and surface it (same outage policy as the keyword pipeline) — do not fall back to a non-Ahrefs source or guessed links.
When to use
/oversubscribed(Daniel Priestley) — building the demand pipeline (Lesson 9). This skill is where the demand>supply discipline starts. Priestley's rule for/outreachis to "pitch MORE blogs than you can handle" — and you can only do that if this list is deep and qualified enough to feed it. So mine for a surplus of relevant, vetted prospects (a pipeline/outreachcan warm and work), not a thin handful. The vetting bar stays exactly as below (relevance-dominant, trash-filtered, de-duped) — oversubscribed means more qualified prospects, never more noise. The prospects' linked competitor pages also tell you which of our products-for-prospects (data studies / linkable assets —/linkable-asset) will warm each one. Apply the lens here only as far as building the queue; the 7-Hour-Rule warming and the actual asks live in/outreach.
Input
/linkbuild-competitor-mining (no args), optionally --cluster <id> to bias relevance scoring toward one money cluster.
Reads:
brand-config.md— our domain, audience, products, and the named competitor set (the same competitorscontent-gap-analysisauto-discovers; reusecontent-pipeline/0-keywords/cache/competitors.jsonif present).content-pipeline/0-keywords/clusters.md— the money clusters, so a prospect's topical relevance can be judged against what we actually publish.content-pipeline/0-keywords/cache/brand-dr.json— our live DR (for the "displaceable / worth-it" read; never hardcode a DR).content-pipeline/off-page/our-backlinks.csvif it exists — the domains that already link to us (so we can subtract them). If absent, fetch our own profile fresh in step 1.
The three prospect types (what we mine)
- Superfans — sites that link to multiple of a SINGLE competitor's best-by-links pages. A site that linked to three of a rival's pages clearly rates that rival's content; it is the warmest possible prospect for ours.
- Power-linkers — sites that link to several different competitors but not to us (the classic "link intersect": linkers common to ≥ 2 rivals, minus our own linkers). These are the niche's link hubs — resource pages, roundup authors, bloggers who cover the category.
- Fresh links — a competitor's newest backlinks (last 30–90 days). Recency means the linking page is live, maintained, and its author is currently active on the topic — a far higher hit-rate than a link earned five years ago.
Process
Resolve our own backlink footprint first. If
our-backlinks.csvis stale (> 30 days) or missing, pull our referring domains viasite-explorer-referring-domains(target:"pleasur.ai", mode:"domain", select:"domain,domain_rating,links_to_target,first_seen"). Persist the domain set — this is the suppression list every prospect is checked against. A prospect that already links to us is not a prospect.Lock the competitor set. Take competitors from
brand-config.md/cache/competitors.json. Cap at the top 4–6 most topically-relevant rivals (more competitors = more intersect noise, not more signal). Record each rival's domain + DR.Find each competitor's best-by-links pages. For every rival,
site-explorer-best-by-external-links(orsite-explorer-top-pagessorted by referring domains;select:"url,referring_domains,traffic",mode:"domain", tightlimit~25). These are the rival's linkable assets — the pages that actually attract links (usually data studies, original research, free tools, definitive roundups). The links pointing AT these pages are the target pool.Mine SUPERFANS (per competitor). For each rival's top best-by-links pages, pull the referring domains of those pages (
site-explorer-referring-domains,mode:"exact"/"prefix"on the page URL). A domain that appears across ≥ 2 of one rival's best pages → tagprospect_type=superfan, record which competitor + how many of its pages they link.Mine POWER-LINKERS (link intersect across competitors). Union the referring-domain sets from step 4 (or, if the MCP exposes it, use the dedicated
link-intersect-style endpoint — checkdocfor the current tool name). Keep domains that link to ≥ 2 different competitors. Tagprospect_type=power_linker, record the count of distinct competitors linked.Mine FRESH LINKS (per competitor). For each rival,
site-explorer-all-backlinksfiltered to new links (history:"new"or thefirst_seenwindow the cheatsheet documents;select:"url_from,domain_rating,first_seen,anchor,link_type", last 30–90 days). Keep the referring domains; tagprospect_type=fresh_link, recordfirst_seen+ the anchor (the anchor hints at what excuse will land in/outreach).Merge + de-dupe to one row per domain. A domain can qualify under several types — keep the union of its tags and the strongest signals (e.g. superfan-of-2 + power-linker-of-3). One prospect = one row.
VET — filter the trash, keep the relevant (the part that makes this list usable). For every candidate domain compute:
already_links_to_us(from step 1) → drop immediately if true (the #1 filter — we're replicating links we DON'T have).relevance(0–10): topical fit to our clusters/audience — does this site cover dating/relationships/AI/adult-tech/companionship, or anything our reader would plausibly visit? Score from the domain + the linking page's topic. Relevance beats DR — a relevant DR-30 niche blog is a better prospect than an irrelevant DR-80 general-news site. (Lesson 9: don't chase high-DR-only.)link_typesanity — drop obvious junk: link farms, scraper/auto-generated directories, expired/parked domains, PBN footprints, adult-spam aggregators, comment-spam hosts, sites with no real editorial contact. (site-explorer-referring-domainsDR + the page's outbound-link density are the tells.)dr(Ahrefs Domain Rating of the prospect) — recorded for prioritization, not as a gate. (We want links from real, relevant sites at any DR; DR only breaks ties.)reachability— is there a plausible human + contact path (a named author, an editor, a working contact/about page)? A page with no human behind it can't be outreached. Flagno_contactcandidates as low-priority (they may still earn an unsolicited link once our linkable asset exists, but they're not an outreach target).- Suppress affiliate-program domains that the Head of Affiliates ("Alex") already owns or is actively working — the affiliate channel is coordinated there, NOT cold-outreached here (charter §"Coordination with Alex"). Cross-check
content-pipeline/off-page/affiliate-suppression.csvif present; otherwise flagmaybe_affiliatefor the sub-agent to reconcile with Alex before any contact.
Score + rank.
prospect_score= relevance-dominant, then signal strength (superfan-of-N / power-linker-of-N / fresh), then DR as the tie-breaker. Drop everything below a relevance floor (defaultrelevance ≥ 4; tighten if the list is huge). Rank best-first.Write the prospect queue + the mining report.
content-pipeline/off-page/link-prospects.csv— one vetted row per domain:domain, prospect_type(s), relevance, dr, competitor_evidence (which rivals + which of their pages), best_page_linked, anchor_seen, first_seen, contact_hint, prospect_score, suppressed_reason(blank if live). This is the input to/outreach.content-pipeline/off-page/mining-report.md— at-a-glance: candidates found per type, how many dropped (already-link-to-us / trash / no-contact / affiliate), final vetted count, and the top 10 prospects with their one-line "why them + what excuse" so the outreach step has a head start.
Tell the sub-agent / log:
Mined N competitors → C candidates → V vetted prospects (S superfans, P power-linkers, F fresh); dropped X already-linking, Y trash, Z affiliate-suppressed.Then the top 5 prospects, one line each.
Output
content-pipeline/off-page/link-prospects.csv— the vetted, ranked prospect queue (the deliverable; feeds/outreach).content-pipeline/off-page/mining-report.md— the human-readable summary + top prospects.content-pipeline/off-page/our-backlinks.csvrefreshed (the suppression list, reusable next run).
Quality checklist
- Every prospect row was checked against our own backlinks; zero rows have
already_links_to_us=true(if any survive, the suppression join is broken). - Trash filter actually fired — link farms / parked / PBN / comment-spam domains are absent from
link-prospects.csv(spot-check 5 rows by eye). - Relevance, not DR, drives the ranking — a high-DR irrelevant site does NOT outrank a relevant niche one (if it does, the score weights are wrong).
- At least one of each prospect type appears when the data supports it (a competitor with best-by-links pages should yield superfans; ≥ 2 rivals should yield power-linkers).
-
maybe_affiliatecandidates are flagged for Alex reconciliation, not silently queued for cold outreach. - Each top prospect carries
competitor_evidence(which rival page they linked) so/outreachcan write a them-focused, specific excuse — never a generic blast. - The vetted queue is deep enough to feed a demand>supply
/outreachpush (/oversubscribed): a surplus of qualified, relevant prospects (not a thin handful), with the relevance/trash/de-dupe bar fully held — more qualified prospects, never more noise.
DO / DON'T
DO
- Replicate links competitors already have — mine their best-by-links pages, not random pages (
STRATEGY.mdLesson 9). - Prefer relevant linkers (niche fit) over high-DR-only — a topical DR-30 blog beats an off-topic DR-80 outlet.
- Subtract our existing linkers — only mine links we don't yet have.
- Treat the anchor + the linked competitor page as the seed for the outreach "excuse."
- Hand affiliate-shaped prospects to Alex; keep editorial prospects for
/outreach.
DON'T
- Don't queue link farms, PBNs, scraper directories, parked/expired domains, or comment-spam hosts (Anti-pattern #15 — no spam sources).
- Don't gate on DR or chase high-DR-only (Lesson 9 names "high-DR-only" as a mistake).
- Don't contact anyone here — this skill only builds the list; sending is
/outreach, and any outward send needs operator approval (charter guardrails). - Don't re-prospect domains already linking to us, and don't cold-outreach Alex's affiliate partners.
- Don't fabricate a link or a contact — if Ahrefs is down, HALT; if a prospect has no human/contact, flag it
no_contact, don't invent one.
Winning =
A steady stream of manual referring domains (STRATEGY.md Lesson 9 "Winning = steady manual RDs") — built from a clean, relevant, de-duped prospect list that /outreach can work without wading through trash or burning goodwill on sites that already link to us. The list compounds: every cycle subtracts the wins from last cycle and surfaces the rivals' newest links, so we're always chasing links we don't have yet, never re-mining the same ground.