newsletter-sponsorship-finder
Find newsletters relevant to a target audience/industry for sponsorship opportunities. Discovers newsletters through web search, newsletter directories, and industry research. Returns newsletter name, author, estimated audience, topic focus, sponsorship rates (if available), and
Install
npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/newsletter-sponsorship-finder
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
git clone https://github.com/gooseworks-ai/goose-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole gooseworks-ai/goose-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Newsletter Sponsorship Finder
Find and rank newsletters for sponsorship opportunities targeting a specific ICP. Uses web search, newsletter directories, and competitor intelligence to build a prioritized list of sponsorship targets.
Quick Start
Find newsletter sponsorship opportunities for [client]. Target audience: [description]. Industry keywords: [keywords].
Or with optional filters:
Find newsletter sponsorship opportunities for [client].
Target audience: CTOs and DevOps engineers at startups.
Industry keywords: cloud, AWS, DevOps, infrastructure, FinOps.
Budget: $500-2000/placement.
Geographic focus: US.
Inputs
- Target audience description (required) — e.g., "CTOs and DevOps engineers at startups"
- Industry keywords (required) — e.g., "cloud, AWS, DevOps, infrastructure, FinOps"
- Budget range (optional) — for filtering newsletters by sponsorship cost
- Geographic focus (optional) — e.g., "US", "Europe", "Global"
- Output path (optional) — where to save results, defaults to
clients/<client>/leads/newsletter-sponsorships-YYYY-MM-DD.md
Cost
Free — all discovery is WebSearch-based. No API keys required.
Dependencies
pip3 install requests
Optional helper script for Substack directory search:
python3 skills/newsletter-sponsorship-finder/scripts/search_newsletters.py --keywords "cloud,AWS,DevOps" --output json
Process
Phase 1: Define Target
Accept from user:
- Target audience description (e.g., "CTOs and DevOps engineers at startups")
- Industry keywords (e.g., "cloud, AWS, DevOps, infrastructure, FinOps")
- Budget range (optional, for filtering)
- Geographic focus (optional)
Phase 2: Discovery (run searches in parallel)
A) Direct newsletter search (WebSearch)
Run these searches:
"[industry] newsletter""[industry] weekly newsletter developer""best newsletters for [target audience]""[industry] newsletter sponsorship""advertise in [industry] newsletter"
B) Newsletter directory search
Search Swapstack/Paved/SparkLoop for relevant newsletters:
"site:swapstack.co [industry]""site:paved.com [industry]"- WebFetch on directory result pages to find listings in the target niche
C) Industry-specific discovery
- Search for
"[industry] blog"and"[industry] content creator"to find people who likely also have newsletters - Search for
"[industry] newsletter" site:linkedin.composts - Search for Substack newsletters:
"site:substack.com [industry keywords]" - Optionally run the helper script:
python3 skills/newsletter-sponsorship-finder/scripts/search_newsletters.py --keywords "[keywords]" --output json
D) Competitor sponsorship research
- Search
"[competitor name] sponsor newsletter"or"[competitor name] advertise" - Check competitor websites for "As seen in" or press pages
- This reveals which newsletters competitors already sponsor (proven audience match)
Phase 3: Enrich Each Newsletter
For each discovered newsletter, use WebFetch to visit the newsletter page and try to find:
- Name — Newsletter name
- Author/Organization — Who runs it
- URL — Signup page or archive
- Estimated audience — subscriber count (often mentioned on sponsorship pages or About pages)
- Topic focus — What it covers
- Frequency — Daily, weekly, monthly
- Sponsorship info — Rates, format (dedicated send, banner, classified), contact
- Audience quality — Is the audience primarily decision-makers or junior folks?
- Social proof — Notable sponsors, testimonials
Phase 4: Score & Rank
Score each newsletter (0-10):
- Audience overlap with target ICP (+3 max)
- Audience size (+2 for 10K+, +1 for 5K+)
- Sponsorship availability confirmed (+2)
- Reasonable pricing for budget (+1)
- High engagement signals — open rates mentioned, active community (+1)
- Competitors sponsor it — proven audience match (+1)
Phase 5: Output
Save results to the specified output path as markdown:
# Newsletter Sponsorship Opportunities
**Target audience:** [description]
**Industry:** [keywords]
**Date:** YYYY-MM-DD
## Tier 1: Must-Sponsor (Score 8+)
| Newsletter | Author | Est. Audience | Frequency | Sponsorship Rate | Contact | Score |
|-----------|--------|--------------|-----------|-----------------|---------|-------|
## Tier 2: Strong Fit (Score 5-7)
| Newsletter | Author | Est. Audience | Frequency | Sponsorship Rate | Contact | Score |
|-----------|--------|--------------|-----------|-----------------|---------|-------|
## Tier 3: Worth Exploring (Score 3-4)
| Newsletter | Author | Est. Audience | Frequency | Sponsorship Rate | Contact | Score |
|-----------|--------|--------------|-----------|-----------------|---------|-------|
## Competitor Sponsorship Intel
| Competitor | Newsletters They Sponsor | Notes |
|-----------|------------------------|-------|
## Next Steps
1. Reach out to Tier 1 newsletters for rate cards
2. Request media kits from Tier 2 newsletters
3. Set calendar reminder to refresh this list quarterly
4. Monitor competitor sponsorships monthly
Tips
- Run once per client to establish a sponsorship pipeline
- Refresh quarterly as new newsletters launch frequently
- Check competitor sponsorships monthly — if a competitor starts sponsoring a newsletter, it validates the audience
- Combine with
agentmailto automate initial outreach to newsletter operators - Use
company-contact-finderwhen a newsletter's sponsorship contact is not publicly listed - Newsletters with 5K-50K subscribers often offer the best ROI for B2B sponsorships — large enough audience, small enough for personal touch
Files (goose-skills)
-
scripts
-
search_newsletters.py 5.1 KB
#!/usr/bin/env python3 """ search_newsletters.py — Helper script for the newsletter-sponsorship-finder skill. Searches the Substack directory for newsletters matching given keywords and returns structured results. This is a supplementary tool; the main discovery is done by the agent using WebSearch and WebFetch. Usage: python3 search_newsletters.py --keywords "cloud,AWS,DevOps,infrastructure" --output json python3 search_newsletters.py --keywords "fintech,banking" --output table """ import argparse import json import sys try: import requests except ImportError: print( json.dumps( { "error": "requests library not installed. Run: pip3 install requests", "results": [], } ) ) sys.exit(1) SUBSTACK_SEARCH_URL = "https://substack.com/api/v1/publication/search" HEADERS = { "User-Agent": ( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ), "Accept": "application/json", } def search_substack(keyword: str, limit: int = 20) -> list[dict]: """Search Substack for newsletters matching a keyword.""" try: resp = requests.get( SUBSTACK_SEARCH_URL, params={"query": keyword, "page": 0, "limit": limit}, headers=HEADERS, timeout=15, ) resp.raise_for_status() data = resp.json() results = [] publications = data if isinstance(data, list) else data.get("results", data.get("publications", [])) for pub in publications: if isinstance(pub, dict): results.append( { "name": pub.get("name", "Unknown"), "author": pub.get("author_name", pub.get("author", {}).get("name", "Unknown")), "description": pub.get("description", pub.get("hero_text", "")), "url": pub.get("custom_domain") or pub.get("custom_domain_optional") or f"https://{pub.get('subdomain', 'unknown')}.substack.com", "subscribers": pub.get("subscriber_count", pub.get("rankingDetail", {}).get("subscribers", "N/A")), "type": pub.get("type", "newsletter"), "keyword": keyword, } ) return results except requests.exceptions.HTTPError as e: if e.response is not None and e.response.status_code == 403: return [{"note": f"Substack blocked the request for '{keyword}'. Try WebSearch instead.", "keyword": keyword, "results": []}] return [{"error": f"HTTP error searching for '{keyword}': {e}", "keyword": keyword, "results": []}] except requests.exceptions.RequestException as e: return [{"error": f"Request failed for '{keyword}': {e}", "keyword": keyword, "results": []}] except (json.JSONDecodeError, KeyError, TypeError) as e: return [{"error": f"Failed to parse Substack response for '{keyword}': {e}", "keyword": keyword, "results": []}] def format_table(results: list[dict]) -> str: """Format results as a readable table.""" if not results: return "No results found." lines = [ f"{'Name':<40} {'Author':<25} {'Subscribers':<15} {'URL'}", "-" * 120, ] for r in results: if "error" in r or "note" in r: lines.append(r.get("error", r.get("note", ""))) continue name = (r.get("name", "Unknown"))[:38] author = (r.get("author", "Unknown"))[:23] subs = str(r.get("subscribers", "N/A"))[:13] url = r.get("url", "") lines.append(f"{name:<40} {author:<25} {subs:<15} {url}") return "\n".join(lines) def main(): parser = argparse.ArgumentParser( description="Search Substack for newsletters matching keywords." ) parser.add_argument( "--keywords", required=True, help="Comma-separated keywords to search for (e.g., 'cloud,AWS,DevOps')", ) parser.add_argument( "--output", choices=["json", "table"], default="json", help="Output format: json or table (default: json)", ) parser.add_argument( "--limit", type=int, default=20, help="Max results per keyword (default: 20)", ) args = parser.parse_args() keywords = [k.strip() for k in args.keywords.split(",") if k.strip()] all_results = [] seen_urls = set() for kw in keywords: results = search_substack(kw, limit=args.limit) for r in results: url = r.get("url", "") if url and url not in seen_urls: seen_urls.add(url) all_results.append(r) elif "error" in r or "note" in r: all_results.append(r) if args.output == "json": print(json.dumps({"keywords": keywords, "total": len(all_results), "results": all_results}, indent=2)) else: print(f"\nSubstack Newsletter Search: {', '.join(keywords)}") print(f"Found {len(all_results)} results\n") print(format_table(all_results)) if __name__ == "__main__": main()
-
-
SKILL.md 6 KB
--- name: newsletter-sponsorship-finder description: > Find newsletters relevant to a target audience/industry for sponsorship opportunities. Discovers newsletters through web search, newsletter directories, and industry research. Returns newsletter name, author, estimated audience, topic focus, sponsorship rates (if available), and contact info. --- # Newsletter Sponsorship Finder Find and rank newsletters for sponsorship opportunities targeting a specific ICP. Uses web search, newsletter directories, and competitor intelligence to build a prioritized list of sponsorship targets. ## Quick Start ``` Find newsletter sponsorship opportunities for [client]. Target audience: [description]. Industry keywords: [keywords]. ``` Or with optional filters: ``` Find newsletter sponsorship opportunities for [client]. Target audience: CTOs and DevOps engineers at startups. Industry keywords: cloud, AWS, DevOps, infrastructure, FinOps. Budget: $500-2000/placement. Geographic focus: US. ``` ## Inputs - **Target audience description** (required) — e.g., "CTOs and DevOps engineers at startups" - **Industry keywords** (required) — e.g., "cloud, AWS, DevOps, infrastructure, FinOps" - **Budget range** (optional) — for filtering newsletters by sponsorship cost - **Geographic focus** (optional) — e.g., "US", "Europe", "Global" - **Output path** (optional) — where to save results, defaults to `clients/<client>/leads/newsletter-sponsorships-YYYY-MM-DD.md` ## Cost Free — all discovery is WebSearch-based. No API keys required. ## Dependencies ``` pip3 install requests ``` Optional helper script for Substack directory search: ```bash python3 skills/newsletter-sponsorship-finder/scripts/search_newsletters.py --keywords "cloud,AWS,DevOps" --output json ``` ## Process ### Phase 1: Define Target Accept from user: - Target audience description (e.g., "CTOs and DevOps engineers at startups") - Industry keywords (e.g., "cloud, AWS, DevOps, infrastructure, FinOps") - Budget range (optional, for filtering) - Geographic focus (optional) ### Phase 2: Discovery (run searches in parallel) #### A) Direct newsletter search (WebSearch) Run these searches: - `"[industry] newsletter"` - `"[industry] weekly newsletter developer"` - `"best newsletters for [target audience]"` - `"[industry] newsletter sponsorship"` - `"advertise in [industry] newsletter"` #### B) Newsletter directory search Search Swapstack/Paved/SparkLoop for relevant newsletters: - `"site:swapstack.co [industry]"` - `"site:paved.com [industry]"` - WebFetch on directory result pages to find listings in the target niche #### C) Industry-specific discovery - Search for `"[industry] blog"` and `"[industry] content creator"` to find people who likely also have newsletters - Search for `"[industry] newsletter" site:linkedin.com` posts - Search for Substack newsletters: `"site:substack.com [industry keywords]"` - Optionally run the helper script: `python3 skills/newsletter-sponsorship-finder/scripts/search_newsletters.py --keywords "[keywords]" --output json` #### D) Competitor sponsorship research - Search `"[competitor name] sponsor newsletter"` or `"[competitor name] advertise"` - Check competitor websites for "As seen in" or press pages - This reveals which newsletters competitors already sponsor (proven audience match) ### Phase 3: Enrich Each Newsletter For each discovered newsletter, use WebFetch to visit the newsletter page and try to find: 1. **Name** — Newsletter name 2. **Author/Organization** — Who runs it 3. **URL** — Signup page or archive 4. **Estimated audience** — subscriber count (often mentioned on sponsorship pages or About pages) 5. **Topic focus** — What it covers 6. **Frequency** — Daily, weekly, monthly 7. **Sponsorship info** — Rates, format (dedicated send, banner, classified), contact 8. **Audience quality** — Is the audience primarily decision-makers or junior folks? 9. **Social proof** — Notable sponsors, testimonials ### Phase 4: Score & Rank Score each newsletter (0-10): - Audience overlap with target ICP (+3 max) - Audience size (+2 for 10K+, +1 for 5K+) - Sponsorship availability confirmed (+2) - Reasonable pricing for budget (+1) - High engagement signals — open rates mentioned, active community (+1) - Competitors sponsor it — proven audience match (+1) ### Phase 5: Output Save results to the specified output path as markdown: ```markdown # Newsletter Sponsorship Opportunities **Target audience:** [description] **Industry:** [keywords] **Date:** YYYY-MM-DD ## Tier 1: Must-Sponsor (Score 8+) | Newsletter | Author | Est. Audience | Frequency | Sponsorship Rate | Contact | Score | |-----------|--------|--------------|-----------|-----------------|---------|-------| ## Tier 2: Strong Fit (Score 5-7) | Newsletter | Author | Est. Audience | Frequency | Sponsorship Rate | Contact | Score | |-----------|--------|--------------|-----------|-----------------|---------|-------| ## Tier 3: Worth Exploring (Score 3-4) | Newsletter | Author | Est. Audience | Frequency | Sponsorship Rate | Contact | Score | |-----------|--------|--------------|-----------|-----------------|---------|-------| ## Competitor Sponsorship Intel | Competitor | Newsletters They Sponsor | Notes | |-----------|------------------------|-------| ## Next Steps 1. Reach out to Tier 1 newsletters for rate cards 2. Request media kits from Tier 2 newsletters 3. Set calendar reminder to refresh this list quarterly 4. Monitor competitor sponsorships monthly ``` ## Tips - Run once per client to establish a sponsorship pipeline - Refresh quarterly as new newsletters launch frequently - Check competitor sponsorships monthly — if a competitor starts sponsoring a newsletter, it validates the audience - Combine with `agentmail` to automate initial outreach to newsletter operators - Use `company-contact-finder` when a newsletter's sponsorship contact is not publicly listed - Newsletters with 5K-50K subscribers often offer the best ROI for B2B sponsorships — large enough audience, small enough for personal touch -
skill.meta.json 283 B
{ "slug": "newsletter-sponsorship-finder", "category": "capabilities", "tags": [ "monitoring" ], "installation": { "base_command": "npx goose-skills install newsletter-sponsorship-finder", "supports": [ "claude", "cursor", "codex" ] } }
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.