Subscribe to and scan industry newsletters for buying signals, competitor mentions, ICP pain-point language, and market shifts. Parses incoming newsletter emails via AgentMail, matches against keyword campaigns, and delivers a weekly digest of actionable signals. Use when a marketing team wants to turn newsletter subscriptions into an ongoing intelligence feed without manual reading.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the newsletter-signal-scanner skill
Turn your newsletter subscriptions into a structured intelligence feed. Monitors an AgentMail inbox for incoming newsletters, extracts signal-relevant content by keyword campaign, and delivers a weekly digest of what matters — competitor mentions, ICP pain language, market shifts, and emerging topics.
sponsored-newsletter-finder to discover others.Save campaign config to the current working directory as newsletter-signals.json (or user-specified path).
{
"inbox_id": "<agentmail_inbox_id>",
"keyword_campaigns": {
"competitors": ["Clay", "Apollo", "Outreach", "Salesloft"],
"pain_language": ["pipeline is down", "outbound isn't working", "SDR ramp"],
"market_shifts": ["AI SDR", "GTM engineer", "agent-led"],
"brand_mentions": ["YourCompany", "yourcompany.com"]
},
"newsletters": [
{"name": "Exit Five", "from_domain": "exitfive.com"},
{"name": "The GTM Newsletter", "from_domain": "gtmnewsletter.com"}
],
"output": {
"format": "markdown",
"path": "newsletter-signals-[DATE].md"
}
}Use the AgentMail API (agentmail.dev) to fetch new emails from the monitored inbox:
Fetch emails from inbox <inbox_id> since <last_scan_date>
Filter to: known newsletter senders (match against newsletters config)For each email:
For each newsletter email, scan for keyword matches:
for email in emails:
matches = {}
for campaign, keywords in keyword_campaigns.items():
found = []
for keyword in keywords:
if keyword.lower() in email.body.lower():
# Extract context: 50 chars before + keyword + 50 chars after
context = extract_context(email.body, keyword)
found.append({"keyword": keyword, "context": context})
if found:
matches[campaign] = found
email.signal_matches = matchesOnly include emails with at least one keyword match in the digest.
For each matched email, extract clean signal snippets:
Competitor mention example:
Newsletter: The GTM Newsletter | Date: 2026-03-05 Campaign: competitors Keyword: "Clay" Context: "...teams that use Clay for enrichment are seeing 3x better personalization rates compared to..."
Pain language example:
Newsletter: Exit Five | Date: 2026-03-04 Campaign: pain_language Keyword: "outbound isn't working" Context: "...a lot of founders telling me outbound isn't working the way it used to. The reply rates I'm seeing..."
# Newsletter Signal Digest — Week of [DATE]
## Summary
- Newsletters scanned: [N]
- Emails with signals: [N]
- Top trending topic: [topic]
---
## Competitor Mentions
### Clay
- **[Newsletter Name]** — [Date]
> "[Context snippet]"
Source: [email subject] | [URL if available]
### [Other Competitor]
...
---
## ICP Pain Language
Signals suggesting your ICP is feeling pain your product solves:
- **[Newsletter Name]** — [Date]
> "[Context snippet]"
— Relevance: [why this matters]
---
## Market Shift Signals
Emerging topics gaining newsletter coverage:
- **"[Topic]"** — mentioned in [N] newsletters this week
> "[Context snippet]"
---
## Your Brand Mentions
[Any mentions of your company or product]
---
## Recommended Actions
1. [Specific action based on signals — e.g., "Exit Five is covering AI SDR fatigue — good moment to publish our take"]
2. [Competitive response if needed]Save to the current working directory as newsletter-signals-[YYYY-MM-DD].md (or user-specified path).
For first-time setup, subscribe the AgentMail address to target newsletters:
Run weekly (Monday morning recommended):
# Every Monday at 7am — before the team's standup
0 7 * * 1 python3 run_skill.py newsletter-signal-scanner --client <client-name>| Component | Cost |
|---|---|
| AgentMail inbox | Depends on AgentMail pricing |
| Email parsing + keyword matching | Free (local logic) |
| Total | Near-zero ongoing cost |
AGENTMAIL_API_KEY environment variable and the agentmail pip package (pip3 install agentmail).Assemble an expert/educator motion-graphic LISTICLE video ad from a config — a spoken authoritative voiceover carries a numbered listicle while N web-animated hyperframe beats (HTML plus the Web Animations API, one branded design system of alternating tiles, big hero numerals, and glass-pill callouts) are rendered frame-by-frame via Playwright and anchored to the VO's word-level timestamps, periodic color-graded B-roll windows give visual breath, and captions burn ONLY inside those B-roll windows (2-word chunks, ASS Format header carrying a Name field so none drop) with the VO mixed under a low music bed. This is the FREE deterministic assembly stage (Playwright beat render plus ffmpeg concat plus window-masked caption burn plus VO-and-music mix plus final composite) — the VO, the music bed, and the stock B-roll come from create-vo-elevenlabs, create-music-elevenlabs, and media-proxy. Use for the vo-anchored-motion-listicle format.
Assemble a stop-motion hand-swatch-cycle product-demo ad from a config — a sequence of still PLATES (one hand swiping a single-barrel cosmetic across a cream skin-patch, the barrel + swatch changing per plate while the hand, background, crop, and lighting stay locked) is PNG→mp4 loop-encoded at each plate's own stop-motion hold (fast motion frames 150–250ms, per-shade ~380ms, hero beats 1100–1800ms), concat-demuxed with HARD cuts into a silent master, closed on a Playwright HTML-rendered branded end card (serif tagline + sans subtitle + real logo SVG over a hero BG, never AI-rendered text), and muxed with a pre-sourced music track playing under the end card with a fade tail (no VO). This is the FREE deterministic assembly stage (loop-encode + concat-demux + end-card render + music mux); the master-anchor plate, shade plates, and end-card BG come from create-image-gpt-image-fal and the track from create-music-elevenlabs. Use for the stopmotion-hand-swatch-cycle format.
Assemble a split-screen creator ad from a config — a two-zone vertical composite where a supplied AI-creator lip-sync take fills the BOTTOM ~48% while real 16:9 product/demo clips run uncropped in the TOP ~52%, each top clip contain-fit with a darkened blurred cover-scale fill of the same clip (never black bars), a 3px brand-color divider between the zones, the creator slice cover-fit per the per-scene VO timing, scenes hard-concatenated with the body audio being the concatenated creator VO slices, an end card held on the last sharp frame ~3s, then the ASSEMBLED cut transcribed with local Whisper (not the raw VO — concat drops inter-scene silence) and word-level captions burned in the chosen style. This is the FREE deterministic assembly + caption stage (two-zone composite + blurred fill + divider + hard-concat + end card + captions); the VO comes from create-vo-elevenlabs, the anchor from create-image-gpt-image-fal, and the whole-VO lip-sync from a paid VEED Fabric 1.0 take (a no-atom upstream input). Use for the split-screen-creator format.