End-to-end funding signal composite. Takes any set of companies, detects recent funding events, qualifies against your company context, finds relevant people (buyers, champions, users), and drafts personalized outreach. Tool-agnostic — works with any company source, contact finder, and outreach platform.
npx gooseworks install --claude # Then in your agent: /gooseworks <prompt> --skill funding-signal-outreach
Detects recent funding events across a set of companies, qualifies them against your company's context, finds the right people to reach out to, and drafts personalized emails. The full chain from signal to outreach-ready.
Load this composite when:
This composite is tool-agnostic. Each step defines a data contract (what goes in, what comes out). The specific tools that fulfill each step are configured once per client/user, not asked every run.
┌─────────────────────────────────────────────────────────────────┐
│ FUNDING SIGNAL OUTREACH │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ DETECT │──▶│ QUALIFY │──▶│ FIND │──▶│ DRAFT │ │
│ │ Funding │ │ & Rank │ │ People │ │ Emails │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │ │
│ Input: companies + your company + buyer + signal │
│ Tool: web search context personas context │
│ or apollo (LLM) Tool: apollo (LLM) │
│ or crunchbase or linkedin │
│ or any or clearbit │
│ or any │
└─────────────────────────────────────────────────────────────────┘On first run for a client/user, collect and store these preferences. Skip on subsequent runs.
| Question | Options | Stored As |
|---|---|---|
| Where does your company list come from? | CSV file / Salesforce / HubSpot / Supabase / Manual list | company_source |
| What fields identify a company? | At minimum: company name + domain. Optional: industry, size, location | company_fields |
| Question | Options | Stored As |
|---|---|---|
| How should we detect funding signals? | Web search (free) / Apollo / Crunchbase API / PitchBook | signal_tool |
| How far back should we look? | 7 / 14 / 30 / 60 / 90 days | lookback_days |
| Question | Options | Stored As |
|---|---|---|
| How should we find contacts at these companies? | Apollo / LinkedIn Sales Nav / Clearbit / Web search / Manual | contact_tool |
| Do you have API access? | Yes (provide key) / No (use free tier or web search) | contact_api_access |
| Question | Options | Stored As |
|---|---|---|
| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / Lemlist / Apollo / CSV export | outreach_tool |
| Email or multi-channel? | Email only / Email + LinkedIn | outreach_channels |
| Question | Purpose | Stored As |
|---|---|---|
| What does your company do? (1-2 sentences) | Qualification + email personalization | company_description |
| What problem do you solve? | Email hook | pain_point |
| Who are your ideal buyers? (titles, departments) | Contact finding filters | buyer_personas |
| Name 2-3 proof points (customers, metrics, results) | Email credibility | proof_points |
| What's your product's price range? (SMB / Mid-Market / Enterprise) | Funding stage qualification | price_tier |
Store config in: clients/<client-name>/config/signal-outreach.json or equivalent.
Purpose: For each company in the input list, determine if they have raised funding within the lookback window.
companies: [
{
name: string # Required
domain: string # Required
industry?: string # Optional, helps qualification
size?: string # Optional
location?: string # Optional
}
]
lookback_days: integer # From config (default: 30)For each company (or in batches):
Search for funding announcements using the configured signal_tool:
"{company_name}" AND ("raised" OR "funding" OR "Series") AND "2026" for each companyExtract funding details from results:
Filter: Drop companies with no funding signal detected.
funded_companies: [
{
name: string
domain: string
industry: string
funding_amount: string # e.g. "$15M"
funding_stage: string # e.g. "Series A"
funding_date: string # ISO date or "March 2026"
lead_investors: string[] # e.g. ["Sequoia", "a16z"]
source_url: string # Link to announcement
confidence: "high" | "medium" # High = multiple sources or official PR
original_company_data: object # Pass through all original fields
}
]Present results as a table:
Found funding signals for X of Y companies:
| Company | Amount | Stage | Date | Investors | Confidence |
|---------|--------|-------|------|-----------|------------|
| Acme | $15M | Series A | 2026-02-15 | Sequoia | High |
| ... | ... | ... | ... | ... | ... |
Proceed with qualification? (Y/n)Purpose: Given funded companies + your company context, rank them by outreach priority. This step is pure LLM reasoning — inherently tool-agnostic.
funded_companies: [...] # From Step 1 output
your_company: {
description: string # From config
pain_point: string # From config
buyer_personas: string[] # From config
proof_points: string[] # From config
price_tier: string # From config
}For each funded company, evaluate:
| Criterion | Weight | How to Assess |
|---|---|---|
| Stage fit | High | Does the funding stage match your price tier? Series A → SMB/mid-market tools. Series C → enterprise. |
| Industry relevance | High | Is their industry one where your product solves a real problem? |
| Timing urgency | Medium | How recent is the funding? <14 days = urgent window. 30-60 days = still viable. 60+ = cooling. |
| Size signal | Medium | Post-raise team size estimate. Do they have enough people to need your product? |
| Round size | Low | Larger rounds = more budget for tooling. But even small rounds trigger vendor evaluation. |
Assign each company a priority tier:
For each qualified company, generate:
qualified_companies: [
{
...funded_company_fields,
priority_tier: "tier_1" | "tier_2" | "tier_3"
relevance_reasoning: string
outreach_angle: string
recommended_approach: string
estimated_team_size: string # Post-raise estimate
}
]
dropped_companies: [
{
name: string
drop_reason: string
}
]Present qualified companies grouped by tier:
## Qualification Results
### Tier 1 — Act Today (X companies)
| Company | Stage | Amount | Angle | Why |
|---------|-------|--------|-------|-----|
| ... | ... | ... | ... | ... |
### Tier 2 — Act This Week (X companies)
| ... |
### Tier 3 — Queue (X companies)
| ... |
### Dropped (X companies)
| Company | Reason |
|---------|--------|
| ... | ... |
Approve this list before we find contacts? You can promote, demote, or drop any company.Purpose: For each qualified company, find the right people to contact based on your buyer personas.
qualified_companies: [...] # From Step 2 output
buyer_personas: [ # From config
{
title_patterns: string[] # e.g. ["VP Sales", "Head of Revenue", "CRO"]
department: string # e.g. "Sales", "Engineering"
seniority: string # e.g. "VP+", "Director+", "Manager+"
role_type: "buyer" | "champion" | "user"
}
]
max_contacts_per_company: integer # Default: 3-5For each qualified company, use the configured contact_tool:
Search for people matching buyer personas:
site:linkedin.com/in "{company}" "{title}" queriesFor each person found, collect:
Prioritize contacts within each company:
Cap at max_contacts_per_company — typically 3-5 people per company to avoid carpet-bombing.
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"
}
company: {
name: string
domain: string
funding_amount: string
funding_stage: string
funding_date: string
priority_tier: string
outreach_angle: string
relevance_reasoning: string
}
}
]
contacts_without_email: [...] # Same structure, flagged for manual lookupPresent contacts grouped by company:
## Contacts Found
### Acme Corp (Tier 1 — Series A, $15M)
| Name | Title | Role Type | Email | LinkedIn |
|------|-------|-----------|-------|----------|
| Jane Doe | VP Sales | Buyer | jane@acme.com | linkedin.com/in/janedoe |
| John Smith | Sales Manager | Champion | john@acme.com | linkedin.com/in/johnsmith |
### Beta Inc (Tier 1 — Series B, $40M)
| ... |
Total: X contacts across Y companies (Z without email)
Approve before we draft emails?Purpose: For each contact, draft a personalized email sequence that connects the funding signal to your product's value. This step is pure LLM reasoning — inherently tool-agnostic.
contacts: [...] # From Step 3 output
your_company: { # From config
description: string
pain_point: string
proof_points: string[]
}
sequence_config: {
touches: integer # Default: 3
timing: integer[] # Default: [1, 5, 12] (days)
personalization_tier: 1 | 2 | 3 # Default: 2
tone: string # Default: "casual-direct"
cta: string # Default: "15-min call"
}Select framework based on signal type:
Build personalization context per contact:
| Field | Source | Example |
|---|---|---|
| Signal reference | Step 1 | "Congratulations on the $15M Series A" |
| Company context | Step 2 | "As you scale the sales team post-raise..." |
| Role-specific pain | Step 3 role_type | Buyer → budget/ROI, Champion → daily friction, User → workflow |
| Proof point | Config | "Companies like [peer] use us to..." |
| Outreach angle | Step 2 | "Scale fast with fresh capital" |
Generate emails following email-drafting skill rules:
email-drafting apply (no filler, no "just checking in", one CTA per email, etc.)By personalization tier:
email_sequences: [
{
contact: { full_name, email, company_name, ... }
sequence: [
{
touch_number: integer
send_day: integer
subject: string
body: string # With merge fields resolved or ready
framework: string
word_count: integer
}
]
}
]Present 3-5 sample email sequences (one per tier if Tier 2, one per contact if Tier 3):
## Sample Emails for Review
### Contact: Jane Doe, VP Sales @ Acme Corp (Tier 1, Series A $15M)
**Touch 1 — Day 1**
Subject: Before the Series A hiring sprint
> Hi Jane — congrats on the raise. As Acme scales the sales team...
> [full email]
**Touch 2 — Day 5**
Subject: How [peer company] handled post-raise scaling
> [full email]
**Touch 3 — Day 12**
Subject: One last thought
> [full email]
---
Approve these samples? I'll generate the rest in the same style.
Iterate? Tell me what to change (tone, length, angle, CTA).After approval, generate remaining emails and output the full set.
Purpose: Package the contacts + email sequences for the configured outreach tool. This step adapts its output format to the tool.
email_sequences: [...] # From Step 4 output
outreach_tool: string # From config
outreach_channels: string # From configBased on outreach_tool from config:
| Tool | Action |
|---|---|
| Smartlead | Chain to cold-email-outreach Phase 4 (Smartlead MCP automation) |
| Instantly | Generate Instantly-format CSV |
| Outreach.io | Generate Outreach-compatible CSV |
| Lemlist | Generate Lemlist-format CSV |
| Apollo | Generate Apollo sequence import CSV |
| CSV export | Generate generic CSV with all fields |
If outreach_channels includes LinkedIn:
linkedin-outreach skill for LinkedIn message sequencescampaign_package: {
tool: string
file_path: string # Path to CSV or campaign ID
contact_count: integer
sequence_touches: integer
estimated_send_days: integer
next_action: string # "Upload to [tool]" or "Campaign created, activate when ready"
}## Campaign Ready
Tool: Smartlead (or CSV export, etc.)
Contacts: 23 people across 8 companies
Sequence: 3 touches over 12 days
File: skills/composites/funding-signal-outreach/output/{campaign-name}-{date}.csv
Ready to launch? (This is the final gate before emails are sent or files are created)| Step | Tool Dependency | Human Checkpoint | Typical Time |
|---|---|---|---|
| 0. Config | None | First run only | 5 min (once) |
| 1. Detect | Configurable (web search, Apollo, etc.) | Review funded company list | 2-5 min |
| 2. Qualify | None (LLM reasoning) | Approve/adjust tier rankings | 2-3 min |
| 3. Find People | Configurable (Apollo, LinkedIn, etc.) | Approve contact list | 2-3 min |
| 4. Draft Emails | None (LLM reasoning) | Review sample emails, iterate | 5-10 min |
| 5. Handoff | Configurable (Smartlead, CSV, etc.) | Final launch approval | 1 min |
Total human review time: ~15-20 minutes to go from "here are my target companies" to "outreach is live."
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.