Goose-skills champion-move-outreach
git clone https://github.com/gooseworks-ai/goose-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/gooseworks-ai/goose-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/composites/champion-move-outreach" ~/.claude/skills/gooseworks-ai-goose-skills-champion-move-outreach && rm -rf "$T"
skills/composites/champion-move-outreach/SKILL.mdChampion Move Outreach
Tracks known buyers, champions, and power users for job changes. When someone who already knows your product moves to a new company, that's the highest-conversion outbound signal in B2B — they already trust you, they're in a new role trying to make an impact, and they have firsthand experience with what your product delivers.
Why this is the #1 signal: Every other signal (funding, hiring, leadership change) targets strangers. This targets people who already know, like, and trust your product. Conversion rates on champion-move outreach are 3-5x higher than cold outreach because:
- They don't need to be educated on what you do
- They have a positive experience to anchor on
- They want quick wins at the new company (bringing in a tool they trust IS a quick win)
- They can internally champion the deal because they have firsthand results to cite
When to Auto-Load
Load this composite when:
- User says "track my champions", "check for job changes", "who moved from our customer accounts", "champion tracking"
- User has a list of past buyers/users and wants to know if anyone changed jobs
- An upstream workflow (TAM Pulse) triggers a champion change check
Step 0: Configuration (One-Time Setup)
On first run for a client/user, collect and store these preferences. Skip on subsequent runs.
People to Track
| Question | Purpose | Stored As |
|---|---|---|
| Where does your list of people to track come from? | Defines the input source | |
| What categories of people are you tracking? | Determines outreach tone per person | |
People source options:
- CRM export (Salesforce, HubSpot) — pull closed-won contacts, active users, power users
- CSV file — manually curated list
- Supabase
table — filter bypeople
or similarlead_status = 'customer' - Manual list — names + LinkedIn URLs
Tracked categories:
| Category | Who They Are | Why They Matter | Stored As |
|---|---|---|---|
| Past buyers | Signed the contract at their previous company | Can sign again. Know the ROI. Can articulate value to new leadership. | |
| Past champions | Advocated for your product internally, drove adoption | Will champion again. Often have stronger conviction than the original buyer. | |
| Power users | Used your product daily, know it deeply | Can demonstrate value hands-on. Often become the internal expert at the new company. | |
| Lost deal contacts | Evaluated your product but chose a competitor or no decision | Weaker signal but still valid — they know you exist. New company = fresh start. | |
ICP Definition (for qualifying the new company)
| Question | Purpose | Stored As |
|---|---|---|
| What industries do you sell to? | Filter out non-ICP companies | |
| What company sizes? (employee count ranges) | Filter out too-small or too-large | |
| What geographies? | Filter if relevant | |
| Any disqualifiers? (e.g., government, non-profit, specific verticals) | Hard no's | |
| What's the minimum viable deal? | Don't chase companies too small to pay | |
Signal Detection Config
| Question | Options | Stored As |
|---|---|---|
| How should we detect job changes? | LinkedIn profile monitoring / Apollo job change data / Web search / Manual check | |
| How often should we check? | Weekly / Biweekly / Monthly | |
Outreach Config
| Question | Options | Stored As |
|---|---|---|
| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / CSV export | |
| Email or multi-channel? | Email only / Email + LinkedIn | |
Your Company Context
| Question | Purpose | Stored As |
|---|---|---|
| What does your company do? (1-2 sentences) | New company research context | |
| What results did customers typically see? | Proof points for outreach | |
| Any specific results from the tracked person's previous company? | Strongest possible proof | |
Store config in:
clients/<client-name>/config/signal-outreach.json or equivalent.
Step 1: Detect Job Changes
Purpose: For each person in the tracking list, determine if they've moved to a new company.
Input Contract
tracked_people: [ { full_name: string # Required linkedin_url: string # Strongly recommended (most reliable for matching) email: string | null # Previous email (will be outdated after move) last_known_company: string # The company they were at when you knew them last_known_title: string # Their title when you knew them category: "past_buyer" | "past_champion" | "power_user" | "lost_deal_contact" relationship_context: string | null # e.g. "Signed $50K deal in 2025", "Led implementation" } ]
Process
For each person, use the configured
detection_tool:
-
Check current position against
:last_known_company- LinkedIn: Visit profile (or use scraping tool) → compare current company to
last_known_company - Apollo: People search by name + LinkedIn URL → check current employer
- Web search:
— look for announcements"{full_name}" AND ("{last_known_company}" OR "joined" OR "new role") - Any other tool: Must return the same output contract
- LinkedIn: Visit profile (or use scraping tool) → compare current company to
-
For each person, determine:
- Are they still at the same company? → No signal, skip.
- Have they moved? → Signal detected. Capture new company + new title.
- Has their profile gone dark (no updates, no activity)? → Flag for manual check.
-
For each mover, extract:
- New company name
- New title
- Approximate start date at new company
- New company domain (for research in Step 2)
- Was this a promotion (higher title) or lateral move?
Output Contract
movers: [ { person: { full_name: string linkedin_url: string category: string # "past_buyer", "past_champion", etc. relationship_context: string previous_company: string previous_title: string } move: { new_company: string new_company_domain: string new_title: string start_date: string # ISO date or approximate days_in_new_role: integer is_promotion: boolean # Higher title than before? } } ] no_change: [ { full_name: string, still_at: string } ] unable_to_verify: [ { full_name: string, reason: string } # Profile private, no data, etc. ]
Human Checkpoint
## Job Change Detection Results Tracked: X people Moved: Y people No change: Z people Unable to verify: W people ### People Who Moved | Name | Category | Was At | Now At | New Title | Days In | |------|----------|--------|--------|-----------|---------| | Jane Doe | Past buyer | Acme Corp | NewCo Inc | VP Sales | 45 days | | Bob Lee | Power user | Beta LLC | StartupX | Sales Manager | 12 days | | ... | ... | ... | ... | ... | ... | ### Unable to Verify | Name | Reason | |------|--------| | Sam Chen | LinkedIn profile set to private | Proceed to research their new companies? (Y/n)
Step 2: Research New Company & Qualify Against ICP
Purpose: For each mover, research their new company and determine if it's a fit for your product. This is the critical gate — just because someone you know moved doesn't mean their new company is a prospect.
Input Contract
movers: [...] # From Step 1 output icp_criteria: { target_industries: string[] target_company_size: string # e.g. "50-500 employees" target_geographies: string[] disqualifiers: string[] minimum_deal_size: string } your_company: { description: string }
Process
For each mover's new company:
-
Research the new company using web search (tool-agnostic — always available):
- What does the company do? (1-2 sentence summary)
- What industry are they in?
- Approximate company size (employees)
- Location/HQ
- Funding stage (if applicable)
- Any recent news (funding, product launches, leadership changes)
-
Qualify against ICP:
Criterion Check Pass/Fail Industry Is
innew_company.industry
?target_industriesHard filter Size Is employee count within
range?target_company_sizeHard filter Geography Is location in
? (Skip if no geo filter)target_geographiesSoft filter Disqualifiers Does the company match any
?disqualifiersHard filter Deal viability Could this company afford
?minimum_deal_sizeJudgment call -
Assess the person's position at the new company:
Factor What to Check Why It Matters Authority level Is their new title at or above their old title? Higher = more budget authority Department fit Are they in a department that buys/uses your product? Must be in the right department Influence trajectory Promoted into a leadership role? More influence = stronger champion Seniority mismatch Were they a user before, now they're a VP? Adjust outreach — they're a buyer now, not a user -
Determine outreach approach based on category + new position:
Category at Old Company New Position Level Approach Past buyer → Buyer-level title Re-sell: "You bought us before, bring us to [new company]" Past buyer → Higher title Executive re-sell: "Now that you run [department], [product] scales with you" Past champion → Buyer-level title Upgrade: "You championed us internally — now you own the budget" Past champion → Same level Lateral champion: "Bring what worked at [old company] to [new company]" Power user → Any level Bottom-up: "You know the product inside out — want to bring it to your new team?" Lost deal contact → Any Fresh start: "Different company, different needs. Worth a second look?"
Output Contract
qualified_movers: [ { person: { full_name: string linkedin_url: string category: string relationship_context: string previous_company: string previous_title: string } move: { new_company: string new_company_domain: string new_title: string start_date: string days_in_new_role: integer is_promotion: boolean } new_company_research: { description: string # What the company does industry: string employee_count: string # Approximate location: string funding_stage: string | null recent_news: string[] # 2-3 relevant items } qualification: { icp_fit: "strong" | "moderate" | "weak" icp_reasoning: string # Why it's a fit or not authority_level: "buyer" | "influencer" | "user" outreach_approach: string # "re-sell", "upgrade", "lateral champion", "bottom-up", "fresh start" } priority_tier: "tier_1" | "tier_2" | "tier_3" } ] disqualified_movers: [ { full_name: string new_company: string disqualification_reason: string # "Industry not in ICP", "Company too small", etc. } ]
Tier Assignment
- Tier 1 (Act Today): Past buyer or champion + strong ICP fit + <30 days in new role. This is the warmest possible lead.
- Tier 2 (Act This Week): Past buyer/champion + moderate ICP fit, OR power user + strong ICP fit, OR any category + strong fit but 30-60 days in.
- Tier 3 (Queue): Lost deal contacts + strong fit, OR any category with moderate fit and 60+ days in.
- Disqualify: New company doesn't pass ICP hard filters.
Human Checkpoint
## New Company Research & Qualification ### Tier 1 — Act Today (X movers) | Name | Category | New Company | ICP Fit | Approach | Days In | |------|----------|-------------|---------|----------|---------| | Jane Doe | Past buyer | NewCo Inc (Series B, 120 employees, SaaS) | Strong | Re-sell | 45 days | Research: NewCo Inc is a logistics SaaS platform. 120 employees, Series B, HQ in Austin. Recently launched an enterprise tier. Strong fit — same industry, right size, Jane has budget authority as VP Sales. ### Tier 2 — Act This Week (X movers) | ... | ### Disqualified (X movers) | Name | New Company | Reason | |------|-------------|--------| | Sam Lee | TinyStartup | 8 employees, pre-revenue — below minimum deal size | Approve before we draft outreach?
Step 3: Find New Contact Details
Purpose: Get the mover's new email address and any additional context at the new company.
Input Contract
qualified_movers: [...] # From Step 2 output contact_tool: string # From config
Process
-
Find new work email — their old email is outdated. Use the configured
:contact_tool- Apollo: Search by name + new company domain → email
- Clearbit: Prospector lookup by name + domain
- Web search:
or company contact patterns"{full_name}" AND "@{new_company_domain}" - LinkedIn: InMail or connection request (flag for manual if no email found)
-
Verify the email is at the new company — don't accidentally email their old address.
-
Flag contacts without email — these should be routed to LinkedIn outreach instead.
Output Contract
contactable_movers: [ { ...qualified_mover_fields, new_email: string email_confidence: "verified" | "likely" | "pattern_guess" preferred_channel: "email" | "linkedin" | "both" } ] email_not_found: [ { ...qualified_mover_fields, linkedin_url: string # Fall back to LinkedIn preferred_channel: "linkedin" } ]
Human Checkpoint
## Contact Details | Name | New Company | Email | Confidence | Channel | |------|-------------|-------|------------|---------| | Jane Doe | NewCo Inc | jane.doe@newco.com | Verified | Email | | Bob Lee | StartupX | — | Not found | LinkedIn | X contacts with email, Y LinkedIn-only Approve before we draft outreach?
Step 4: Draft Personalized Outreach
Purpose: Draft outreach that leverages the existing relationship. This is NOT cold email — these people know you. The tone, length, and approach are fundamentally different from the other signal composites. Pure LLM reasoning — inherently tool-agnostic.
Input Contract
contactable_movers: [...] # From Step 3 output your_company: { description: string customer_results: string[] # General results customers see specific_results: { # Results at their specific previous company (if available) [company_name]: string # e.g. "Acme Corp: reduced call handling time by 40%" } } sequence_config: { touches: integer # Default: 3 timing: integer[] # Default: [1, 7, 14] (more spaced — less urgency, warmer relationship) tone: string # Default: "casual-direct" (you know this person) cta: string # Default: "quick catch-up call" }
Process
-
Tone is fundamentally different from cold outreach:
Cold Outreach Champion Move Outreach Formal introduction Casual reconnection Prove you're legitimate They already trust you Signal-Proof-Ask framework Relationship-Context-Ask framework "I noticed..." "Hey — congrats on the move!" 50-90 words Touch 1 Can be shorter — no education needed Professional-sharp tone Casual-direct tone (you know each other) -
Build the email around the relationship, not the product:
Element Source How to Use Relationship anchor relationship_context"You were one of our first champions at [old company]" Their results
orspecific_resultscustomer_results"The 40% improvement your team saw at [old company]..." New role congratulations
+move.new_titlemove.new_company"Congrats on VP Sales at NewCo" New company relevance new_company_research"NewCo's push into enterprise makes this a natural fit" Category-specific angle
+categoryqualification.outreach_approachSee table below -
Email angle by outreach approach:
Approach Touch 1 Template Shape Example Re-sell Congrats + "remember the results?" + "bring it to [new company]" "Hey Jane — congrats on the VP Sales gig at NewCo. You saw what [product] did at Acme (40% faster call handling). NewCo's sales team could see the same lift. Worth a quick catch-up?" Upgrade Congrats + "you championed this" + "now you own the budget" "Congrats on the promotion. You pushed for [product] at [old company] — now you actually control the budget. Want to talk about bringing it to NewCo?" Lateral champion Congrats + "you know what works" + "replicate it" "Hey — saw you landed at NewCo. You know firsthand what [product] does. If the team there has the same [pain], happy to help you set it up." Bottom-up Congrats + "you were a power user" + "your new team will love it" "Congrats on the move. You were one of our best users at [old company]. If you want [product] on your desk at NewCo, I can get you set up quickly." Fresh start Congrats + acknowledge the past + "different situation, worth a second look" "Hey — congrats on the move to NewCo. I know the timing wasn't right when we spoke at [old company]. Different company, different needs — open to a fresh conversation?" -
Sequence design (warmer, more spaced):
Touch Day Purpose Length Notes Touch 1 1 Reconnect + congrats + soft ask 40-70 words Shorter than cold — they know you Touch 2 7 Share a relevant result or update 30-50 words New feature, new customer in their industry, case study Touch 3 14 Low-pressure check-in 20-30 words "No rush — whenever the timing is right" Key difference from cold sequences: More spacing between touches (they're not a stranger you'll lose if you wait), warmer tone, and Touch 3 is a check-in not a breakup.
-
Follow
hard rules with one exception: Rule 6 ("never lie about how you found them") is flipped — you SHOULD reference exactly how you know them. That's the whole point.email-drafting
Output Contract
email_sequences: [ { contact: { full_name: string new_email: string new_title: string new_company: string category: string relationship_context: string outreach_approach: string } sequence: [ { touch_number: integer send_day: integer subject: string body: string personalization_elements: { relationship_anchor: string # How the relationship was referenced their_results: string | null # Specific results referenced new_role_reference: string # How the new role was acknowledged new_company_relevance: string # Why new company is a fit } word_count: integer } ] channel: "email" | "linkedin" } ]
Human Checkpoint
Present samples covering different outreach approaches:
## Sample Outreach for Review ### Jane Doe — VP Sales @ NewCo Inc Category: Past buyer | Approach: Re-sell | 45 days in new role **Touch 1 — Day 1** Subject: Congrats on NewCo — quick thought > Hey Jane — congrats on the VP Sales move to NewCo. Your team at Acme > saw a 40% improvement in call handling after going live with [product]. > NewCo's enterprise push could see the same lift. > > Worth a 15-minute catch-up? **Touch 2 — Day 7** Subject: NewCo + [product] — a few ideas > Quick follow-up — we just launched [new feature] that would've > been perfect for the workflow your team ran at Acme. Happy to > walk you through it. **Touch 3 — Day 14** Subject: Whenever the timing is right > No rush on this. If [product] makes sense for what you're building > at NewCo, I'm a quick call away. Either way, congrats again on the role. --- ### Bob Lee — Sales Manager @ StartupX (LinkedIn only) Category: Power user | Approach: Bottom-up | 12 days in new role **LinkedIn Message:** > Hey Bob — congrats on StartupX! You were one of our most active users > at Beta LLC. If you want [product] set up for your new team, happy > to fast-track it. Let me know. --- Approve these samples? I'll generate the rest in the same style.
Step 5: Handoff to Outreach
Identical to
funding-signal-outreach Step 5. Package contacts + email sequences for the configured outreach tool. Route LinkedIn-only contacts to linkedin-outreach skill.
Additional Note for This Composite
Some contacts will be email, some will be LinkedIn-only. Split the output:
- Email contacts → outreach tool (Smartlead, Instantly, CSV, etc.)
- LinkedIn contacts → LinkedIn automation tool (Dripify, Expandi) or manual LinkedIn queue
Output Contract
campaign_package: { email_campaign: { tool: string file_path: string contact_count: integer } linkedin_campaign: { file_path: string # CSV for LinkedIn tool or manual queue contact_count: integer } total_contacts: integer sequence_touches: integer next_action: string }
Human Checkpoint
## Campaign Ready Signal type: Champion/buyer/user job change Email contacts: X people → [outreach tool] LinkedIn contacts: Y people → LinkedIn message queue Total: Z people across W companies Sequence: 3 touches over 14 days Ready to launch?
Execution Summary
| Step | Tool Dependency | Human Checkpoint | Typical Time |
|---|---|---|---|
| 0. Config | None | First run only | 5 min (once) |
| 1. Detect job changes | Configurable (LinkedIn, Apollo, web search) | Review movers list | 2-5 min |
| 2. Research + qualify | Web search (always available) | Approve qualified movers | 3-5 min |
| 3. Find new email | Configurable (Apollo, Clearbit, etc.) | Review contact details | 1-2 min |
| 4. Draft outreach | None (LLM reasoning) | Review samples, iterate | 5-10 min |
| 5. Handoff | Configurable (Smartlead, CSV, etc.) | Final launch approval | 1 min |
Total human review time: ~15-25 minutes
Key Differences from Other Signal Composites
| Dimension | Funding / Hiring / Leadership | Champion Move |
|---|---|---|
| Relationship | Cold — they don't know you | Warm — they know and (hopefully) like you |
| Input | List of companies | List of people |
| Signal about | The company | The person |
| Qualification | Is the company relevant? | Is the NEW company relevant? (Person is already qualified) |
| Tone | Professional, prove credibility | Casual, reference shared history |
| Conversion rate | 2-5% reply rate | 10-25% reply rate |
| Sequence spacing | Tight (Day 1/5/12) | Relaxed (Day 1/7/14) |
| Touch 3 | Breakup | Check-in (leave door open) |
Tips
- Run this check monthly, not daily. Job changes don't happen overnight. Monthly cadence catches moves within the first 30 days, which is the optimal outreach window.
- Keep your tracking list fresh. Add new champions, buyers, and power users as deals close. Remove people who've left the industry entirely.
- Specific results beat generic proof. "Your team saw 40% improvement" is 10x better than "our customers see great results." If you have specific data from their previous company, use it.
- Don't be pushy. These are warm contacts. A desperate tone ("We need your business!") destroys the relationship advantage. Casual and helpful wins.
- Promotions are the best sub-signal. Someone who was a champion and is now a VP is the warmest possible lead — they already believe in your product AND now control budget.
- Lost deal contacts are worth tracking too. "Different company, different needs" is a legitimate re-engagement angle. Their objection at the old company may not apply at the new one.
- LinkedIn is often better than email for this signal. The relationship is personal, not company-to-company. A LinkedIn message feels more natural than a cold-looking email from a sales tool.
- If the person was a VERY close contact (executive sponsor, etc.), skip the automated sequence. Pick up the phone or send a personal email from the founder/AE. Don't automate relationships that deserve a personal touch.