Off-Page SEO
On-page work caps out around DR + 20 in achievable KD targets. Off-page work expands that ceiling. This skill generates a prioritized backlink target list across three lanes — directories, listicles, guest posts — and a starter-stack checklist of universal SaaS submission flows. It does not submit anything. The user (or the user's outreach team) does the actual submission.
The off-page half of the SEO operation. Pairs with seo-machine (on-page programmatic sprint) — ship pages with seo-machine, queue outreach with this skill, run them in parallel.
On Activation
- Load brand context:
positioning.md,competitors.md,audience.md,voice-profile.md. Missing files are fine. - Surface what loaded:
Brand context loaded: ├── Positioning ✓/✗ (drives outreach angle + value-add framing) ├── Competitors ✓/✗ (target list source — Recipe F runs on them) ├── Audience ✓/✗ (selects niche-specific directories + communities) └── Voice Profile ✓/✗ (shapes outreach email tone if user chains into cold-email) - If
competitors.mdis missing, prompt the user for 3-7 direct competitors before running Recipe F (the researched-target-list recipe needs competitor domains as input). - Check for
.seo/backlink-targets.jsonin the current project. If present, this is a re-run — show the user the existing target counts and ask whether to refresh or just present the existing list.
When to use vs adjacent skills
| Skill | When | When NOT |
|---|---|---|
off-page-seo (this) | Building a prioritized backlink target list + universal starter-stack checklist | Doing actual outreach (use cold-email for that) |
seo-machine | On-page programmatic sprint (alternatives, comparison, use-case pages) | Off-page work — this skill |
seo-audit | Diagnosing on-site technical issues | Building backlink target lists |
cold-email (in direct-response-copy) | Writing the outreach emails after target list exists | Generating the target list itself |
startup-launcher | Launch-day platform submissions (Product Hunt, BetaList, etc.) | Ongoing backlink work post-launch |
The Starter Stack (universal SaaS submission flow)
Every new site should be submitted to these by week 4. Most are free; all are worth a one-time submission. This is the mechanical work — checklist, not creative.
Directories (submit and check off)
| Directory | DR (approx) | Notes |
|---|---|---|
| Product Hunt | 90+ | Single biggest launch-day backlink + traffic source. Coordinate with startup-launcher. |
| G2 | 88+ | Becomes a destination for "[brand] reviews" searches; needs screenshot + verification email. |
| Capterra / GetApp / Software Advice | 80+ | Gartner Digital Markets — same submission flow across all three. |
| SaaSHub | 65+ | Quick win, free. |
| AlternativeTo | 80+ | List as alternative to top 5 competitors. Required free submission. |
| BetaList | 70+ | Only if pre-launch or recently launched. |
| Indie Hackers | 75+ | Products section. Founder-friendly community. |
| TopAlternatives.com / SimilarSiteSearch / Slant.co | 50–65 | Niche but cumulatively useful. |
| Crunchbase | 92+ | Even free profile gets DR pass-through. |
Community surfaces (selective)
| Surface | When to engage | Hard rule |
|---|---|---|
| Niche subreddits | Find via Exa search "site:reddit.com [audience] [problem]" or Ahrefs site-explorer on reddit.com for your keywords | Engage genuinely for 2+ weeks before mentioning the product. Never just post a link. |
| Slack/Discord communities | For your audience persona | Join 3-5, contribute substantively for 2 weeks before mentioning. |
| Hacker News | For technical products | Show HN posts can drive enormous traffic spikes — require a real launch story, not "we built another SaaS." |
Founder outreach (slow-burn channel)
- Founder link trades with complementary (non-competitive) products. Reach out to 5-10 founders of products your audience also uses. Offer mutual blog mentions, "tools we love" pages, or guest posts.
- Guest posts on DR 30+ niche blogs. Find via Recipe F (competitor referring-domains). Pitch 1-2 strong posts per month — not spray-and-pray.
Recipe F — Researched Target List
Use Exa MCP (mktg default) or Ahrefs MCP (if connected) to surface high-value link opportunities your competitors already have. The target list is built FROM your competitors' existing backlinks.
Exa path (mktg default)
For each top-3 competitor:
mcp__exa__web_search_advanced_exa
query: "[competitor-domain] -site:[competitor-domain]"
filter: linksTo:[competitor-domain]
limit: 50
Then for each result, scrape the page (Exa crawling_exa or firecrawl) and extract: domain, page title, anchor text. Filter to DR≥30 sites via a separate exa__company_research_exa lookup, OR by manual triage of well-known authority domains.
Ahrefs appendix (only if you have a paid sub)
If mcp__ahrefs__subscription-info-limits-and-usage returns data AND you want numeric precision on referring-domain DR, run:
mcp__ahrefs__site-explorer-referring-domains
target: <competitor-domain>
where: domain_rating >= 30 AND traffic_dofollow >= 100
order_by: domain_rating:desc
limit: 100
This replaces only the DR-proxy step in the Exa path above. Ahrefs MCP is not in mktg's chained-in ecosystem — keep this as a footnote, not a default.
Then for each candidate domain (Exa-path or Ahrefs-path), filter manually into buckets:
| Bucket | Signal |
|---|---|
| Directory candidates | Site name matches "[category] directory", "best of [category]", "[category] tools", "alternatives to [tool]" |
| Listicle candidates | Blog posts titled "Top X [category] in YYYY" — pitch yourself for inclusion |
| Guest-post candidates | Looks like a blog (*.com/blog/... URLs), DR 30+, posts on your niche topic |
| Skip | PR wires, paid networks, irrelevant niches, sites that link to everyone in the space |
Output schema (.seo/backlink-targets.json)
{
"generated_at": "YYYY-MM-DD",
"research_backend": "exa" | "ahrefs" | "manual",
"directories": [
{ "domain": "g2.com", "dr": 88, "url_to_submit": "https://www.g2.com/products/new", "competitor_uses": ["hootsuite", "buffer"] }
],
"listicles": [
{ "domain": "thedigitalprojectmanager.com", "dr": 65, "url": "https://...", "topic": "Best Twitter monitoring tools", "competitor_listed": "hootsuite" }
],
"guest_posts": [
{ "domain": "indiehackers.com/blog", "dr": 81, "topic_fit": "founder-led marketing" }
]
}
This file lives at the project root under .seo/ and is read by the mktg-backlink-prospector agent on future runs to avoid duplicate prospecting.
Parallel research via mktg-backlink-prospector agent
When the user wants a fresh target list and there are 3+ competitors to research, /cmo should spawn the mktg-backlink-prospector agent rather than running Recipe F inline. The agent fans out competitor-by-competitor research in parallel, returns the consolidated .seo/backlink-targets.json, and frees /cmo's context for the next decision.
See agents/research/backlink-prospector.md for the spawn contract.
Phase template (when seo-machine sprint integration is wanted)
When the user is also running a seo-machine sprint, off-page phases land near the end of the tracker:
### Phase N — Starter-stack directory submissions
**Why:** baseline backlinks from high-DR directories. Cap at 2-3 hours of submission work.
**Scope:**
- [ ] Product Hunt — coordinate launch with startup-launcher
- [ ] G2 — submit product page
- [ ] Capterra — submit product page
- [ ] SaaSHub
- [ ] AlternativeTo — list as alternative to: <competitor-1>, <competitor-2>, ...
- [ ] Indie Hackers — claim product page
- [ ] Crunchbase — basic profile
**Files modified:** none (external work). Track status in `.seo/off-page-status.md`.
### Phase N+1 — Listic