champion-move-outreach
$
npx mdskill add gooseworks-ai/goose-skills/champion-move-outreachActivate when known contacts move to target companies.
- Identifies buyers and champions relocating to ideal customer profiles.
- Integrates with people sources, web search, and email platforms.
- Matches relocation signals against defined company fit criteria.
- Generates personalized outreach drafts ready for deployment.
SKILL.md
.github/skills/champion-move-outreachView on GitHub ↗
---
name: champion-move-outreach
version: 1.0.0
description: >
End-to-end champion/buyer/user job change signal composite. Takes a set of
known people (past buyers, champions, power users), detects when they move
to a new company, researches the new company for ICP fit, and drafts
personalized outreach leveraging the existing relationship. Tool-agnostic —
works with any people source, detection method, and outreach platform.
tags: [outreach]
graph:
provides:
- movers-with-icp-fit # People who moved to ICP-fit companies
- new-company-research # Research on the new companies
- personalized-email-sequences # Outreach drafts leveraging existing relationship
requires:
- people-list # Known buyers, champions, users to track
- your-company-context # What you sell, ICP definition
connects_to:
- skill: cold-email-outreach
when: "User wants to launch the campaign via their outreach tool"
passes: movers-with-icp-fit, personalized-email-sequences
- skill: linkedin-outreach
when: "User wants LinkedIn outreach instead of or alongside email"
passes: movers-with-icp-fit
capabilities: [web-search, contact-finding, email-drafting]
---
# Champion 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 | `people_source` |
| What categories of people are you tracking? | Determines outreach tone per person | `tracked_categories` |
**People source options:**
- CRM export (Salesforce, HubSpot) — pull closed-won contacts, active users, power users
- CSV file — manually curated list
- Supabase `people` table — filter by `lead_status = 'customer'` or similar
- 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_buyers` |
| **Past champions** | Advocated for your product internally, drove adoption | Will champion again. Often have stronger conviction than the original buyer. | `past_champions` |
| **Power users** | Used your product daily, know it deeply | Can demonstrate value hands-on. Often become the internal expert at the new company. | `power_users` |
| **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. | `lost_deal_contacts` |
### ICP Definition (for qualifying the new company)
| Question | Purpose | Stored As |
|----------|---------|-----------|
| What industries do you sell to? | Filter out non-ICP companies | `target_industries` |
| What company sizes? (employee count ranges) | Filter out too-small or too-large | `target_company_size` |
| What geographies? | Filter if relevant | `target_geographies` |
| Any disqualifiers? (e.g., government, non-profit, specific verticals) | Hard no's | `disqualifiers` |
| What's the minimum viable deal? | Don't chase companies too small to pay | `minimum_deal_size` |
### Signal Detection Config
| Question | Options | Stored As |
|----------|---------|-----------|
| How should we detect job changes? | LinkedIn profile monitoring / Apollo job change data / Web search / Manual check | `detection_tool` |
| How often should we check? | Weekly / Biweekly / Monthly | `check_frequency` |
### Outreach Config
| Question | Options | Stored As |
|----------|---------|-----------|
| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / CSV export | `outreach_tool` |
| Email or multi-channel? | Email only / Email + LinkedIn | `outreach_channels` |
### Your Company Context
| Question | Purpose | Stored As |
|----------|---------|-----------|
| What does your company do? (1-2 sentences) | New company research context | `company_description` |
| What results did customers typically see? | Proof points for outreach | `customer_results` |
| Any specific results from the tracked person's previous company? | Strongest possible proof | `specific_results` |
**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`:
1. **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:** `"{full_name}" AND ("{last_known_company}" OR "joined" OR "new role")` — look for announcements
- **Any other tool:** Must return the same output contract
2. **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.
3. **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:
1. **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)
2. **Qualify against ICP:**
| Criterion | Check | Pass/Fail |
|-----------|-------|-----------|
| Industry | Is `new_company.industry` in `target_industries`? | Hard filter |
| Size | Is employee count within `target_company_size` range? | Hard filter |
| Geography | Is location in `target_geographies`? (Skip if no geo filter) | Soft filter |
| Disqualifiers | Does the company match any `disqualifiers`? | Hard filter |
| Deal viability | Could this company afford `minimum_deal_size`? | Judgment call |
3. **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 |
4. **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
1. **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:** `"{full_name}" AND "@{new_company_domain}"` or company contact patterns
- **LinkedIn:** InMail or connection request (flag for manual if no email found)
2. **Verify the email is at the new company** — don't accidentally email their old address.
3. **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
1. **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) |
2. **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 | `specific_results` or `customer_results` | "The 40% improvement your team saw at [old company]..." |
| New role congratulations | `move.new_title` + `move.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 | `category` + `qualification.outreach_approach` | See table below |
3. **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?" |
4. **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.
5. **Follow `email-drafting` 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.
### 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.
More from gooseworks-ai/goose-skills