Newsletter Sponsorship Intelligence — Substack, beehiiv & Ghost
Pricing
from $10.00 / 1,000 newsletter issues
Newsletter Sponsorship Intelligence — Substack, beehiiv & Ghost
Extract sponsors and ad placements from Substack, beehiiv, and Ghost newsletters. Give it newsletter URLs and get, per issue: the sponsor brand names, the marker phrase (Presented by / Together with / Sponsored by), the sponsor link, and utm_source / utm_campaign. Pure HTTP, no logins, no LLM.
Pricing
from $10.00 / 1,000 newsletter issues
Rating
0.0
(0)
Developer
Esteban Ortega
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Newsletter Sponsorship Intelligence — Who Sponsors Substack, beehiiv & Ghost (Sponsor & Advertiser Extractor)
Find out who sponsors a newsletter — any Substack, beehiiv, or Ghost newsletter you choose. Give this actor a list of newsletter URLs and it returns, for each recent issue, the sponsor brand names, the marker phrase that flagged the ad ("Presented by", "Together with", "Sponsored by", "Brought to you by"), the sponsor link, and the utm_source / utm_campaign tracking parameters. Pure HTTP, no logins, no API keys, no LLM — just fast, deterministic parsing, with 1.000 precision and recall on the ground-truth test set across all three platforms.
Built for ad-sales teams, competitive-intelligence analysts, media buyers, and sponsorship marketplaces who need to know which brands are advertising in which newsletters — and how often.
Sponsorship analytics on newsletters you choose to monitor: you supply the URLs, and the actor reads only public issue pages. No inbox access, no private content.
What it does
- Auto-detects the platform from a bare newsletter URL: Substack (including custom domains), beehiiv, or Ghost.
- Enumerates recent issues — Substack archive API, beehiiv
/archive+sitemap.xml, Ghost/rss/full-content feed (Ghost depth is capped at the RSS window, ~15 newest issues). - Extracts sponsors with pure heuristics — case-insensitive marker phrases anchored to standalone ad headers or sentence-initial lines, brand names repaired from the block's outbound link (destination domain, redirect-link slug, or
utm_sourceas a last resort). - Avoids the usual false positives — footer "sponsoring the podcast" boilerplate,
utm_sourcestrings buried in<script>, self-promotion (absolute links back to the newsletter's own domain are treated as internal), and organic "in partnership with…" prose are all filtered out. - Fails gracefully, bills honestly — an unsupported platform (e.g. a custom Next.js site like Milk Road) returns a single
unsupported_platformrecord; an unreachable site returns a singleerrorrecord; per-issue fetch failures are retried (2 retries with backoff), then counted in the newsletter's summary (issues_failed) instead of being pushed as junk rows. At most one error record per newsletter URL. - Streams results — each item is pushed to the dataset the moment it is scraped, so a timeout or migration keeps everything collected so far.
Output fields
One dataset item per successfully read issue (type: "issue"), plus an optional per-newsletter summary. Every record carries the same key set (summary-only fields are null on issue records and vice versa).
{"type": "issue","newsletter": "https://www.therundown.ai","platform": "beehiiv","url": "https://www.therundown.ai/p/google-gemini-lineup-has-a-pro-sized-hole","slug": "google-gemini-lineup-has-a-pro-sized-hole","date": "2026-07-22","title": "Google’s Gemini lineup has a Pro-sized hole","is_paid_truncated": false,"sponsor_count": 2,"sponsors": [{"name": "Unwrap","marker_phrase": "together with","link": "https://cal.com/unwrap/quick-connect","utm_source": null,"utm_campaign": null},{"name": "Google for Startups","marker_phrase": "presented by","link": "https://cloud.google.com/startup","utm_source": null,"utm_campaign": null}],"scraped_at": "2026-07-23T08:15:00.000000+00:00","error": null,"issues_found": null,"issues_with_sponsors": null,"total_sponsors": null,"issues_failed": null}
| Field | Meaning |
|---|---|
type | issue, newsletter_summary, unsupported_platform, or error |
newsletter | Base URL of the publication |
platform | substack, beehiiv, ghost, or unsupported |
url, slug, date, title | Issue identity |
is_paid_truncated | true when a Substack paid issue returned only the free preview (late-body ads may be missed; sponsor blocks usually sit above the paywall) |
sponsor_count | Number of distinct sponsors found in the issue |
sponsors[] | name, marker_phrase, link, utm_source, utm_campaign |
scraped_at | ISO timestamp of the scrape (every record) |
error | Error message: on an error/unsupported_platform record the reason; on a newsletter_summary the first per-issue fetch error, if any |
issues_found | Summary only: issues successfully read for this newsletter |
issues_with_sponsors | Summary only: how many of those issues carried at least one sponsor |
total_sponsors | Summary only: total sponsor mentions across the issues |
issues_failed | Summary only: issue fetches that still failed after retries (not billed as rows) |
Input
| Field | Type | Description |
|---|---|---|
newsletterUrls | array (required) | Newsletter home/base URLs. Platform is auto-detected. An explicitly empty list runs nothing (the demo defaults apply only when the field is omitted). |
maxIssuesPerNewsletter | integer | Most-recent issues to read per newsletter (default 3). Each successfully read issue is one billed result; Ghost is capped at its ~15-issue RSS window. |
dateFloor | string | Optional ISO date (YYYY-MM-DD); skip issues published before it. Any other format fails the run immediately, before any billing. |
includeSummary | boolean | Emit a per-newsletter newsletter_summary record (default true). If disabled and fetches failed, a single error record still reports the failures. |
requestDelay | integer | Polite seconds between requests (default 2). |
proxyConfiguration | object | Apify Proxy config. Datacenter is the default; switch to residential if Substack/beehiiv challenge you. |
Minimal input:
{"newsletterUrls": ["https://www.therundown.ai", "https://blog.bytebytego.com"],"maxIssuesPerNewsletter": 5}
A pay-per-use alternative to Who Sponsors Stuff, Rephonic, and Podscan — no monthly seat
The incumbent sponsor-intelligence tools are subscriptions: Who Sponsors Stuff is a yearly contract, Rephonic runs $99–299/month, Podscan $100+/month — and none of them lets you point the crawl at the exact newsletters you care about, or hands you the raw utm_source/utm_campaign attribution as data you own.
This actor turns "who sponsors my competitor's newsletter?" from a monthly seat into a few-dollar sweep: at $0.01 per result, scanning 50 newsletters × 5 recent issues ≈ 300 results ≈ $3 all-in, pay-per-use, structured JSON out. Run it once for a campaign or on a weekly schedule for a rolling sponsor database.
Who sponsors my competitor's newsletter? (reverse prospecting for ad sales)
The highest-value use: find which brands are actively buying newsletter sponsorships in your niche, then pitch them your inventory — they are already spending.
- List the newsletters your advertisers (or your competitors' advertisers) appear in.
- Run with
dateFloorset to ~30 days back to capture the current buying cycle. - Pivot the
sponsors[]records byname: brands appearing across multiple newsletters are active category buyers; theirutm_campaignvalues often reveal the campaign scope and naming conventions.
Use cases
- Ad-sales prospecting — find every brand already buying newsletter placements in your vertical, and pitch the ones spending near you.
- Competitive ad intelligence — track which competitors sponsor which newsletters, and how frequently, over time.
- Sponsorship rate benchmarking — map sponsor frequency across a set of newsletters to estimate demand and inventory.
- Media-buying research — before booking a newsletter, see who else advertises there and what their landing pages / UTM conventions look like.
- Newsletter marketplaces & databases — enrich a directory of newsletters with live sponsor rosters.
- Brand monitoring — watch for your own or a competitor's brand appearing in newsletter ad slots.
FAQ
How do I find out who sponsors a newsletter?
Point this actor at the newsletter's URL. It reads the public issue content directly over HTTP and returns the sponsor brands, marker phrases, landing links, and UTM tags per issue — no publisher API, no account, no key. Works on Substack (including custom domains), beehiiv, and Ghost.
How do I extract sponsors and advertisers from beehiiv and Ghost newsletters?
The same way — paste the beehiiv or Ghost URL into newsletterUrls. beehiiv issues are enumerated via the archive and sitemap; Ghost via its full-content RSS feed. Both return the identical structured sponsor records as Substack.
Which newsletter platforms are supported?
Substack (including custom domains), beehiiv, and Ghost. Other/custom platforms return a single unsupported_platform record so your run never breaks.
Does this scrape private inboxes?
No — you supply the public newsletter URLs you choose to monitor. The actor reads only the public issue archive pages each platform serves; there is no inbox access, no login, and no private content.
How accurate is it?
1.000 precision and recall on our ground-truth test set across Substack, beehiiv, and Ghost — every extraction is deterministic heuristics corroborated by the ad block's outbound link, so results are reproducible run to run.
Does it use an LLM to detect sponsors?
No. Detection is deterministic heuristics — marker phrases plus outbound-link corroboration — so results are fast, cheap, and reproducible.
Can it read paid / members-only issues?
It reads the free preview that the platform serves publicly. Sponsor blocks are usually placed above the paywall, so they are typically captured; is_paid_truncated flags issues where later content was cut.
Will I get blocked?
Requests use an honest desktop User-Agent with a polite delay and no CAPTCHA/WAF evasion. Substack is Cloudflare-fronted and beehiiv uses a CDN; if datacenter IPs are challenged, select the residential proxy group in proxyConfiguration.
How is it billed?
Pay-per-result: one item per successfully read issue, plus one optional summary per newsletter. Failed fetches are never billed as rows — they are retried, then aggregated into the summary's issues_failed count (at most one error record per newsletter URL). Use maxIssuesPerNewsletter and dateFloor to control volume and cost.
Notes & limitations
- Image-only sponsor logo strips with no adjacent link or text can be missed (no brand text to read).
- Sponsor names lifted from all-caps ad headers are naively title-cased (e.g.
TOGETHER WITH CDATA→Cdata); exact stylization (CData,iPhone-style casing) may differ from the brand's own. - Ghost newsletters expose only their RSS window (~15 newest issues); a larger
maxIssuesPerNewsletterlogs a warning and returns what the feed offers. There is no deeper Ghost backfill in v1. - Respect each publication's terms of service. This actor reads public web content for analytics; you are responsible for how you use the output.