Claude Skill

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

LLM Mart · 0 points · 3 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download gooseworks-ai-goose-skills-skills_ads_capabilities_newsletter-sponsorship-finder-e1592ee.zip · 4 KB
Part of gooseworks-ai/goose-skills — 44 skills

Install

skills CLI npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/newsletter-sponsorship-finder
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
Git 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.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:

# 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
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.

No comments yet.

Reviews (0)

No reviews yet.

Related