Leadership change outreach

End-to-end leadership change signal composite.

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/outreach/composites/leadership-change-outreach#main ~/.claude/skills/leadership-change-outreach

For one project only, change the path to .claude/skills/leadership-change-outreach. This skill also uses leadership-change-outreach.md — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text722 lines
leadership-change-outreach/SKILL.md722 lines31.1 KBpushed 96d agoRawView on GitHub

Leadership Change Outreach

Detects new leadership hires at target companies and evaluates whether the new leader is relevant to your product — as a direct buyer, a champion, or someone whose mandate aligns with what you sell. If relevant, enriches their profile and drafts personalized outreach that speaks to their new-role priorities.

Why leadership changes work: New leaders re-evaluate everything in their first 90 days. They inherit a vendor stack they didn't choose, a team they didn't build, and KPIs they need to hit fast. They're the most receptive buyers in any organization because:

  • They want to put their stamp on the department
  • They have a mandate (and often budget) to make changes
  • They need quick wins to build credibility with their new org
  • They haven't yet formed loyalty to existing vendors

When to Auto-Load

Load this composite when:

  • User says "check for leadership changes", "new executive hires", "leadership signal outreach"
  • User has a list of companies and wants to find those with relevant new leaders
  • An upstream workflow (TAM Pulse, company monitoring) triggers a leadership change check

Detection Method: Apollo (Free Search + Enrichment)

This composite uses a two-phase Apollo pipeline that replaces slower web search approaches:

  1. Apollo Free Searchsearch_people with q_organization_domains + person_titles filters. Returns person IDs, obfuscated names, and titles. No credits consumed. Scans 100+ people across dozens of companies in ~30 seconds.
  2. Local Post-Filter — Strict title matching to remove noise from Apollo's fuzzy matching (regional titles, sub-function heads, non-GTM roles). Typically reduces results by 50-60%.
  3. Apollo Enrichment by IDpeople/match with the person id from free search. Returns full employment history with start_date/end_date for every role, LinkedIn URL, verified email, and full name. Costs 1 credit per person.
  4. Change Detection — Filter enriched results by start_date on the current: true employment entry within the lookback window.

Why this beats web search: Web search relies on press releases and announcements — most leadership changes below C-suite are never publicly announced. Apollo pulls from LinkedIn profile data directly, catching changes that web search misses. Speed: ~90 seconds total vs 5+ minutes for web search.

Cost: 1 Apollo credit per person enriched. With a tight post-filter (VP+ GTM titles only), a scan of 10-15 companies typically costs 30-50 credits.

Important: Apollo tracks start dates at month granularity (e.g., 2026-02-01), not exact day. Set lookback windows accordingly — use full months rather than exact day counts.


Step 0: Configuration (One-Time Setup)

On first run for a client/user, collect and store these preferences. Skip on subsequent runs.

Leader Relevance Mapping

Question Purpose Stored As
What does your product do? (1-2 sentences) Match against leader mandates company_description
What leader titles are direct buyers of your product? Highest priority — they can sign the check buyer_leader_titles
What leader titles could champion your product? They'd advocate internally or be an entry point champion_leader_titles
What leader titles have mandates your product supports? Their goals align with your product's value aligned_leader_titles
What departments are relevant? Filter out irrelevant leadership changes relevant_departments

Example for a sales AI product:

buyer_leader_titles: ["VP Sales", "CRO", "Chief Revenue Officer", "SVP Sales"]
champion_leader_titles: ["Director of Sales Ops", "Head of Revenue Operations", "VP Business Development"]
aligned_leader_titles: ["COO", "CEO", "VP Operations"]
relevant_departments: ["Sales", "Revenue", "Operations", "Business Development"]

Signal Detection Config

Question Options Stored As
How far back should we look? 30 / 60 / 90 days (default: 90) lookback_days
Minimum seniority for detection? VP+ (default) / Head+ / Director+ min_seniority

Apollo Title List

The free search uses person_titles to filter. Define these based on the client's buyer/champion/aligned titles. Default VP+ GTM titles:

titles = [
    # C-Suite
    'CRO', 'Chief Revenue Officer',
    'CMO', 'Chief Marketing Officer',
    'CCO', 'Chief Commercial Officer',
    # VP-level (Sales, Marketing, Growth, Revenue, RevOps, Demand Gen, BD, Partnerships, CS, Commercial, GTM)
    'VP of Sales', 'VP Sales', 'Vice President of Sales', 'Vice President Sales',
    'SVP Sales', 'SVP of Sales',
    'VP of Marketing', 'VP Marketing', 'Vice President of Marketing',
    'SVP Marketing', 'SVP of Marketing',
    'VP of Growth', 'VP Growth', 'Vice President of Growth',
    'VP of Revenue', 'VP Revenue', 'Vice President of Revenue',
    'VP of Revenue Operations', 'VP RevOps',
    'VP of Demand Generation', 'VP Demand Gen',
    'VP of Business Development', 'VP Business Development',
    'VP of Partnerships', 'VP Partnerships',
    'VP of Customer Success', 'VP Customer Success',
    'VP of Commercial', 'VP Commercial',
    'VP GTM', 'VP of GTM',
    # Head-level
    'Head of Sales', 'Head of Marketing', 'Head of Growth',
    'Head of Revenue', 'Head of Revenue Operations', 'Head of RevOps',
    'Head of Demand Generation', 'Head of Demand Gen',
    'Head of Business Development', 'Head of Partnerships',
    'Head of Customer Success', 'Head of Commercial',
    'Head of GTM',
]

Important: Do NOT use Apollo's person_seniority filter (e.g., ['vp', 'c_suite']) — it's too broad and returns regional managers, ICs with inflated titles, etc. Use explicit person_titles and post-filter locally instead.

Post-Filter Rules

Apollo does fuzzy title matching, so results will include noise. Apply a strict local post-filter that:

  1. Rejects non-GTM functions: engineering, talent, legal, privacy, data science, analytics, product marketing, field marketing, partner marketing, customer marketing, content, communications, community, solutions marketing, enablement, marketing operations
  2. Rejects regional/sub-segment roles: Area VP, AVP, regional heads, EMEA/APAC/Americas-specific roles, enterprise sales by region (West/East/Central/etc.), channel sales, velocity sales, sales development, sales finance, sales strategy
  3. Rejects Apollo garbage: Any title containing "related to search terms"
  4. Requires valid prefix: Title must start with VP/Vice President/SVP/Head of/Chief/CRO/CMO/CCO/President

This typically reduces results by 50-60% (e.g., 100 raw → 40 filtered).

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 problem do you solve? Email hook pain_point
Name 2-3 proof points (customers, metrics, results) Email credibility proof_points
What quick wins can a new leader get from your product? First-90-days angle quick_wins
What does the "before" state look like without your product? Pain framing before_state

Store config in: clients/<client-name>/config/signal-outreach.json or equivalent.


Step 1: Detect Leadership Changes (Apollo Pipeline)

Purpose: For each company in the input list, find VP+ GTM leaders and detect who started recently.

Input Contract

companies: [
  {
    name: string          # Required
    domain: string        # Required (used for q_organization_domains)
    industry?: string     # Optional
    size?: string         # Optional
  }
]
titles: string[]                      # From config (default VP+ GTM list above)
lookback_days: integer                # From config (default: 90)

Process

Phase 1: Apollo Free Search (~30 seconds)

Use apollo_client.search_people() with:

filters = {
    'q_organization_domains': '\n'.join([c['domain'] for c in companies]),  # All domains in one query
    'person_titles': titles,       # From config
    'per_page': 100,
    'page': 1
}

Key details:

  • Use q_organization_domains (NOT organization_domains) — the q_ prefix is required for domain filtering
  • All company domains can be passed in a single query (newline-separated)
  • Free tier returns: id, first_name, last_name (obfuscated as "?"), title, organization.name, last_refreshed_at
  • Free tier does NOT return: full last name, LinkedIn URL, email, or employment history
  • If total_entries > 100, paginate with page: 2, etc.

Phase 2: Local Post-Filter (~instant)

Apply the strict post-filter rules from Step 0 to remove noise. This is critical — Apollo's fuzzy title matching will return regional managers, sub-function heads, and non-GTM roles.

def is_valid_gtm_leader(title):
    """Returns True only for top-level GTM leadership roles."""
    tl = title.lower().strip()

    # 1. Reject non-GTM functions
    reject_keywords = ['engineering', 'engineer', 'talent', 'legal', 'privacy',
                       'data science', 'analytics', 'product marketing',
                       'field marketing', 'partner marketing', 'customer marketing',
                       'content', 'communications', 'community',
                       'channel sales', 'solutions marketing',
                       'enablement', 'education', 'operations & marketing',
                       'marketing operations']
    if any(kw in tl for kw in reject_keywords):
        return False

    # 2. Reject regional/sub-segment roles
    regional_keywords = ['area vice president', 'avp ', 'regional', 'emea', 'apac',
                         'apj', 'americas', 'enterprise sales west', 'enterprise sales east',
                         'enterprise sales central', 'enterprise sales south',
                         'enterprise sales north', 'enterprise sales -',
                         'enterprise sales,', 'na enterprise',
                         'majors sales', 'velocity sales',
                         'canada', 'latin america', 'u.s.', 'uk&i',
                         'chief of staff', 'sales finance', 'sales strategy',
                         'sales development']
    if any(kw in tl for kw in regional_keywords):
        return False

    # 3. Reject Apollo garbage
    if 'related to search terms' in tl:
        return False

    # 4. Must start with a valid prefix
    valid_prefixes = [
        'vp ', 'vp,', 'vp/', 'vice president of', 'vice president,',
        'svp', 'senior vice president',
        'head of sales', 'head of marketing', 'head of growth',
        'head of revenue', 'head of demand gen', 'head of business development',
        'head of partnerships', 'head of customer success', 'head of commercial',
        'head of gtm',
        'chief revenue officer', 'chief marketing officer', 'chief commercial officer',
        'cro', 'cmo', 'cco',
        'president',
    ]
    return any(tl.startswith(p) for p in valid_prefixes)

Phase 3: Apollo Enrichment by ID (~1 second per person)

For each person that passes the post-filter, enrich using the id from free search:

# Use the person's id from free search — this is the key to making enrichment work
# without full names (which free tier obfuscates)
url = "https://api.apollo.io/api/v1/people/match"
payload = {"api_key": api_key, "id": person_id}

What enrichment returns (1 credit per person):

  • name — full name (no longer obfuscated)
  • employment_history — array of all roles with start_date, end_date, title, organization_name, current (boolean)
  • linkedin_url — full LinkedIn profile URL
  • email + email_status — verified work email
  • city, state, country — location

Important: Do NOT use bulk_enrich_people with first_name + organization_name — free search obfuscates last names, and Apollo can't match without them. Always enrich by id.

Rate limiting: Add a small delay (0.5s) every 5 requests to avoid 429s. If rate limited, respect the Retry-After header.

Phase 4: Change Detection

For each enriched person, extract the current: true employment entry and check its start_date:

emp_history = person.get('employment_history', [])
current_role = next((e for e in emp_history if e.get('current')), None)
start_date = current_role.get('start_date', '') if current_role else ''  # e.g. "2026-02-01"

# Check if within lookback window
# Note: Apollo uses month granularity (YYYY-MM-01), not exact day

Determine change type:

  • new_hire: Previous role was at a different company
  • internal_promotion: Previous role was at the same company

Output Contract

leadership_changes: [
  {
    company: {
      name: string
      domain: string
    }
    new_leader: {
      full_name: string
      new_title: string
      start_date: string              # ISO date (month granularity: "2026-02-01")
      previous_company: string
      previous_title: string
      change_type: "new_hire" | "internal_promotion"
      linkedin_url: string
      email: string
      email_status: string            # "verified", "guessed", etc.
      city: string
      state: string
      country: string
    }
  }
]

Output Files

Save two files:

  1. CSV (leadership-change-scan.csv) — all enriched people sorted by start_date descending, with columns: name, title, company, domain, start_date, change_type, previous_title, previous_company, previous_end_date, email, email_status, linkedin_url, city, state, country
  2. Markdown (leadership-change-outreach.md) — formatted report with signal summary, qualification, and email drafts

Human Checkpoint

Scanned X companies → Y raw results → Z after post-filter → W enriched

Leadership changes in last {lookback_days} days:

| Company | New Leader | Title | Started | Previous Role | Type |
|---------|-----------|-------|---------|---------------|------|
| Acme Corp | Jane Smith | VP Sales | 2026-02-01 | Dir. Sales @ Competitor Inc | new_hire |
| Beta Inc | Tom Brown | CRO | 2026-01-01 | VP Revenue @ Beta Inc | internal_promotion |

Credits used: W

Proceed with relevance evaluation? (Y/n)

Step 2: Evaluate Relevance & Prioritize

Purpose: For each leadership change, evaluate whether the new leader is relevant to your product — and determine the best outreach approach. Pure LLM reasoning — inherently tool-agnostic.

Input Contract

leadership_changes: [...]            # From Step 1 output
your_company: {
  description: string
  pain_point: string
  proof_points: string[]
  quick_wins: string[]
  before_state: string
}
buyer_leader_titles: string[]
champion_leader_titles: string[]
aligned_leader_titles: string[]

Process

For each leadership change, evaluate across three dimensions:

A) Role Relevance

Category Match Criteria Priority
Direct buyer Title matches buyer_leader_titles Highest — they can make the purchase decision
Champion Title matches champion_leader_titles High — they can advocate and influence the buyer
Aligned mandate Title matches aligned_leader_titles Medium — their goals benefit from your product
No relevance Title matches none of the lists Drop

B) Timing Window

Days in Role Window Outreach Tone
0-30 days Honeymoon "Welcome aboard — here's something to help you hit the ground running"
31-60 days Assessment "Now that you've had a month to assess the stack, here's what peers are doing"
61-90 days Action "You're probably finalizing your roadmap — here's a quick win to consider"
90+ days Established Weaker signal but still valid — "Saw you joined [company] recently"

C) Background Signal

The new leader's previous company and role adds context:

Background Signal How to Use
Came from a customer of yours Strongest possible — they already know your product "You used [product] at [previous company] — want to bring it to [new company]?"
Came from a competitor's customer They have experience with the category "At [previous company] you used [competitor] — here's how [product] compares"
Came from same industry They understand the pain points Reference industry-specific problems they've seen
Came from different industry Fresh perspective, may be open to new approaches "The playbook from [old industry] doesn't always translate — here's what works in [new industry]"
Internal promotion They know the existing stack and its shortcomings "Now that you own the budget, here's what your team has been asking for"

Scoring

  • Tier 1 (Act Today): Direct buyer + <30 days in role + external hire. Fresh eyes, budget authority, evaluating everything.
  • Tier 2 (Act This Week): Direct buyer 30-60 days in, OR champion <30 days, OR came from a customer/competitor customer.
  • Tier 3 (Queue): Aligned mandate, OR 60-90 days in role, OR internal promotion with champion title.
  • Drop: No role relevance, OR >90 days in role with weak fit.

For each qualified leader, generate:

  • Relevance reasoning: Why this leader would care about your product right now
  • Outreach angle: The specific hook based on their role + timing + background
  • Key insight: One thing about their situation that makes the outreach personal

Output Contract

qualified_leaders: [
  {
    ...leadership_change_fields,
    role_relevance: "direct_buyer" | "champion" | "aligned_mandate"
    timing_window: "honeymoon" | "assessment" | "action" | "established"
    background_signal: string         # e.g. "Came from a competitor customer"
    priority_tier: "tier_1" | "tier_2" | "tier_3"
    relevance_reasoning: string
    outreach_angle: string
    key_insight: string
  }
]
dropped_leaders: [
  { name: string, company: string, drop_reason: string }
]

Human Checkpoint

## Relevance Evaluation

### Tier 1 — Act Today (X leaders)
| Leader | Company | Title | Days In | Type | Angle |
|--------|---------|-------|---------|------|-------|
| Jane Smith | Acme | VP Sales | 32 | Direct buyer, Assessment window | "Now that you've assessed the sales stack at Acme..." |

### Tier 2 — Act This Week (X leaders)
| ... |

### Tier 3 — Queue (X leaders)
| ... |

### Dropped (X leaders)
| Leader | Company | Reason |
|--------|---------|--------|
| ...    | ...     | ...    |

Approve before we draft outreach?

Step 3: Enrich Leader Profile

Purpose: For each qualified leader, gather additional context to power personalization. Apollo enrichment (Step 1) already provides email, LinkedIn URL, and full employment history. This step adds context that Apollo doesn't provide.

Input Contract

qualified_leaders: [...]              # From Step 2 output (already has email, linkedin, emp history from Apollo)

Process

Apollo enrichment from Step 1 already gives us:

  • Full name, verified email, LinkedIn URL
  • Complete employment history (all prior roles with start/end dates)
  • Location (city, state, country)

For each qualified leader, add context that Apollo doesn't provide:

  1. LinkedIn activity (optional but high-value — use linkedin-profile-post-scraper if available):

    • Recent posts or shares — what are they talking about?
    • Any posts about starting the new role — what did they say about their priorities?
  2. Previous company context (derive from employment history):

    • What does their previous company do?
    • Did they use your product (or a competitor's) there?
    • What was their tenure? (Long tenure = deep expertise. Short tenure = may be a career mover.)
  3. New company context:

    • What does the new company do?
    • Any recent company news beyond the leadership change?

Output Contract

enriched_leaders: [
  {
    ...qualified_leader_fields,
    email: string | null               # Already from Apollo
    linkedin_url: string               # Already from Apollo
    linkedin_activity: {
      recent_posts: string[]           # 2-3 most relevant post summaries
      new_role_post: string | null     # What they said about starting this role
    } | null
    previous_company_context: string   # 1-2 sentences about their old company
    new_company_context: string        # 1-2 sentences about what this company does
    personalization_hooks: string[]    # 3-5 things to reference in the email
  }
]

Human Checkpoint

## Enriched Leader Profiles

### Jane Smith — VP Sales @ Acme Corp (Tier 1)
- Email: [email protected] (verified)
- LinkedIn: linkedin.com/in/janesmith
- Previously: Director of Sales @ Competitor Inc (3 years)
- New role post: "Excited to join Acme Corp as VP Sales..."
- Personalization hooks:
  1. Posted about "scaling outbound without scaling headcount" 2 weeks ago
  2. Previous company used [competitor product]
  3. Acme recently raised Series B ($40M)

### Tom Brown — CRO @ Beta Inc (Tier 2)
| ... |

Approve before we draft outreach?

Step 4: Draft Personalized Outreach

Purpose: Draft outreach to each new leader that demonstrates you understand their situation — new role, new priorities, tight timeline. Pure LLM reasoning — inherently tool-agnostic.

Input Contract

enriched_leaders: [...]               # From Step 3 output
your_company: {
  description: string
  pain_point: string
  proof_points: string[]
  quick_wins: string[]
  before_state: string
}
sequence_config: {
  touches: integer                    # Default: 3
  timing: integer[]                   # Default: [1, 5, 12]
  tone: string                       # Default: "professional-sharp" (executives expect this)
  cta: string                        # Default: "15-min intro call"
}

Process

  1. Select framework based on role relevance:

    • Direct buyerSignal-Proof-Ask (reference the role change, show proof, ask for time)
    • ChampionBAB (before: the current state they inherited / after: what it looks like with your product / bridge: quick wins in 30 days)
    • Aligned mandatePAS (problem: what their mandate implies / agitate: why current tools fall short / solve: your product)
  2. Build personalization from enriched profile:

    Personalization Element Source Example
    Role change reference Step 1 "Congrats on the VP Sales role at Acme"
    Timing-aware framing Step 2 timing_window "Now that you've had a month to assess..."
    Background connection Step 2 background_signal "At Competitor Inc you used [similar tool]..."
    LinkedIn activity reference Step 3 linkedin_activity "Your post about scaling outbound resonated..."
    Company context Step 3 new_company_context "With Acme's Series B and growth plans..."
    Quick win offer Config quick_wins "Most VPs see [result] within their first 30 days with us"
  3. Adapt email angle by timing window:

    Window Touch 1 Approach Subject Line Pattern
    Honeymoon (0-30d) Welcome + quick win offer. Light touch — they're still onboarding. "Quick win for your first 90 days at {company}"
    Assessment (31-60d) Acknowledge they've been evaluating. Offer peer comparison. "What other {title}s are doing differently"
    Action (61-90d) They're making decisions now. Be direct about value. "{Product} for {company}'s {goal}"
  4. Follow email-drafting skill rules:

    • Touch 1: 50-90 words. Reference the role change + one personalization hook + soft CTA.
    • Touch 2: 30-50 words. New proof point or quick-win offer.
    • Touch 3: 20-40 words. Peer social proof or graceful breakup.
    • Tone: professional-sharp by default. Executives respond to conciseness and specificity, not chattiness.

Output Contract

email_sequences: [
  {
    leader: { full_name, email, title, company_name, role_relevance, timing_window }
    sequence: [
      {
        touch_number: integer
        send_day: integer
        subject: string
        body: string
        framework: string
        personalization_elements: {
          role_change: string          # How the role change was referenced
          timing: string              # How the timing window was used
          background: string          # How their background was leveraged
          company_context: string     # How their company context was used
          linkedin_reference: string | null  # Any LinkedIn activity referenced
        }
        word_count: integer
      }
    ]
  }
]

Human Checkpoint

Present samples covering different timing windows and role types:

## Sample Outreach for Review

### Jane Smith, VP Sales @ Acme Corp
Tier 1 | Direct buyer | Assessment window (32 days) | Previously at Competitor Inc

**Touch 1 — Day 1**
Subject: What other new VPs of Sales are changing first
> Hi Jane — congrats on the move to Acme. A month in, you've probably
> identified what's working and what isn't in the sales stack.
>
> [Product] is what [peer company] brought in during a similar transition —
> [specific result] within 30 days. [Your post about scaling outbound
> without scaling headcount] is exactly the problem we solve.
>
> Worth a 15-minute intro?

**Touch 2 — Day 5**
Subject: The playbook from [previous company] → Acme
> [full email referencing their background]

**Touch 3 — Day 12**
Subject: One last thought
> [breakup email]

---

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.

Output Contract

campaign_package: {
  tool: string
  file_path: string
  contact_count: integer
  sequence_touches: integer
  estimated_send_days: integer
  next_action: string
}

Human Checkpoint

## Campaign Ready

Tool: [configured tool]
Signal type: Leadership change
Contacts: X new leaders across Y companies
Sequence: 3 touches over 12 days

Ready to launch?

Execution Summary

Step Tool Dependency Human Checkpoint Typical Time
0. Config None First run only 5 min (once)
1. Detect Apollo Free Search + Enrichment by ID Review leadership changes + credits used ~90 sec (machine)
2. Evaluate None (LLM reasoning) Approve relevance + tier rankings 2-3 min
3. Enrich LinkedIn post scraper (optional) Review enriched profiles 1-2 min
4. Draft None (LLM reasoning) Review samples, iterate 5-10 min
5. Handoff Configurable (Smartlead, CSV, etc.) Final launch approval 1 min

Total machine time: ~90 seconds (Step 1 dominates — free search ~30s + enrichment ~60s for ~40 people) Total human review time: ~15-20 minutes Typical Apollo credit cost: 30-50 credits (1 per person enriched, after post-filter)


Key Difference from Other Signal Composites

In funding and hiring composites, the signal is about the company, and you then find people to contact. In leadership change, the signal IS the person. The new leader is both the signal and the primary contact. This changes the flow:

  • Funding/Hiring: Detect signal → Qualify company → Find people → Draft emails
  • Leadership change: Detect signal (person) → Evaluate relevance (person-to-product fit) → Enrich person → Draft emails

Step 3 is "Enrich" not "Find People" because you already know who to contact. The enrichment is about gathering enough context to write a deeply personalized email.


Tips

  • External hires are stronger signals than internal promotions. External hires are more likely to re-evaluate the vendor stack because they don't have loyalty to existing tools.
  • The 30-60 day window is the sweet spot. Too early (first week) and they're still onboarding. Too late (90+ days) and they've already made their decisions.
  • Reference their LinkedIn "new role" post if they made one. It shows you've done your homework and often reveals their stated priorities.
  • Don't mention the predecessor. Saying "replacing John" can be awkward. Just reference the role and the company.
  • Quick wins beat big transformations. New leaders need early credibility. Position your product as "a win in your first quarter" not "a 6-month implementation."
  • If they came from a customer of yours, that's the strongest possible hook. Lead with it. "You used [product] at [old company] — want to bring it to [new company]?"

Apollo-Specific Tips

  • Always use q_organization_domains (with q_ prefix) for domain filtering. The non-prefixed organization_domains returns random companies.
  • Never use person_seniority filters (e.g., ['vp', 'c_suite']). Apollo maps too many titles to these levels — you'll get AEs, recruiters, and ICs. Use explicit person_titles + local post-filter instead.
  • Enrich by id, not by name. Free search obfuscates last names. The id field from free search is the only reliable way to link to enrichment without full names.
  • bulk_enrich_people won't work here. It requires first_name + last_name + organization_name for matching, but free search hides last names. Use individual people/match calls with {"id": person_id} instead.
  • Apollo start dates are month-granularity (e.g., 2026-02-01 not 2026-02-14). When setting lookback windows, round to full months. A "last 15 days" scan should check the current and previous month.
  • Credits are only consumed on successful enrichment matches. If Apollo can't match a person (returns None), no credit is charged.
  • Rate limit handling: Add 0.5s delay every 5 enrichment calls. On 429, respect the Retry-After header (typically 60s).
1---
2name: leadership-change-outreach
3version: 2.0.0
4description: >
5 End-to-end leadership change signal composite. Takes any set of companies,
6 detects recent leadership changes (new VP+, C-suite hires and promotions),
7 evaluates relevance to your product, and drafts personalized outreach.
8 Uses Apollo People Search (free) for fast detection + Apollo Enrichment (1 credit/person)
9 for employment history, start dates, LinkedIn URLs, and verified emails.
10tags: [outreach]
11 
12graph:
13 provides:
14 - companies-with-leadership-changes # Companies with relevant new leaders
15 - new-leader-profiles # Details on the new leaders (enriched)
16 - personalized-email-sequences # Outreach drafts to new leaders
17 requires:
18 - company-list # Any list of companies (with domains)
19 - your-company-context # What you sell, what leaders care about
20 connects_to:
21 - skill: cold-email-outreach
22 when: "User wants to launch the campaign via their outreach tool"
23 passes: new-leader-profiles, personalized-email-sequences
24 - skill: linkedin-outreach
25 when: "User wants LinkedIn outreach instead of or alongside email"
26 passes: new-leader-profiles
27 capabilities: [apollo-lead-finder, email-drafting]
28---
29 
30# Leadership Change Outreach
31 
32Detects new leadership hires at target companies and evaluates whether the new leader is relevant to your product — as a direct buyer, a champion, or someone whose mandate aligns with what you sell. If relevant, enriches their profile and drafts personalized outreach that speaks to their new-role priorities.
33 
34**Why leadership changes work:** New leaders re-evaluate everything in their first 90 days. They inherit a vendor stack they didn't choose, a team they didn't build, and KPIs they need to hit fast. They're the most receptive buyers in any organization because:
35- They want to put their stamp on the department
36- They have a mandate (and often budget) to make changes
37- They need quick wins to build credibility with their new org
38- They haven't yet formed loyalty to existing vendors
39 
40## When to Auto-Load
41 
42Load this composite when:
43- User says "check for leadership changes", "new executive hires", "leadership signal outreach"
44- User has a list of companies and wants to find those with relevant new leaders
45- An upstream workflow (TAM Pulse, company monitoring) triggers a leadership change check
46 
47## Detection Method: Apollo (Free Search + Enrichment)
48 
49This composite uses a two-phase Apollo pipeline that replaces slower web search approaches:
50 
511. **Apollo Free Search**`search_people` with `q_organization_domains` + `person_titles` filters. Returns person IDs, obfuscated names, and titles. No credits consumed. Scans 100+ people across dozens of companies in ~30 seconds.
522. **Local Post-Filter** — Strict title matching to remove noise from Apollo's fuzzy matching (regional titles, sub-function heads, non-GTM roles). Typically reduces results by 50-60%.
533. **Apollo Enrichment by ID**`people/match` with the person `id` from free search. Returns full employment history with `start_date`/`end_date` for every role, LinkedIn URL, verified email, and full name. Costs 1 credit per person.
544. **Change Detection** — Filter enriched results by `start_date` on the `current: true` employment entry within the lookback window.
55 
56**Why this beats web search:** Web search relies on press releases and announcements — most leadership changes below C-suite are never publicly announced. Apollo pulls from LinkedIn profile data directly, catching changes that web search misses. Speed: ~90 seconds total vs 5+ minutes for web search.
57 
58**Cost:** 1 Apollo credit per person enriched. With a tight post-filter (VP+ GTM titles only), a scan of 10-15 companies typically costs 30-50 credits.
59 
60**Important:** Apollo tracks start dates at month granularity (e.g., `2026-02-01`), not exact day. Set lookback windows accordingly — use full months rather than exact day counts.
61 
62---
63 
64## Step 0: Configuration (One-Time Setup)
65 
66On first run for a client/user, collect and store these preferences. Skip on subsequent runs.
67 
68### Leader Relevance Mapping
69 
70| Question | Purpose | Stored As |
71|----------|---------|-----------|
72| What does your product do? (1-2 sentences) | Match against leader mandates | `company_description` |
73| What leader titles are **direct buyers** of your product? | Highest priority — they can sign the check | `buyer_leader_titles` |
74| What leader titles could **champion** your product? | They'd advocate internally or be an entry point | `champion_leader_titles` |
75| What leader titles have **mandates your product supports**? | Their goals align with your product's value | `aligned_leader_titles` |
76| What departments are relevant? | Filter out irrelevant leadership changes | `relevant_departments` |
77 
78**Example for a sales AI product:**
79```
80buyer_leader_titles: ["VP Sales", "CRO", "Chief Revenue Officer", "SVP Sales"]
81champion_leader_titles: ["Director of Sales Ops", "Head of Revenue Operations", "VP Business Development"]
82aligned_leader_titles: ["COO", "CEO", "VP Operations"]
83relevant_departments: ["Sales", "Revenue", "Operations", "Business Development"]
84```
85 
86### Signal Detection Config
87| Question | Options | Stored As |
88|----------|---------|-----------|
89| How far back should we look? | 30 / 60 / 90 days (default: 90) | `lookback_days` |
90| Minimum seniority for detection? | VP+ (default) / Head+ / Director+ | `min_seniority` |
91 
92### Apollo Title List
93 
94The free search uses `person_titles` to filter. Define these based on the client's buyer/champion/aligned titles. Default VP+ GTM titles:
95 
96```python
97titles = [
98 # C-Suite
99 'CRO', 'Chief Revenue Officer',
100 'CMO', 'Chief Marketing Officer',
101 'CCO', 'Chief Commercial Officer',
102 # VP-level (Sales, Marketing, Growth, Revenue, RevOps, Demand Gen, BD, Partnerships, CS, Commercial, GTM)
103 'VP of Sales', 'VP Sales', 'Vice President of Sales', 'Vice President Sales',
104 'SVP Sales', 'SVP of Sales',
105 'VP of Marketing', 'VP Marketing', 'Vice President of Marketing',
106 'SVP Marketing', 'SVP of Marketing',
107 'VP of Growth', 'VP Growth', 'Vice President of Growth',
108 'VP of Revenue', 'VP Revenue', 'Vice President of Revenue',
109 'VP of Revenue Operations', 'VP RevOps',
110 'VP of Demand Generation', 'VP Demand Gen',
111 'VP of Business Development', 'VP Business Development',
112 'VP of Partnerships', 'VP Partnerships',
113 'VP of Customer Success', 'VP Customer Success',
114 'VP of Commercial', 'VP Commercial',
115 'VP GTM', 'VP of GTM',
116 # Head-level
117 'Head of Sales', 'Head of Marketing', 'Head of Growth',
118 'Head of Revenue', 'Head of Revenue Operations', 'Head of RevOps',
119 'Head of Demand Generation', 'Head of Demand Gen',
120 'Head of Business Development', 'Head of Partnerships',
121 'Head of Customer Success', 'Head of Commercial',
122 'Head of GTM',
123]
124```
125 
126**Important:** Do NOT use Apollo's `person_seniority` filter (e.g., `['vp', 'c_suite']`) — it's too broad and returns regional managers, ICs with inflated titles, etc. Use explicit `person_titles` and post-filter locally instead.
127 
128### Post-Filter Rules
129 
130Apollo does fuzzy title matching, so results will include noise. Apply a strict local post-filter that:
131 
1321. **Rejects non-GTM functions:** engineering, talent, legal, privacy, data science, analytics, product marketing, field marketing, partner marketing, customer marketing, content, communications, community, solutions marketing, enablement, marketing operations
1332. **Rejects regional/sub-segment roles:** Area VP, AVP, regional heads, EMEA/APAC/Americas-specific roles, enterprise sales by region (West/East/Central/etc.), channel sales, velocity sales, sales development, sales finance, sales strategy
1343. **Rejects Apollo garbage:** Any title containing "related to search terms"
1354. **Requires valid prefix:** Title must start with VP/Vice President/SVP/Head of/Chief/CRO/CMO/CCO/President
136 
137This typically reduces results by 50-60% (e.g., 100 raw → 40 filtered).
138 
139### Outreach Config
140| Question | Options | Stored As |
141|----------|---------|-----------|
142| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / CSV export | `outreach_tool` |
143| Email or multi-channel? | Email only / Email + LinkedIn | `outreach_channels` |
144 
145### Your Company Context
146| Question | Purpose | Stored As |
147|----------|---------|-----------|
148| What problem do you solve? | Email hook | `pain_point` |
149| Name 2-3 proof points (customers, metrics, results) | Email credibility | `proof_points` |
150| What quick wins can a new leader get from your product? | First-90-days angle | `quick_wins` |
151| What does the "before" state look like without your product? | Pain framing | `before_state` |
152 
153**Store config in:** `clients/<client-name>/config/signal-outreach.json` or equivalent.
154 
155---
156 
157## Step 1: Detect Leadership Changes (Apollo Pipeline)
158 
159**Purpose:** For each company in the input list, find VP+ GTM leaders and detect who started recently.
160 
161### Input Contract
162 
163```
164companies: [
165 {
166 name: string # Required
167 domain: string # Required (used for q_organization_domains)
168 industry?: string # Optional
169 size?: string # Optional
170 }
171]
172titles: string[] # From config (default VP+ GTM list above)
173lookback_days: integer # From config (default: 90)
174```
175 
176### Process
177 
178#### Phase 1: Apollo Free Search (~30 seconds)
179 
180Use `apollo_client.search_people()` with:
181```python
182filters = {
183 'q_organization_domains': '\n'.join([c['domain'] for c in companies]), # All domains in one query
184 'person_titles': titles, # From config
185 'per_page': 100,
186 'page': 1
187}
188```
189 
190**Key details:**
191- Use `q_organization_domains` (NOT `organization_domains`) — the `q_` prefix is required for domain filtering
192- All company domains can be passed in a single query (newline-separated)
193- Free tier returns: `id`, `first_name`, `last_name` (obfuscated as "?"), `title`, `organization.name`, `last_refreshed_at`
194- Free tier does NOT return: full last name, LinkedIn URL, email, or employment history
195- If `total_entries > 100`, paginate with `page: 2`, etc.
196 
197#### Phase 2: Local Post-Filter (~instant)
198 
199Apply the strict post-filter rules from Step 0 to remove noise. This is critical — Apollo's fuzzy title matching will return regional managers, sub-function heads, and non-GTM roles.
200 
201```python
202def is_valid_gtm_leader(title):
203 """Returns True only for top-level GTM leadership roles."""
204 tl = title.lower().strip()
205 
206 # 1. Reject non-GTM functions
207 reject_keywords = ['engineering', 'engineer', 'talent', 'legal', 'privacy',
208 'data science', 'analytics', 'product marketing',
209 'field marketing', 'partner marketing', 'customer marketing',
210 'content', 'communications', 'community',
211 'channel sales', 'solutions marketing',
212 'enablement', 'education', 'operations & marketing',
213 'marketing operations']
214 if any(kw in tl for kw in reject_keywords):
215 return False
216 
217 # 2. Reject regional/sub-segment roles
218 regional_keywords = ['area vice president', 'avp ', 'regional', 'emea', 'apac',
219 'apj', 'americas', 'enterprise sales west', 'enterprise sales east',
220 'enterprise sales central', 'enterprise sales south',
221 'enterprise sales north', 'enterprise sales -',
222 'enterprise sales,', 'na enterprise',
223 'majors sales', 'velocity sales',
224 'canada', 'latin america', 'u.s.', 'uk&i',
225 'chief of staff', 'sales finance', 'sales strategy',
226 'sales development']
227 if any(kw in tl for kw in regional_keywords):
228 return False
229 
230 # 3. Reject Apollo garbage
231 if 'related to search terms' in tl:
232 return False
233 
234 # 4. Must start with a valid prefix
235 valid_prefixes = [
236 'vp ', 'vp,', 'vp/', 'vice president of', 'vice president,',
237 'svp', 'senior vice president',
238 'head of sales', 'head of marketing', 'head of growth',
239 'head of revenue', 'head of demand gen', 'head of business development',
240 'head of partnerships', 'head of customer success', 'head of commercial',
241 'head of gtm',
242 'chief revenue officer', 'chief marketing officer', 'chief commercial officer',
243 'cro', 'cmo', 'cco',
244 'president',
245 ]
246 return any(tl.startswith(p) for p in valid_prefixes)
247```
248 
249#### Phase 3: Apollo Enrichment by ID (~1 second per person)
250 
251For each person that passes the post-filter, enrich using the `id` from free search:
252 
253```python
254# Use the person's id from free search — this is the key to making enrichment work
255# without full names (which free tier obfuscates)
256url = "https://api.apollo.io/api/v1/people/match"
257payload = {"api_key": api_key, "id": person_id}
258```
259 
260**What enrichment returns (1 credit per person):**
261- `name` — full name (no longer obfuscated)
262- `employment_history` — array of all roles with `start_date`, `end_date`, `title`, `organization_name`, `current` (boolean)
263- `linkedin_url` — full LinkedIn profile URL
264- `email` + `email_status` — verified work email
265- `city`, `state`, `country` — location
266 
267**Important:** Do NOT use `bulk_enrich_people` with first_name + organization_name — free search obfuscates last names, and Apollo can't match without them. Always enrich by `id`.
268 
269**Rate limiting:** Add a small delay (0.5s) every 5 requests to avoid 429s. If rate limited, respect the `Retry-After` header.
270 
271#### Phase 4: Change Detection
272 
273For each enriched person, extract the `current: true` employment entry and check its `start_date`:
274 
275```python
276emp_history = person.get('employment_history', [])
277current_role = next((e for e in emp_history if e.get('current')), None)
278start_date = current_role.get('start_date', '') if current_role else '' # e.g. "2026-02-01"
279 
280# Check if within lookback window
281# Note: Apollo uses month granularity (YYYY-MM-01), not exact day
282```
283 
284Determine change type:
285- **new_hire**: Previous role was at a different company
286- **internal_promotion**: Previous role was at the same company
287 
288### Output Contract
289 
290```
291leadership_changes: [
292 {
293 company: {
294 name: string
295 domain: string
296 }
297 new_leader: {
298 full_name: string
299 new_title: string
300 start_date: string # ISO date (month granularity: "2026-02-01")
301 previous_company: string
302 previous_title: string
303 change_type: "new_hire" | "internal_promotion"
304 linkedin_url: string
305 email: string
306 email_status: string # "verified", "guessed", etc.
307 city: string
308 state: string
309 country: string
310 }
311 }
312]
313```
314 
315### Output Files
316 
317Save two files:
3181. **CSV** (`leadership-change-scan.csv`) — all enriched people sorted by start_date descending, with columns: name, title, company, domain, start_date, change_type, previous_title, previous_company, previous_end_date, email, email_status, linkedin_url, city, state, country
3192. **Markdown** (`leadership-change-outreach.md`) — formatted report with signal summary, qualification, and email drafts
320 
321### Human Checkpoint
322 
323```
324Scanned X companies → Y raw results → Z after post-filter → W enriched
325 
326Leadership changes in last {lookback_days} days:
327 
328| Company | New Leader | Title | Started | Previous Role | Type |
329|---------|-----------|-------|---------|---------------|------|
330| Acme Corp | Jane Smith | VP Sales | 2026-02-01 | Dir. Sales @ Competitor Inc | new_hire |
331| Beta Inc | Tom Brown | CRO | 2026-01-01 | VP Revenue @ Beta Inc | internal_promotion |
332 
333Credits used: W
334 
335Proceed with relevance evaluation? (Y/n)
336```
337 
338---
339 
340## Step 2: Evaluate Relevance & Prioritize
341 
342**Purpose:** For each leadership change, evaluate whether the new leader is relevant to your product — and determine the best outreach approach. Pure LLM reasoning — inherently tool-agnostic.
343 
344### Input Contract
345 
346```
347leadership_changes: [...] # From Step 1 output
348your_company: {
349 description: string
350 pain_point: string
351 proof_points: string[]
352 quick_wins: string[]
353 before_state: string
354}
355buyer_leader_titles: string[]
356champion_leader_titles: string[]
357aligned_leader_titles: string[]
358```
359 
360### Process
361 
362For each leadership change, evaluate across three dimensions:
363 
364#### A) Role Relevance
365 
366| Category | Match Criteria | Priority |
367|----------|---------------|----------|
368| **Direct buyer** | Title matches `buyer_leader_titles` | Highest — they can make the purchase decision |
369| **Champion** | Title matches `champion_leader_titles` | High — they can advocate and influence the buyer |
370| **Aligned mandate** | Title matches `aligned_leader_titles` | Medium — their goals benefit from your product |
371| **No relevance** | Title matches none of the lists | Drop |
372 
373#### B) Timing Window
374 
375| Days in Role | Window | Outreach Tone |
376|-------------|--------|---------------|
377| 0-30 days | **Honeymoon** | "Welcome aboard — here's something to help you hit the ground running" |
378| 31-60 days | **Assessment** | "Now that you've had a month to assess the stack, here's what peers are doing" |
379| 61-90 days | **Action** | "You're probably finalizing your roadmap — here's a quick win to consider" |
380| 90+ days | **Established** | Weaker signal but still valid — "Saw you joined [company] recently" |
381 
382#### C) Background Signal
383 
384The new leader's previous company and role adds context:
385 
386| Background | Signal | How to Use |
387|-----------|--------|-----------|
388| Came from a **customer** of yours | Strongest possible — they already know your product | "You used [product] at [previous company] — want to bring it to [new company]?" |
389| Came from a **competitor's customer** | They have experience with the category | "At [previous company] you used [competitor] — here's how [product] compares" |
390| Came from **same industry** | They understand the pain points | Reference industry-specific problems they've seen |
391| Came from **different industry** | Fresh perspective, may be open to new approaches | "The playbook from [old industry] doesn't always translate — here's what works in [new industry]" |
392| **Internal promotion** | They know the existing stack and its shortcomings | "Now that you own the budget, here's what your team has been asking for" |
393 
394### Scoring
395 
396- **Tier 1 (Act Today):** Direct buyer + <30 days in role + external hire. Fresh eyes, budget authority, evaluating everything.
397- **Tier 2 (Act This Week):** Direct buyer 30-60 days in, OR champion <30 days, OR came from a customer/competitor customer.
398- **Tier 3 (Queue):** Aligned mandate, OR 60-90 days in role, OR internal promotion with champion title.
399- **Drop:** No role relevance, OR >90 days in role with weak fit.
400 
401For each qualified leader, generate:
402- **Relevance reasoning:** Why this leader would care about your product right now
403- **Outreach angle:** The specific hook based on their role + timing + background
404- **Key insight:** One thing about their situation that makes the outreach personal
405 
406### Output Contract
407 
408```
409qualified_leaders: [
410 {
411 ...leadership_change_fields,
412 role_relevance: "direct_buyer" | "champion" | "aligned_mandate"
413 timing_window: "honeymoon" | "assessment" | "action" | "established"
414 background_signal: string # e.g. "Came from a competitor customer"
415 priority_tier: "tier_1" | "tier_2" | "tier_3"
416 relevance_reasoning: string
417 outreach_angle: string
418 key_insight: string
419 }
420]
421dropped_leaders: [
422 { name: string, company: string, drop_reason: string }
423]
424```
425 
426### Human Checkpoint
427 
428```
429## Relevance Evaluation
430 
431### Tier 1 — Act Today (X leaders)
432| Leader | Company | Title | Days In | Type | Angle |
433|--------|---------|-------|---------|------|-------|
434| Jane Smith | Acme | VP Sales | 32 | Direct buyer, Assessment window | "Now that you've assessed the sales stack at Acme..." |
435 
436### Tier 2 — Act This Week (X leaders)
437| ... |
438 
439### Tier 3 — Queue (X leaders)
440| ... |
441 
442### Dropped (X leaders)
443| Leader | Company | Reason |
444|--------|---------|--------|
445| ... | ... | ... |
446 
447Approve before we draft outreach?
448```
449 
450---
451 
452## Step 3: Enrich Leader Profile
453 
454**Purpose:** For each qualified leader, gather additional context to power personalization. Apollo enrichment (Step 1) already provides email, LinkedIn URL, and full employment history. This step adds context that Apollo doesn't provide.
455 
456### Input Contract
457 
458```
459qualified_leaders: [...] # From Step 2 output (already has email, linkedin, emp history from Apollo)
460```
461 
462### Process
463 
464Apollo enrichment from Step 1 already gives us:
465- Full name, verified email, LinkedIn URL
466- Complete employment history (all prior roles with start/end dates)
467- Location (city, state, country)
468 
469For each qualified leader, add context that Apollo doesn't provide:
470 
4711. **LinkedIn activity** (optional but high-value — use `linkedin-profile-post-scraper` if available):
472 - Recent posts or shares — what are they talking about?
473 - Any posts about starting the new role — what did they say about their priorities?
474 
4752. **Previous company context** (derive from employment history):
476 - What does their previous company do?
477 - Did they use your product (or a competitor's) there?
478 - What was their tenure? (Long tenure = deep expertise. Short tenure = may be a career mover.)
479 
4803. **New company context:**
481 - What does the new company do?
482 - Any recent company news beyond the leadership change?
483 
484### Output Contract
485 
486```
487enriched_leaders: [
488 {
489 ...qualified_leader_fields,
490 email: string | null # Already from Apollo
491 linkedin_url: string # Already from Apollo
492 linkedin_activity: {
493 recent_posts: string[] # 2-3 most relevant post summaries
494 new_role_post: string | null # What they said about starting this role
495 } | null
496 previous_company_context: string # 1-2 sentences about their old company
497 new_company_context: string # 1-2 sentences about what this company does
498 personalization_hooks: string[] # 3-5 things to reference in the email
499 }
500]
501```
502 
503### Human Checkpoint
504 
505```
506## Enriched Leader Profiles
507 
508### Jane Smith — VP Sales @ Acme Corp (Tier 1)
509- Email: [email protected] (verified)
510- LinkedIn: linkedin.com/in/janesmith
511- Previously: Director of Sales @ Competitor Inc (3 years)
512- New role post: "Excited to join Acme Corp as VP Sales..."
513- Personalization hooks:
514 1. Posted about "scaling outbound without scaling headcount" 2 weeks ago
515 2. Previous company used [competitor product]
516 3. Acme recently raised Series B ($40M)
517 
518### Tom Brown — CRO @ Beta Inc (Tier 2)
519| ... |
520 
521Approve before we draft outreach?
522```
523 
524---
525 
526## Step 4: Draft Personalized Outreach
527 
528**Purpose:** Draft outreach to each new leader that demonstrates you understand their situation — new role, new priorities, tight timeline. Pure LLM reasoning — inherently tool-agnostic.
529 
530### Input Contract
531 
532```
533enriched_leaders: [...] # From Step 3 output
534your_company: {
535 description: string
536 pain_point: string
537 proof_points: string[]
538 quick_wins: string[]
539 before_state: string
540}
541sequence_config: {
542 touches: integer # Default: 3
543 timing: integer[] # Default: [1, 5, 12]
544 tone: string # Default: "professional-sharp" (executives expect this)
545 cta: string # Default: "15-min intro call"
546}
547```
548 
549### Process
550 
5511. **Select framework based on role relevance:**
552 - **Direct buyer****Signal-Proof-Ask** (reference the role change, show proof, ask for time)
553 - **Champion****BAB** (before: the current state they inherited / after: what it looks like with your product / bridge: quick wins in 30 days)
554 - **Aligned mandate****PAS** (problem: what their mandate implies / agitate: why current tools fall short / solve: your product)
555 
5562. **Build personalization from enriched profile:**
557 
558 | Personalization Element | Source | Example |
559 |------------------------|--------|---------|
560 | Role change reference | Step 1 | "Congrats on the VP Sales role at Acme" |
561 | Timing-aware framing | Step 2 timing_window | "Now that you've had a month to assess..." |
562 | Background connection | Step 2 background_signal | "At Competitor Inc you used [similar tool]..." |
563 | LinkedIn activity reference | Step 3 linkedin_activity | "Your post about scaling outbound resonated..." |
564 | Company context | Step 3 new_company_context | "With Acme's Series B and growth plans..." |
565 | Quick win offer | Config quick_wins | "Most VPs see [result] within their first 30 days with us" |
566 
5673. **Adapt email angle by timing window:**
568 
569 | Window | Touch 1 Approach | Subject Line Pattern |
570 |--------|-----------------|---------------------|
571 | **Honeymoon** (0-30d) | Welcome + quick win offer. Light touch — they're still onboarding. | "Quick win for your first 90 days at {company}" |
572 | **Assessment** (31-60d) | Acknowledge they've been evaluating. Offer peer comparison. | "What other {title}s are doing differently" |
573 | **Action** (61-90d) | They're making decisions now. Be direct about value. | "{Product} for {company}'s {goal}" |
574 
5754. **Follow `email-drafting` skill rules:**
576 - Touch 1: 50-90 words. Reference the role change + one personalization hook + soft CTA.
577 - Touch 2: 30-50 words. New proof point or quick-win offer.
578 - Touch 3: 20-40 words. Peer social proof or graceful breakup.
579 - **Tone: professional-sharp by default.** Executives respond to conciseness and specificity, not chattiness.
580 
581### Output Contract
582 
583```
584email_sequences: [
585 {
586 leader: { full_name, email, title, company_name, role_relevance, timing_window }
587 sequence: [
588 {
589 touch_number: integer
590 send_day: integer
591 subject: string
592 body: string
593 framework: string
594 personalization_elements: {
595 role_change: string # How the role change was referenced
596 timing: string # How the timing window was used
597 background: string # How their background was leveraged
598 company_context: string # How their company context was used
599 linkedin_reference: string | null # Any LinkedIn activity referenced
600 }
601 word_count: integer
602 }
603 ]
604 }
605]
606```
607 
608### Human Checkpoint
609 
610Present samples covering different timing windows and role types:
611 
612```
613## Sample Outreach for Review
614 
615### Jane Smith, VP Sales @ Acme Corp
616Tier 1 | Direct buyer | Assessment window (32 days) | Previously at Competitor Inc
617 
618**Touch 1 — Day 1**
619Subject: What other new VPs of Sales are changing first
620> Hi Jane — congrats on the move to Acme. A month in, you've probably
621> identified what's working and what isn't in the sales stack.
622>
623> [Product] is what [peer company] brought in during a similar transition —
624> [specific result] within 30 days. [Your post about scaling outbound
625> without scaling headcount] is exactly the problem we solve.
626>
627> Worth a 15-minute intro?
628 
629**Touch 2 — Day 5**
630Subject: The playbook from [previous company] → Acme
631> [full email referencing their background]
632 
633**Touch 3 — Day 12**
634Subject: One last thought
635> [breakup email]
636 
637---
638 
639Approve these samples? I'll generate the rest in the same style.
640```
641 
642---
643 
644## Step 5: Handoff to Outreach
645 
646Identical to `funding-signal-outreach` Step 5. Package contacts + email sequences for the configured outreach tool.
647 
648### Output Contract
649 
650```
651campaign_package: {
652 tool: string
653 file_path: string
654 contact_count: integer
655 sequence_touches: integer
656 estimated_send_days: integer
657 next_action: string
658}
659```
660 
661### Human Checkpoint
662 
663```
664## Campaign Ready
665 
666Tool: [configured tool]
667Signal type: Leadership change
668Contacts: X new leaders across Y companies
669Sequence: 3 touches over 12 days
670 
671Ready to launch?
672```
673 
674---
675 
676## Execution Summary
677 
678| Step | Tool Dependency | Human Checkpoint | Typical Time |
679|------|----------------|-----------------|--------------|
680| 0. Config | None | First run only | 5 min (once) |
681| 1. Detect | Apollo Free Search + Enrichment by ID | Review leadership changes + credits used | ~90 sec (machine) |
682| 2. Evaluate | None (LLM reasoning) | Approve relevance + tier rankings | 2-3 min |
683| 3. Enrich | LinkedIn post scraper (optional) | Review enriched profiles | 1-2 min |
684| 4. Draft | None (LLM reasoning) | Review samples, iterate | 5-10 min |
685| 5. Handoff | Configurable (Smartlead, CSV, etc.) | Final launch approval | 1 min |
686 
687**Total machine time: ~90 seconds** (Step 1 dominates — free search ~30s + enrichment ~60s for ~40 people)
688**Total human review time: ~15-20 minutes**
689**Typical Apollo credit cost: 30-50 credits** (1 per person enriched, after post-filter)
690 
691---
692 
693## Key Difference from Other Signal Composites
694 
695In funding and hiring composites, the signal is about the company, and you then find people to contact. In leadership change, **the signal IS the person.** The new leader is both the signal and the primary contact. This changes the flow:
696 
697- **Funding/Hiring:** Detect signal → Qualify company → Find people → Draft emails
698- **Leadership change:** Detect signal (person) → Evaluate relevance (person-to-product fit) → Enrich person → Draft emails
699 
700Step 3 is "Enrich" not "Find People" because you already know who to contact. The enrichment is about gathering enough context to write a deeply personalized email.
701 
702---
703 
704## Tips
705 
706- **External hires are stronger signals than internal promotions.** External hires are more likely to re-evaluate the vendor stack because they don't have loyalty to existing tools.
707- **The 30-60 day window is the sweet spot.** Too early (first week) and they're still onboarding. Too late (90+ days) and they've already made their decisions.
708- **Reference their LinkedIn "new role" post if they made one.** It shows you've done your homework and often reveals their stated priorities.
709- **Don't mention the predecessor.** Saying "replacing John" can be awkward. Just reference the role and the company.
710- **Quick wins beat big transformations.** New leaders need early credibility. Position your product as "a win in your first quarter" not "a 6-month implementation."
711- **If they came from a customer of yours, that's the strongest possible hook.** Lead with it. "You used [product] at [old company] — want to bring it to [new company]?"
712 
713### Apollo-Specific Tips
714 
715- **Always use `q_organization_domains` (with `q_` prefix)** for domain filtering. The non-prefixed `organization_domains` returns random companies.
716- **Never use `person_seniority` filters** (e.g., `['vp', 'c_suite']`). Apollo maps too many titles to these levels — you'll get AEs, recruiters, and ICs. Use explicit `person_titles` + local post-filter instead.
717- **Enrich by `id`, not by name.** Free search obfuscates last names. The `id` field from free search is the only reliable way to link to enrichment without full names.
718- **`bulk_enrich_people` won't work here.** It requires first_name + last_name + organization_name for matching, but free search hides last names. Use individual `people/match` calls with `{"id": person_id}` instead.
719- **Apollo start dates are month-granularity** (e.g., `2026-02-01` not `2026-02-14`). When setting lookback windows, round to full months. A "last 15 days" scan should check the current and previous month.
720- **Credits are only consumed on successful enrichment matches.** If Apollo can't match a person (returns `None`), no credit is charged.
721- **Rate limit handling:** Add 0.5s delay every 5 enrichment calls. On 429, respect the `Retry-After` header (typically 60s).
722 

Discussion

Alternatives

Also in Company & contact data