> 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 skills add https://github.com/gooseworks-ai/goose-skills --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):
signal_tool:"{company_name}" AND ("raised" OR "funding" OR "Series") AND "2026" for each companyfunded_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-5
For each qualified company, use the configured contact_tool:
site:linkedin.com/in "{company}" "{title}" queriesmax_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 lookup
Present contacts grouped by company:
## Contacts Found
### Acme Corp (Tier 1 — Series A, $15M)
| Name | Title | Role Type | Email | LinkedIn |
|------|-------|-----------|-------|----------|
| Jane Doe | VP Sales | Buyer | [email protected] | linkedin.com/in/janedoe |
| John Smith | Sales Manager | Champion | [email protected] | 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"
}
| 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" |
email-drafting skill rules:email-drafting apply (no filler, no "just checking in", one CTA per email, etc.)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 config
Based 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."
A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).
Extracts and analyzes competitors' ads from ad libraries (Facebook, LinkedIn, etc.) to understand what messaging, problems, and creative approaches are working. Helps inspire and improve your own ad campaigns.
Identifies high-quality leads for your product or service by analyzing your business, searching for target companies, and providing actionable contact strategies. Perfect for sales, business development, and marketing professionals.
Analyzes your recent Claude Code chat history to identify coding patterns, development gaps, and areas for improvement, curates relevant learning resources from HackerNews, and automatically sends a personalized growth report to your Slack DMs.
Complete App Store Optimization (ASO) toolkit for researching, optimizing, and tracking mobile app performance on Apple App Store and Google Play Store
NGS analysis toolkit. BAM to bigWig conversion, QC (correlation, PCA, fingerprints), heatmaps/profiles (TSS, peaks), for ChIP-seq, RNA-seq, ATAC-seq visualization.
Materials science toolkit. Crystal structures (CIF, POSCAR), phase diagrams, band structure, DOS, Materials Project integration, format conversion, for computational materials science.
Transforms vague UI ideas into polished, Stitch-optimized prompts. Enhances specificity, adds UI/UX keywords, injects design system context, and structures output for better generation results.
Take gooseworks-ai/funding-signal-outreach from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.