End-to-end news-triggered signal composite. Takes any piece of news — an article, LinkedIn post, tweet, announcement, event, trend, regulation, product launch, acquisition, layoff, expansion, or any other public event — and evaluates whether the companies or people mentioned are ICP fits. If yes, identifies the connection between the news and your product, finds the right people to contact, and drafts personalized outreach using the news as the hook. Tool-agnostic. Accepts both company-level and person-level news triggers. AUTO-TRIGGER: Load this composite whenever a user shares a URL (LinkedIn post, article, tweet, blog post) or mentions a company/person they "came across", "saw", or "found" from any external source and asks about relevance, fit, ICP match, or whether to reach out. The user does NOT need to explicitly say "outreach" — any signal evaluation request from an external source triggers this.
npx gooseworks install --claude # Then in your agent: /gooseworks <prompt> --skill news-signal-outreach
The catch-all signal composite. Every other composite handles a specific signal type (funding, hiring, leadership change, champion move). This one handles everything else — any piece of news or public event that could create a reason to reach out.
A regulation change. A product recall. A competitor acquisition. A market expansion. A layoff. An earnings miss. A new partnership. An industry report. A conference keynote. A viral LinkedIn post. Any external event that shifts a company's priorities, creates urgency, or opens a window for your product.
Why this composite exists: The world generates an infinite stream of potential outreach triggers. The four structured signal composites handle the most common patterns. This composite handles the long tail — the unpredictable, opportunistic moments that often produce the best outreach because nobody else is sending a templated sequence about them.
Load this composite when ANY of these are true:
Key principle: If the user shares an external signal (URL, post, article, mention) and asks ANY question about the companies/people in it — load this composite. Don't wait for the word "outreach." The composite handles both evaluation-only (Steps 1-3) and full outreach (Steps 1-6).
This composite accepts three input modes:
| Mode | Input | Example |
|---|---|---|
| News → Companies | A news item. Extract companies/people mentioned, qualify them. | "Here's an article about new FDA regulations on telehealth" |
| Companies → News | A list of companies. Find recent news about them, evaluate relevance. | "Check these 50 companies for any news we can use as an outreach angle" |
| Person → News | A person or list of people. Find recent news about them or their company, evaluate relevance. | "Check if any of these prospects have been in the news" |
On first run for a client/user, collect and store these preferences. Skip on subsequent runs.
| Question | Purpose | Stored As |
|---|---|---|
| What does your company do? (1-2 sentences) | Relevance matching | company_description |
| What problem do you solve? | Connection angle identification | pain_point |
| What industries do you sell to? | ICP filter | target_industries |
| What company sizes? | ICP filter | target_company_size |
| What geographies? | ICP filter (optional) | target_geographies |
| Any disqualifiers? | Hard no's | disqualifiers |
| Who are your buyers? (titles) | Contact finding | buyer_titles |
| Who are your champions? (titles) | Contact finding | champion_titles |
| Who are your users? (titles) | Contact finding | user_titles |
| Question | Purpose | Stored As |
|---|---|---|
| What specific outcomes does your product deliver? | Relevance angle building | product_outcomes |
| Name 2-3 proof points (customers, metrics) | Email credibility | proof_points |
| What categories of news are most relevant to your product? | Helps prioritize | relevant_news_categories |
Examples of relevant_news_categories:
# For a cybersecurity product:
relevant_news_categories: ["data breach", "compliance regulation", "security incident",
"digital transformation", "cloud migration", "IPO/going public"]
# For a sales AI product:
relevant_news_categories: ["sales team scaling", "market expansion", "new product launch",
"competitor acquisition", "cost cutting", "revenue miss"]
# For an HR tech product:
relevant_news_categories: ["layoffs", "rapid hiring", "remote work policy",
"DEI initiative", "union activity", "culture crisis"]| Question | Options | Stored As |
|---|---|---|
| How should we find news? | Web search / Google News / RSS feeds / Social media | news_tool |
| How far back should we look? (when scanning companies for news) | 7 / 14 / 30 / 60 days | lookback_days |
| Question | Options | Stored As |
|---|---|---|
| How should we find contacts? | Apollo / LinkedIn / Clearbit / Web search | contact_tool |
| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / CSV export | outreach_tool |
| Email or multi-channel? | Email only / Email + LinkedIn | outreach_channels |
Store config in: clients/<client-name>/config/signal-outreach.json or equivalent.
Purpose: Take the raw news input — whatever form it arrives in — and extract structured entities (companies, people) and the core event.
Three modes:
Mode A: News → Companies/People
news_input: {
mode: "news_to_targets"
items: [
{
type: "url" | "text" | "structured"
content: string # URL to article, raw text, or structured summary
source: string | null # "TechCrunch", "LinkedIn post", "user provided", etc.
}
]
}Mode B: Companies → News
news_input: {
mode: "targets_to_news"
companies: [
{
name: string
domain: string
industry?: string
}
]
lookback_days: integer
}Mode C: People → News
news_input: {
mode: "people_to_news"
people: [
{
full_name: string
company: string
linkedin_url?: string
}
]
lookback_days: integer
}Fetch and parse the news content:
Extract entities:
Expand if needed: If the news implies a broader set of affected companies beyond those mentioned:
For each company, search for recent news using configured news_tool:
"{company_name}" AND (news OR announced OR launches OR raises OR expands OR partners) within lookback_daysrelevant_news_categories from configGroup results: Company → list of news items, ranked by relevance to your product
For each person, search for recent news/activity:
"{full_name}" AND "{company}" within lookback_daysGroup results: Person → list of news items/activity
extracted_signals: [
{
entity: {
type: "company" | "person"
name: string
company: string # Company name (same as name if type=company)
domain: string | null
role_in_news: string # "subject", "affected", "partner", "competitor", "mentioned"
}
news: {
headline: string # One-line summary of what happened
event_category: string # "regulation", "acquisition", "expansion", "crisis", etc.
event_date: string
full_summary: string # 2-3 sentence summary
source_url: string | null
affected_industries: string[]
}
}
]## Extracted Signals
Source: [news source/input description]
Event: [one-line summary]
Category: [event category]
### Companies/People Extracted
| Entity | Type | Role in News | Industry |
|--------|------|-------------|----------|
| Acme Corp | Company | Subject | Healthcare |
| Jane Doe | Person | Quoted (CEO) | Healthcare |
| HealthTech sector | Industry | Affected | Healthcare |
Also evaluating: X companies in [affected industry] not directly mentioned
Proceed with ICP qualification? (Y/n)Purpose: For each extracted entity, determine if they're an ICP fit. Drop companies/people that don't match. Pure LLM reasoning — inherently tool-agnostic.
extracted_signals: [...] # From Step 1 output
icp_criteria: {
target_industries: string[]
target_company_size: string
target_geographies: string[]
disqualifiers: string[]
}
your_company: {
description: string
pain_point: string
}For each entity:
If entity is a company:
target_industriesdisqualifiersIf entity is a person:
buyer_titles, champion_titles, or user_titles)For entities implied but not mentioned (e.g., "all telehealth companies" from a regulation news):
icp_qualified: [
{
entity: { ... } # From Step 1
news: { ... } # From Step 1
icp_assessment: {
fit: "strong" | "moderate"
industry_match: boolean
size_match: boolean | "unknown"
reasoning: string # Why they're a fit
}
}
]
icp_disqualified: [
{
entity_name: string
reason: string
}
]## ICP Qualification
### Qualified (X entities)
| Entity | Type | Industry | Size | ICP Fit | Reasoning |
|--------|------|----------|------|---------|-----------|
| Acme Corp | Company | Healthcare SaaS | ~200 | Strong | Core ICP industry, right size |
| MedTech Inc | Company | HealthTech | ~500 | Moderate | Adjacent industry, large |
### Disqualified (X entities)
| Entity | Reason |
|--------|--------|
| BigPharma Co | Enterprise (50K+ employees) — above target size |
Approve qualified list?Purpose: This is the critical thinking step. For each ICP-qualified entity, determine the specific connection between the news event and your product. Why should they care about your product RIGHT NOW because of THIS news? Pure LLM reasoning — inherently tool-agnostic.
icp_qualified: [...] # From Step 2 output
your_company: {
description: string
pain_point: string
product_outcomes: string[]
proof_points: string[]
relevant_news_categories: string[]
}For each qualified entity, answer three questions:
Map the news event category to a product relevance pattern:
| Event Category | How It Creates Urgency | Example |
|---|---|---|
| Regulation change | They need to comply, your product helps them comply or adapt faster | "New data privacy law → they need [your compliance tool] before enforcement date" |
| Acquisition / Merger | Systems need integration, processes need standardization, new leadership evaluates stack | "Acquired a company → need to unify [function your product handles]" |
| Market expansion | New market = new challenges, need tools that scale | "Expanding to EMEA → need [your product] for localized [function]" |
| Product launch | Scaling up means scaling operations | "Launching enterprise tier → need [your product] to handle enterprise [function]" |
| Competitive pressure | Competitor moved, they need to respond | "Competitor launched [X] → they need to level up [area your product addresses]" |
| Cost cutting / Layoffs | Do more with less, automation becomes essential | "Cut 15% of staff → need [your product] to maintain output with smaller team" |
| Crisis / Incident | Reactive buying — they need a solution NOW | "Data breach → urgently need [your security product]" |
| Partnership | New partner = new workflows, new opportunities | "Partnered with [company] → need [your product] to support the integration" |
| Earnings / Growth | Over-performing = scaling challenges. Under-performing = efficiency pressure | "Revenue grew 3x → [function your product handles] can't keep up manually" |
| Industry trend / Report | Category awareness is high, they're thinking about this | "Industry report says [trend] → they're likely evaluating solutions in this space" |
| Person-level news | Published an article, spoke at a conference, posted on LinkedIn about a topic you solve | "Posted about [pain] → they're actively thinking about this problem" |
Craft a one-sentence connection:
"Because [news event], [company] now needs [specific outcome your product delivers]."Examples:
| Strength | Criteria | Example |
|---|---|---|
| Direct | The news explicitly describes a problem your product solves | Layoff in your product's department → they need automation |
| Adjacent | The news implies a downstream need your product addresses | Market expansion → implies scaling, which implies need for your tool |
| Thematic | The news is in the same category as your product's domain | Industry report about the trend you're in → awareness play |
connection_angles: [
{
entity: { ... }
news: { ... }
icp_assessment: { ... }
connection: {
urgency_reason: string # Why this news creates urgency
specific_angle: string # One-sentence connection
connection_strength: "direct" | "adjacent" | "thematic"
timing_note: string # How time-sensitive this outreach is
recommended_framework: string # Which email framework fits best
}
}
]| Connection Strength | Recommended Framework | Why |
|---|---|---|
| Direct | Signal-Proof-Ask | The news IS the hook — reference it directly, show proof, ask |
| Adjacent | PAS | Problem (implied by the news) → Agitate (what happens if they don't act) → Solve |
| Thematic | AIDA | Attention (news reference) → Interest (how it relates to them) → Desire (your product) → Action |
## Connection Angles
### Direct Connections (X entities) — Act quickly
| Entity | News | Angle | Timing |
|--------|------|-------|--------|
| Acme Corp | Acquired BetaCo | "Need to unify CRM systems — [product] does this in 30 days" | This week (integration planning starts immediately) |
### Adjacent Connections (X entities)
| Entity | News | Angle | Timing |
|--------|------|-------|--------|
| MedTech Inc | Expanding to EMEA | "Localized [function] becomes a requirement — [product] supports 15 languages" | This month |
### Thematic Connections (X entities)
| Entity | News | Angle | Timing |
|--------|------|-------|--------|
| HealthCo | Industry report on [trend] | "They're likely evaluating [category] solutions" | Flexible |
Approve these angles before we find contacts?Purpose: For each qualified entity with a connection angle, find the right people to contact.
connection_angles: [...] # From Step 3 output
buyer_titles: string[] # From config
champion_titles: string[] # From config
user_titles: string[] # From config
max_contacts_per_company: integer # Default: 3-5If the entity is already a person (Mode C or person mentioned in news):
If the entity is a company:
contact_tool to find people matching buyer_titles, champion_titles, user_titles| News Category | Prioritize These Contacts |
|---|---|
| Regulation / Compliance | Legal, Compliance, Operations leadership |
| Acquisition / Merger | COO, CTO, VP Operations, Integration leads |
| Market expansion | VP Sales, VP Marketing, Country/Regional leads |
| Cost cutting / Layoffs | COO, CFO, VP Operations |
| Product launch | CTO, VP Product, VP Engineering |
| Crisis / Incident | CISO, VP Engineering, CTO (for security), CEO/COO (for operational) |
| General growth | Default to buyer_titles from config |
For each contact, note their relevance to the news:
contacts: [
{
person: {
full_name: string
first_name: string
last_name: string
title: string
email: string | null
linkedin_url: string | null
role_type: "buyer" | "champion" | "user"
news_relevance: string # Why THIS person for THIS news
}
company: {
name: string
domain: string
}
connection: {
specific_angle: string
connection_strength: string
urgency_reason: string
}
news: {
headline: string
event_category: string
source_url: string | null
}
}
]## Contacts Found
### Acme Corp — "Acquired BetaCo" (Direct connection)
| Name | Title | Role | Why This Person |
|------|-------|------|----------------|
| Sarah Kim | COO | Buyer | Owns post-acquisition integration |
| David Park | VP Operations | Champion | Will manage unified workflows |
| Amy Chen | Director of Sales Ops | User | Directly affected by CRM unification |
### MedTech Inc — "Expanding to EMEA" (Adjacent connection)
| ... |
Total: X contacts across Y companies
Approve before we draft emails?Purpose: Draft outreach where the news event is the hook, your product is the solution, and the email demonstrates you understand their specific situation. Pure LLM reasoning — inherently tool-agnostic.
contacts: [...] # From Step 4 output
your_company: {
description: string
pain_point: string
product_outcomes: string[]
proof_points: string[]
}
sequence_config: {
touches: integer # Default: 3
timing: integer[] # Default varies by connection strength (see below)
tone: string # Default: "casual-direct"
cta: string # Default: "15-min call"
}Adjust sequence timing by connection strength:
| Strength | Timing | Rationale |
|---|---|---|
| Direct | Day 1 / 3 / 7 | Urgency is real — they're actively dealing with this |
| Adjacent | Day 1 / 5 / 12 | Standard timing — urgency is implied, not immediate |
| Thematic | Day 1 / 7 / 14 | Slower cadence — this is awareness, not crisis response |
Build the email around the news, not the product:
The news is the subject. Your product is the punchline. Never lead with the product.
| Element | Source | How to Use |
|---|---|---|
| News hook | Step 1 news.headline | Open with what happened — show you're informed |
| Impact on them | Step 3 connection.urgency_reason | Explain what this means for their specific role |
| Your angle | Step 3 connection.specific_angle | Connect the dots to your product naturally |
| Proof | Config proof_points | Show a peer who faced a similar situation |
| CTA | Config | Low-friction ask |
Email structure by connection strength:
Direct connection (Signal-Proof-Ask):
Hook: Reference the specific news event
Impact: What this means for them (1 sentence)
Proof: A peer who faced the same situation and used your product
Ask: Soft CTAAdjacent connection (PAS):
Problem: The downstream challenge the news creates
Agitate: What happens if they don't address it (1 sentence)
Solve: How your product helps, with a proof point
Ask: Soft CTAThematic connection (AIDA):
Attention: Reference the news/trend
Interest: How it relates to their company specifically
Desire: What your product does in this context
Action: Soft CTAPersonalization layers:
| Layer | What Gets Personalized | Source |
|---|---|---|
| News reference | The specific event and its relevance | Step 1 news data |
| Company context | What their company does, their industry, their situation | Step 2 ICP research |
| Role context | Why THIS person cares about this news | Step 4 news_relevance |
| Your company fit | How your product specifically helps in this scenario | Step 3 connection angle |
Follow email-drafting skill hard rules. Additionally:
email_sequences: [
{
contact: { full_name, email, title, company_name, role_type, news_relevance }
news_context: { headline, event_category, source_url }
connection: { specific_angle, connection_strength }
sequence: [
{
touch_number: integer
send_day: integer
subject: string
body: string
framework: string
personalization_elements: {
news_reference: string # How the news was referenced
company_context: string # How their company situation was used
role_context: string # How their specific role was leveraged
product_connection: string # How the product was positioned
}
word_count: integer
}
]
}
]Present samples grouped by connection strength:
## Sample Outreach for Review
### Direct Connection: Sarah Kim, COO @ Acme Corp
News: Acme acquired BetaCo | Angle: CRM unification | Framework: Signal-Proof-Ask
**Touch 1 — Day 1**
Subject: Unifying Acme + BetaCo systems
> Hi Sarah — saw the BetaCo acquisition. Congrats. The integration
> sprint typically surfaces a CRM unification challenge fast —
> two systems, overlapping data, different workflows.
>
> [Peer company] faced the same thing after their acquisition last year.
> [Product] had both systems unified in 30 days. Happy to share how.
>
> Worth a 15-minute call?
**Touch 2 — Day 3**
> [New angle — data migration complexity, with a specific metric]
**Touch 3 — Day 7**
> [Breakup with offer to share the integration playbook]
---
### Adjacent Connection: Dr. Lee, VP Product @ MedTech Inc
News: EMEA expansion | Angle: Localization needs | Framework: PAS
**Touch 1 — Day 1**
Subject: EMEA expansion + [function] localization
> [full email]
---
Approve these samples? I'll generate the rest in the same style.Identical to the other signal composites. Package contacts + email sequences for the configured outreach tool.
campaign_package: {
tool: string
file_path: string
contact_count: integer
sequence_touches: integer
estimated_send_days: integer
next_action: string
}## Campaign Ready
Tool: [configured tool]
Signal type: News-triggered
News event: [headline]
Connection strengths: X direct, Y adjacent, Z thematic
Contacts: N people across M companies
Sequence: 3 touches (timing varies by connection strength)
Ready to launch?| Step | Tool Dependency | Human Checkpoint | Typical Time |
|---|---|---|---|
| 0. Config | None | First run only | 5 min (once) |
| 1. Parse & Extract | Web fetch (for URLs) or none (for text) | Review extracted entities | 2-3 min |
| 2. Qualify ICP | Web search (for company research) | Approve qualified list | 2-3 min |
| 3. Connection Angle | None (LLM reasoning) | Approve angles + strength ratings | 3-5 min |
| 4. Find People | Configurable (Apollo, LinkedIn, etc.) | Approve contact list | 2-3 min |
| 5. Draft Emails | None (LLM reasoning) | Review samples, iterate | 5-10 min |
| 6. Handoff | Configurable (Smartlead, CSV, etc.) | Final launch approval | 1 min |
Total human review time: ~15-25 minutes
| Dimension | Structured Signals (Funding, Hiring, etc.) | News Signal |
|---|---|---|
| Signal type | Predefined, narrow | Arbitrary, broad — anything can be a trigger |
| Detection | Targeted search (job boards, funding databases) | Open-ended (any news source) |
| Extra step | — | Step 3: Connection Angle identification. Other composites have obvious connections (funding = money to spend). News requires explicit reasoning about WHY this event matters for your product. |
| Input modes | Companies in → signals out | Three modes: News→Companies, Companies→News, People→News |
| Timing | Predictable windows (post-raise, pre-hire) | Varies wildly by event type — crisis = 48hr delay, trend = flexible |
| Sensitivity | Generally positive (funding, hiring, growth) | Can be negative (layoffs, crises, failures). Requires empathy calibration. |
Some news events require careful tone calibration:
| Event Type | Tone | What NOT to Do |
|---|---|---|
| Layoffs | Empathetic. "I know this is a tough time." | Don't say "your layoffs mean you need us!" |
| Data breach / Security incident | Helpful, not salesy. "If you need help with [specific thing]." | Don't pile on or blame. Don't reach out same-day. |
| Earnings miss / Revenue decline | Efficiency-focused. "Do more with what you have." | Don't reference the miss directly in the subject line. |
| Executive departure / Fired CEO | Skip the drama entirely. Focus on the new leader or the company's direction. | Don't mention the departure unless it's public and amicable. |
| Lawsuit / Legal trouble | Generally avoid unless your product directly helps with compliance/legal. | Don't reference the lawsuit. It looks ambulance-chasey. |
| Product failure / Recall | Only reach out if you have a direct solution. | Don't gloat or compare. |
Rule of thumb: If you wouldn't bring it up in a face-to-face conversation at a conference, don't put it in a cold email.
Check and improve your brand's visibility across AI search engines (ChatGPT, Perplexity, Gemini, Grok, Claude, DeepSeek). Set up tracking, run visibility analyses, audit your website for AI readability, and get actionable recommendations. Uses the npx goose-aeo@latest CLI.
Extract competitor and customer intelligence from any company's landing page HTML. Discovers tech stack, analytics tools, ad pixels, customer logos, SEO metadata, CTAs, hidden elements, and more. No API keys required.
Discover all customers of a given company by scanning websites, case studies, review sites, press, social media, job postings, and more. Use when you need competitive intelligence on who a company sells to.