Hiring signal outreach

End-to-end hiring signal composite.

How to use it

  1. Hit Copy the whole skill.
  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/hiring-signal-outreach#main ~/.claude/skills/hiring-signal-outreach

For one project only, change the path to .claude/skills/hiring-signal-outreach.

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 text534 lines
hiring-signal-outreach/SKILL.md534 lines20.0 KBpushed 96d agoRawView on GitHub

Hiring Signal Outreach

Detects job postings at target companies where the role being hired for is one your product augments, replaces, or directly supports. Finds the right people to contact (not just the person being hired — the hiring manager, budget holder, and potential champions), then drafts personalized outreach using the job posting as the hook.

Why hiring signals work: When a company posts a job, they've already acknowledged the problem your product solves. They've budgeted for it (headcount is budget). They're actively evaluating how to solve it. Your email arrives at exactly the moment they're thinking about this problem — and you're offering a faster, cheaper, or complementary solution.

When to Auto-Load

Load this composite when:

  • User says "check if any of these companies are hiring for roles we replace", "job posting signals", "hiring signal outreach"
  • User has a list of companies and wants to find those hiring for relevant roles
  • An upstream workflow (TAM Pulse, company monitoring) triggers a hiring signal check

Step 0: Configuration (One-Time Setup)

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

Role Mapping (Critical — This Defines What Signals Matter)

Question Purpose Stored As
What does your product do? (1-2 sentences) Match against job descriptions company_description
What job roles does your product replace? Strongest signal — they're hiring for what you automate roles_replaced
What job roles does your product augment? Good signal — your product makes this person more effective roles_augmented
What job roles buy your product? Contact finding — who holds the budget buyer_titles
What job roles champion your product? Contact finding — who feels the pain daily champion_titles
What job roles use your product? Contact finding — who would operate it user_titles
What keywords in a job description indicate relevance? Filters out false positives jd_keywords

Example for an AI calling product:

roles_replaced: ["BDC Representative", "Call Center Agent", "Appointment Setter"]
roles_augmented: ["Sales Manager", "BDC Manager", "Service Advisor"]
buyer_titles: ["VP Sales", "Director of Operations", "General Manager", "COO"]
champion_titles: ["BDC Manager", "Sales Manager", "Fixed Ops Director"]
user_titles: ["BDC Rep", "Service Advisor", "Sales Consultant"]
jd_keywords: ["inbound calls", "outbound calls", "appointment setting", "customer follow-up"]

Signal Detection Config

Question Options Stored As
How should we find job postings? LinkedIn Jobs / Indeed / Apollo / Google Jobs / Web search job_search_tool
How far back should we look? 7 / 14 / 30 days lookback_days

Contact Finding Config

Question Options Stored As
How should we find contacts at these companies? Apollo / LinkedIn / Clearbit / Web search contact_tool

Outreach Config

Question Options Stored As
Where do you want outreach sent? Smartlead / Instantly / Outreach.io / Lemlist / 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's the cost comparison vs. a full-time hire? ROI angle for outreach cost_comparison
How fast can you deploy vs. a new hire? Speed angle deployment_speed

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


Step 1: Detect Hiring Signals

Purpose: For each company in the input list, find active job postings that match roles your product replaces or augments.

Input Contract

companies: [
  {
    name: string          # Required
    domain: string        # Required
    industry?: string     # Optional
    size?: string         # Optional
  }
]
roles_replaced: string[]          # From config
roles_augmented: string[]         # From config
jd_keywords: string[]             # From config
lookback_days: integer             # From config (default: 14)

Process

For each company (or in batches):

  1. Search for job postings using the configured job_search_tool:

    • LinkedIn Jobs: Search company_name + role_title for each role in roles_replaced and roles_augmented
    • Indeed: Same search pattern
    • Apollo: Company enrichment → job postings
    • Google Jobs: site:linkedin.com/jobs OR site:indeed.com "{company}" "{role}"
    • Web search: "{company_name}" AND ("hiring" OR "job" OR "careers") AND ("{role_1}" OR "{role_2}")
  2. For each job posting found, extract:

    • Job title
    • Location (remote/onsite/hybrid)
    • Posted date
    • Job description summary (key responsibilities)
    • Source URL
  3. Classify each posting:

    • Replaces: The job title matches roles_replaced. Your product could eliminate or reduce the need for this hire. This is the strongest signal.
    • Augments: The job title matches roles_augmented. Your product makes this person more effective — they'd want it as a tool. Good signal.
    • Keyword match: Title doesn't match but the JD contains jd_keywords. Weaker signal — verify relevance.
  4. Filter: Drop companies with no matching job postings. Drop postings older than lookback_days.

Output Contract

companies_hiring: [
  {
    company: {
      name: string
      domain: string
      industry: string
    }
    job_postings: [
      {
        title: string
        location: string
        posted_date: string
        description_summary: string     # 2-3 sentence summary of the role
        source_url: string
        signal_type: "replaces" | "augments" | "keyword_match"
        relevance_reasoning: string     # Why this posting matters for your product
      }
    ]
    posting_count: integer
    strongest_signal: "replaces" | "augments" | "keyword_match"
  }
]

Human Checkpoint

Found hiring signals at X of Y companies:

| Company | Postings | Strongest Signal | Top Role | Posted |
|---------|----------|-----------------|----------|--------|
| Acme Corp | 3 | Replaces | BDC Representative | 3 days ago |
| Beta Inc | 1 | Augments | Sales Manager | 1 week ago |
| ...     | ...      | ...             | ...      | ...    |

Signal breakdown: X "replaces" (strongest), Y "augments", Z "keyword match"

Proceed with qualification? (Y/n)

Step 2: Qualify & Prioritize

Purpose: Rank companies by outreach priority based on signal strength, relevance, and timing. Pure LLM reasoning — inherently tool-agnostic.

Input Contract

companies_hiring: [...]           # From Step 1 output
your_company: {
  description: string
  pain_point: string
  proof_points: string[]
  cost_comparison: string
  deployment_speed: string
}

Process

For each company, evaluate:

Criterion Weight How to Assess
Signal type Highest "Replaces" > "Augments" > "Keyword match"
Posting volume High Multiple relevant postings = scaling that function = bigger need
Recency High Posted <7 days ago = actively evaluating. 14+ days = may have candidates already
Role seniority Medium Hiring a VP of the function you sell into = strategic buy. Hiring an individual contributor = operational buy. Both are good, different approach.
Industry fit Medium Is their industry one where your product has proven results?

Scoring

  • Tier 1 (Act Today): "Replaces" signal + posted within 7 days. They're literally budgeting for what you sell.
  • Tier 2 (Act This Week): "Replaces" signal 7-14 days old, OR "Augments" signal <7 days with multiple postings.
  • Tier 3 (Queue): "Augments" or "keyword match" signals. Worth reaching out but lower urgency.
  • Drop: Keyword match only with weak relevance after reviewing the JD.

For each qualified company, generate:

  • Relevance reasoning: Why this hiring pattern matters for your product
  • Outreach angle: The specific connection between their job posting and your product
    • "Replaces" → "Before you fill that role, consider what [product] does instead"
    • "Augments" → "Your new [role] will need tools like [product] to hit the ground running"
  • Recommended framing: Replace (you don't need to hire for this), Complement (your new hire will be 3x more effective with this), or Scale (you need 5 of these people — or 1 person + our product)

Output Contract

qualified_companies: [
  {
    ...company_hiring_fields,
    priority_tier: "tier_1" | "tier_2" | "tier_3"
    relevance_reasoning: string
    outreach_angle: string
    recommended_framing: "replace" | "complement" | "scale"
  }
]
dropped_companies: [
  { name: string, drop_reason: string }
]

Human Checkpoint

## Qualification Results

### Tier 1 — Act Today (X companies)
| Company | Signal | Top Role | Framing | Angle |
|---------|--------|----------|---------|-------|
| Acme Corp | Replaces | BDC Rep (x3) | Replace | Before you hire 3 BDC reps... |

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

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

### Dropped (X companies)
| Company | Reason |
|---------|--------|
| ...     | ...    |

Approve this list before we find contacts?

Step 3: Find Relevant People

Purpose: For each qualified company, find the right people to contact. Unlike the funding composite, here we also identify who posted the job (the hiring manager) — they're often the best first contact.

Input Contract

qualified_companies: [...]        # From Step 2 output
buyer_titles: string[]            # From config
champion_titles: string[]         # From config
user_titles: string[]             # From config
max_contacts_per_company: integer  # Default: 3-5

Process

For each qualified company, use the configured contact_tool:

  1. First: Identify the hiring manager. The person who posted or owns the job posting is the most relevant contact.

    • Check the job posting source for the hiring manager's name
    • If not listed, search for people at the company with titles one level above the posted role
    • The hiring manager is often the strongest contact because they own the problem your product solves
  2. Second: Find buyer-level contacts. People with buyer_titles at this company — they control budget.

  3. Third: Find champions. People with champion_titles — they feel the pain daily and can advocate internally.

  4. Classify each contact:

    • Hiring manager — Posted the role. Directly owns the problem. Best for "replace" framing.
    • Buyer — Controls budget. Best for ROI/cost-comparison framing.
    • Champion — Lives the pain. Best for "complement" or "make your life easier" framing.
    • User — Would operate the product. Best for bottom-up adoption.
  5. Cap at max_contacts_per_company. Prioritize: hiring manager > buyer > champion > user.

Output Contract

contacts: [
  {
    person: {
      full_name: string
      first_name: string
      last_name: string
      title: string
      email: string | null
      linkedin_url: string | null
      role_type: "hiring_manager" | "buyer" | "champion" | "user"
    }
    company: {
      name: string
      domain: string
      priority_tier: string
      outreach_angle: string
      recommended_framing: string
    }
    job_context: {
      relevant_posting_title: string        # The job posting that triggered this signal
      signal_type: string                    # "replaces" or "augments"
      posting_url: string
      description_summary: string
    }
  }
]

Human Checkpoint

## Contacts Found

### Acme Corp (Tier 1 — Hiring 3x BDC Reps, "Replace" framing)
| Name | Title | Role Type | Email | LinkedIn |
|------|-------|-----------|-------|----------|
| Sarah Chen | VP Sales | Hiring Manager | [email protected] | ... |
| Mike Johnson | COO | Buyer | [email protected] | ... |
| Lisa Park | BDC Manager | Champion | [email protected] | ... |

Relevant posting: "BDC Representative" (posted 3 days ago)

### Beta Inc (Tier 2 — Hiring Sales Manager, "Complement" framing)
| ... |

Total: X contacts across Y companies

Approve before we draft emails?

Step 4: Draft Personalized Emails

Purpose: For each contact, draft a personalized email sequence using three layers of personalization: the job posting context, your company's value, and the prospect's company context. Pure LLM reasoning — inherently tool-agnostic.

Input Contract

contacts: [...]                   # From Step 3 output (includes job_context per contact)
your_company: {
  description: string
  pain_point: string
  proof_points: string[]
  cost_comparison: string         # e.g. "4x cheaper than a full-time hire"
  deployment_speed: string        # e.g. "Live in 2 weeks vs. 3-month hiring cycle"
}
sequence_config: {
  touches: integer                # Default: 3
  timing: integer[]               # Default: [1, 5, 12]
  personalization_tier: 1 | 2 | 3
  tone: string
  cta: string
}

Process

  1. Select framework based on framing:

    • "Replace" framing → Signal-Proof-Ask (reference the job posting, show what your product does instead, soft ask)
    • "Complement" framing → BAB (before: your new hire struggles with X / after: with our tool they're 3x faster / bridge: here's how)
    • "Scale" framing → PAS (problem: you need 5 people for this / agitate: that's $500K/year in salary / solve: or 1 person + our product)
  2. Build three layers of personalization per contact:

    Layer Source Used In
    Job posting context Step 1 — the specific role, responsibilities, what the JD says Subject line + hook
    Your company context Config — what you do, proof points, cost comparison Body — proof + offer
    Prospect company context Step 2 — industry, what they do, why they're hiring Body — relevance framing
  3. Adapt email angle by role_type:

    Role Type Email Angle Example Hook
    Hiring manager "Before you fill that role" "I saw you're hiring a BDC Rep — before you finalize that, worth seeing what [product] does instead."
    Buyer Cost/ROI comparison "You're budgeting for 3 BDC reps ($180K/year). [Product] handles the same workload for a fraction of that."
    Champion "This will make your life easier" "When your new BDC rep starts, they'll need tools to be effective from day one. That's what [product] does."
    User "You'll want this on your desk" "If you're scaling the BDC function at [company], [product] handles [task] so you can focus on [higher-value work]."
  4. Follow email-drafting skill rules:

    • Touch 1: 50-90 words. Hook with job posting signal.
    • Touch 2: 30-50 words. Different proof point or cost/speed comparison.
    • Touch 3: 20-40 words. Social proof or breakup.
    • All hard rules apply.

Output Contract

email_sequences: [
  {
    contact: { full_name, email, title, role_type, company_name }
    job_context: { posting_title, signal_type }
    sequence: [
      {
        touch_number: integer
        send_day: integer
        subject: string
        body: string
        framework: string
        personalization_layers: {
          job_posting: string      # What from the JD was referenced
          company_context: string  # What proof/value was used
          prospect_context: string # What about their company was referenced
        }
        word_count: integer
      }
    ]
  }
]

Human Checkpoint

Present 3-5 sample sequences showing each role_type and framing:

## Sample Emails for Review

### Hiring Manager: Sarah Chen, VP Sales @ Acme Corp
Signal: Hiring 3x BDC Representatives | Framing: Replace

**Touch 1 — Day 1**
Subject: Before you fill those BDC roles
> Hi Sarah — I noticed Acme is hiring three BDC reps. Before you go through
> a 3-month hiring cycle, worth seeing what companies like [peer] are doing
> instead...
> [full email]

### Buyer: Mike Johnson, COO @ Acme Corp
Signal: Same | Framing: ROI

**Touch 1 — Day 1**
Subject: $180K/year in BDC hires — or this
> Hi Mike — Acme's hiring 3 BDC reps. At ~$60K each fully loaded, that's
> $180K/year. [Product] handles the same call volume for...
> [full 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. See that composite for the full handoff process.

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: Hiring signal
Contacts: X people 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 Configurable (LinkedIn Jobs, Indeed, web search) Review companies with postings 2-5 min
2. Qualify None (LLM reasoning) Approve tier rankings 2-3 min
3. Find People Configurable (Apollo, LinkedIn, etc.) Approve contact list 2-3 min
4. Draft Emails None (LLM reasoning) Review samples, iterate 5-10 min
5. Handoff Configurable (Smartlead, CSV, etc.) Final launch approval 1 min

Total human review time: ~15-20 minutes


Tips

  • "Replaces" signals are gold. If they're hiring for what your product does, you have the strongest possible outreach angle. Prioritize these.
  • Time the outreach to the posting age. Day 1-7: "Before you start interviewing." Day 7-14: "While you're evaluating candidates." Day 14+: "Before you extend an offer."
  • Don't say "you don't need to hire." Instead frame it as "your team gets this capability faster" or "complement your new hire with this." Less threatening to the hiring manager who already committed to the req.
  • Multiple postings for the same role = scaling signal. If they're hiring 3x BDC reps, the pain is 3x bigger and the cost comparison is 3x more compelling.
  • The hiring manager is your best first contact because they own the problem. But cc'ing or separately reaching the buyer (their boss) with an ROI angle creates a pincer effect.
1---
2name: hiring-signal-outreach
3version: 1.0.0
4description: >
5 End-to-end hiring signal composite. Takes any set of companies, detects job
6 postings that your product augments or replaces, finds relevant people
7 (the hiring manager, buyers, champions, users), and drafts personalized
8 outreach using the job role as the hook. Tool-agnostic — works with any
9 company source, job board, contact finder, and outreach platform.
10tags: [outreach]
11 
12graph:
13 provides:
14 - companies-with-hiring-signals # Companies posting roles your product augments/replaces
15 - contact-list # People at those companies to reach out to
16 - personalized-email-sequences # Outreach drafts using job posting as the hook
17 requires:
18 - company-list # Any list of companies (CSV, CRM, manual, Supabase)
19 - your-company-context # What you sell, what roles your product augments/replaces
20 connects_to:
21 - skill: cold-email-outreach
22 when: "User wants to launch the campaign via their outreach tool"
23 passes: contact-list, personalized-email-sequences
24 - skill: linkedin-outreach
25 when: "User wants LinkedIn outreach instead of or alongside email"
26 passes: contact-list
27 capabilities: [web-search, job-search, contact-finding, email-drafting]
28---
29 
30# Hiring Signal Outreach
31 
32Detects job postings at target companies where the role being hired for is one your product augments, replaces, or directly supports. Finds the right people to contact (not just the person being hired — the hiring manager, budget holder, and potential champions), then drafts personalized outreach using the job posting as the hook.
33 
34**Why hiring signals work:** When a company posts a job, they've already acknowledged the problem your product solves. They've budgeted for it (headcount is budget). They're actively evaluating how to solve it. Your email arrives at exactly the moment they're thinking about this problem — and you're offering a faster, cheaper, or complementary solution.
35 
36## When to Auto-Load
37 
38Load this composite when:
39- User says "check if any of these companies are hiring for roles we replace", "job posting signals", "hiring signal outreach"
40- User has a list of companies and wants to find those hiring for relevant roles
41- An upstream workflow (TAM Pulse, company monitoring) triggers a hiring signal check
42 
43---
44 
45## Step 0: Configuration (One-Time Setup)
46 
47On first run for a client/user, collect and store these preferences. Skip on subsequent runs.
48 
49### Role Mapping (Critical — This Defines What Signals Matter)
50 
51| Question | Purpose | Stored As |
52|----------|---------|-----------|
53| What does your product do? (1-2 sentences) | Match against job descriptions | `company_description` |
54| What job roles does your product **replace**? | Strongest signal — they're hiring for what you automate | `roles_replaced` |
55| What job roles does your product **augment**? | Good signal — your product makes this person more effective | `roles_augmented` |
56| What job roles **buy** your product? | Contact finding — who holds the budget | `buyer_titles` |
57| What job roles **champion** your product? | Contact finding — who feels the pain daily | `champion_titles` |
58| What job roles **use** your product? | Contact finding — who would operate it | `user_titles` |
59| What keywords in a job description indicate relevance? | Filters out false positives | `jd_keywords` |
60 
61**Example for an AI calling product:**
62```
63roles_replaced: ["BDC Representative", "Call Center Agent", "Appointment Setter"]
64roles_augmented: ["Sales Manager", "BDC Manager", "Service Advisor"]
65buyer_titles: ["VP Sales", "Director of Operations", "General Manager", "COO"]
66champion_titles: ["BDC Manager", "Sales Manager", "Fixed Ops Director"]
67user_titles: ["BDC Rep", "Service Advisor", "Sales Consultant"]
68jd_keywords: ["inbound calls", "outbound calls", "appointment setting", "customer follow-up"]
69```
70 
71### Signal Detection Config
72| Question | Options | Stored As |
73|----------|---------|-----------|
74| How should we find job postings? | LinkedIn Jobs / Indeed / Apollo / Google Jobs / Web search | `job_search_tool` |
75| How far back should we look? | 7 / 14 / 30 days | `lookback_days` |
76 
77### Contact Finding Config
78| Question | Options | Stored As |
79|----------|---------|-----------|
80| How should we find contacts at these companies? | Apollo / LinkedIn / Clearbit / Web search | `contact_tool` |
81 
82### Outreach Config
83| Question | Options | Stored As |
84|----------|---------|-----------|
85| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / Lemlist / CSV export | `outreach_tool` |
86| Email or multi-channel? | Email only / Email + LinkedIn | `outreach_channels` |
87 
88### Your Company Context
89| Question | Purpose | Stored As |
90|----------|---------|-----------|
91| What problem do you solve? | Email hook | `pain_point` |
92| Name 2-3 proof points (customers, metrics, results) | Email credibility | `proof_points` |
93| What's the cost comparison vs. a full-time hire? | ROI angle for outreach | `cost_comparison` |
94| How fast can you deploy vs. a new hire? | Speed angle | `deployment_speed` |
95 
96**Store config in:** `clients/<client-name>/config/signal-outreach.json` or equivalent.
97 
98---
99 
100## Step 1: Detect Hiring Signals
101 
102**Purpose:** For each company in the input list, find active job postings that match roles your product replaces or augments.
103 
104### Input Contract
105 
106```
107companies: [
108 {
109 name: string # Required
110 domain: string # Required
111 industry?: string # Optional
112 size?: string # Optional
113 }
114]
115roles_replaced: string[] # From config
116roles_augmented: string[] # From config
117jd_keywords: string[] # From config
118lookback_days: integer # From config (default: 14)
119```
120 
121### Process
122 
123For each company (or in batches):
124 
1251. **Search for job postings** using the configured `job_search_tool`:
126 - **LinkedIn Jobs:** Search `company_name + role_title` for each role in `roles_replaced` and `roles_augmented`
127 - **Indeed:** Same search pattern
128 - **Apollo:** Company enrichment → job postings
129 - **Google Jobs:** `site:linkedin.com/jobs OR site:indeed.com "{company}" "{role}"`
130 - **Web search:** `"{company_name}" AND ("hiring" OR "job" OR "careers") AND ("{role_1}" OR "{role_2}")`
131 
1322. **For each job posting found, extract:**
133 - Job title
134 - Location (remote/onsite/hybrid)
135 - Posted date
136 - Job description summary (key responsibilities)
137 - Source URL
138 
1393. **Classify each posting:**
140 - **Replaces:** The job title matches `roles_replaced`. Your product could eliminate or reduce the need for this hire. This is the strongest signal.
141 - **Augments:** The job title matches `roles_augmented`. Your product makes this person more effective — they'd want it as a tool. Good signal.
142 - **Keyword match:** Title doesn't match but the JD contains `jd_keywords`. Weaker signal — verify relevance.
143 
1444. **Filter:** Drop companies with no matching job postings. Drop postings older than `lookback_days`.
145 
146### Output Contract
147 
148```
149companies_hiring: [
150 {
151 company: {
152 name: string
153 domain: string
154 industry: string
155 }
156 job_postings: [
157 {
158 title: string
159 location: string
160 posted_date: string
161 description_summary: string # 2-3 sentence summary of the role
162 source_url: string
163 signal_type: "replaces" | "augments" | "keyword_match"
164 relevance_reasoning: string # Why this posting matters for your product
165 }
166 ]
167 posting_count: integer
168 strongest_signal: "replaces" | "augments" | "keyword_match"
169 }
170]
171```
172 
173### Human Checkpoint
174 
175```
176Found hiring signals at X of Y companies:
177 
178| Company | Postings | Strongest Signal | Top Role | Posted |
179|---------|----------|-----------------|----------|--------|
180| Acme Corp | 3 | Replaces | BDC Representative | 3 days ago |
181| Beta Inc | 1 | Augments | Sales Manager | 1 week ago |
182| ... | ... | ... | ... | ... |
183 
184Signal breakdown: X "replaces" (strongest), Y "augments", Z "keyword match"
185 
186Proceed with qualification? (Y/n)
187```
188 
189---
190 
191## Step 2: Qualify & Prioritize
192 
193**Purpose:** Rank companies by outreach priority based on signal strength, relevance, and timing. Pure LLM reasoning — inherently tool-agnostic.
194 
195### Input Contract
196 
197```
198companies_hiring: [...] # From Step 1 output
199your_company: {
200 description: string
201 pain_point: string
202 proof_points: string[]
203 cost_comparison: string
204 deployment_speed: string
205}
206```
207 
208### Process
209 
210For each company, evaluate:
211 
212| Criterion | Weight | How to Assess |
213|-----------|--------|---------------|
214| **Signal type** | Highest | "Replaces" > "Augments" > "Keyword match" |
215| **Posting volume** | High | Multiple relevant postings = scaling that function = bigger need |
216| **Recency** | High | Posted <7 days ago = actively evaluating. 14+ days = may have candidates already |
217| **Role seniority** | Medium | Hiring a VP of the function you sell into = strategic buy. Hiring an individual contributor = operational buy. Both are good, different approach. |
218| **Industry fit** | Medium | Is their industry one where your product has proven results? |
219 
220### Scoring
221 
222- **Tier 1 (Act Today):** "Replaces" signal + posted within 7 days. They're literally budgeting for what you sell.
223- **Tier 2 (Act This Week):** "Replaces" signal 7-14 days old, OR "Augments" signal <7 days with multiple postings.
224- **Tier 3 (Queue):** "Augments" or "keyword match" signals. Worth reaching out but lower urgency.
225- **Drop:** Keyword match only with weak relevance after reviewing the JD.
226 
227For each qualified company, generate:
228- **Relevance reasoning:** Why this hiring pattern matters for your product
229- **Outreach angle:** The specific connection between their job posting and your product
230 - "Replaces" → "Before you fill that role, consider what [product] does instead"
231 - "Augments" → "Your new [role] will need tools like [product] to hit the ground running"
232- **Recommended framing:** Replace (you don't need to hire for this), Complement (your new hire will be 3x more effective with this), or Scale (you need 5 of these people — or 1 person + our product)
233 
234### Output Contract
235 
236```
237qualified_companies: [
238 {
239 ...company_hiring_fields,
240 priority_tier: "tier_1" | "tier_2" | "tier_3"
241 relevance_reasoning: string
242 outreach_angle: string
243 recommended_framing: "replace" | "complement" | "scale"
244 }
245]
246dropped_companies: [
247 { name: string, drop_reason: string }
248]
249```
250 
251### Human Checkpoint
252 
253```
254## Qualification Results
255 
256### Tier 1 — Act Today (X companies)
257| Company | Signal | Top Role | Framing | Angle |
258|---------|--------|----------|---------|-------|
259| Acme Corp | Replaces | BDC Rep (x3) | Replace | Before you hire 3 BDC reps... |
260 
261### Tier 2 — Act This Week (X companies)
262| ... |
263 
264### Tier 3 — Queue (X companies)
265| ... |
266 
267### Dropped (X companies)
268| Company | Reason |
269|---------|--------|
270| ... | ... |
271 
272Approve this list before we find contacts?
273```
274 
275---
276 
277## Step 3: Find Relevant People
278 
279**Purpose:** For each qualified company, find the right people to contact. Unlike the funding composite, here we also identify who posted the job (the hiring manager) — they're often the best first contact.
280 
281### Input Contract
282 
283```
284qualified_companies: [...] # From Step 2 output
285buyer_titles: string[] # From config
286champion_titles: string[] # From config
287user_titles: string[] # From config
288max_contacts_per_company: integer # Default: 3-5
289```
290 
291### Process
292 
293For each qualified company, use the configured `contact_tool`:
294 
2951. **First: Identify the hiring manager.** The person who posted or owns the job posting is the most relevant contact.
296 - Check the job posting source for the hiring manager's name
297 - If not listed, search for people at the company with titles one level above the posted role
298 - The hiring manager is often the strongest contact because they own the problem your product solves
299 
3002. **Second: Find buyer-level contacts.** People with `buyer_titles` at this company — they control budget.
301 
3023. **Third: Find champions.** People with `champion_titles` — they feel the pain daily and can advocate internally.
303 
3044. **Classify each contact:**
305 - **Hiring manager** — Posted the role. Directly owns the problem. Best for "replace" framing.
306 - **Buyer** — Controls budget. Best for ROI/cost-comparison framing.
307 - **Champion** — Lives the pain. Best for "complement" or "make your life easier" framing.
308 - **User** — Would operate the product. Best for bottom-up adoption.
309 
3105. **Cap at `max_contacts_per_company`.** Prioritize: hiring manager > buyer > champion > user.
311 
312### Output Contract
313 
314```
315contacts: [
316 {
317 person: {
318 full_name: string
319 first_name: string
320 last_name: string
321 title: string
322 email: string | null
323 linkedin_url: string | null
324 role_type: "hiring_manager" | "buyer" | "champion" | "user"
325 }
326 company: {
327 name: string
328 domain: string
329 priority_tier: string
330 outreach_angle: string
331 recommended_framing: string
332 }
333 job_context: {
334 relevant_posting_title: string # The job posting that triggered this signal
335 signal_type: string # "replaces" or "augments"
336 posting_url: string
337 description_summary: string
338 }
339 }
340]
341```
342 
343### Human Checkpoint
344 
345```
346## Contacts Found
347 
348### Acme Corp (Tier 1 — Hiring 3x BDC Reps, "Replace" framing)
349| Name | Title | Role Type | Email | LinkedIn |
350|------|-------|-----------|-------|----------|
351| Sarah Chen | VP Sales | Hiring Manager | [email protected] | ... |
352| Mike Johnson | COO | Buyer | [email protected] | ... |
353| Lisa Park | BDC Manager | Champion | [email protected] | ... |
354 
355Relevant posting: "BDC Representative" (posted 3 days ago)
356 
357### Beta Inc (Tier 2 — Hiring Sales Manager, "Complement" framing)
358| ... |
359 
360Total: X contacts across Y companies
361 
362Approve before we draft emails?
363```
364 
365---
366 
367## Step 4: Draft Personalized Emails
368 
369**Purpose:** For each contact, draft a personalized email sequence using three layers of personalization: the job posting context, your company's value, and the prospect's company context. Pure LLM reasoning — inherently tool-agnostic.
370 
371### Input Contract
372 
373```
374contacts: [...] # From Step 3 output (includes job_context per contact)
375your_company: {
376 description: string
377 pain_point: string
378 proof_points: string[]
379 cost_comparison: string # e.g. "4x cheaper than a full-time hire"
380 deployment_speed: string # e.g. "Live in 2 weeks vs. 3-month hiring cycle"
381}
382sequence_config: {
383 touches: integer # Default: 3
384 timing: integer[] # Default: [1, 5, 12]
385 personalization_tier: 1 | 2 | 3
386 tone: string
387 cta: string
388}
389```
390 
391### Process
392 
3931. **Select framework based on framing:**
394 - "Replace" framing → **Signal-Proof-Ask** (reference the job posting, show what your product does instead, soft ask)
395 - "Complement" framing → **BAB** (before: your new hire struggles with X / after: with our tool they're 3x faster / bridge: here's how)
396 - "Scale" framing → **PAS** (problem: you need 5 people for this / agitate: that's $500K/year in salary / solve: or 1 person + our product)
397 
3982. **Build three layers of personalization per contact:**
399 
400 | Layer | Source | Used In |
401 |-------|--------|---------|
402 | **Job posting context** | Step 1 — the specific role, responsibilities, what the JD says | Subject line + hook |
403 | **Your company context** | Config — what you do, proof points, cost comparison | Body — proof + offer |
404 | **Prospect company context** | Step 2 — industry, what they do, why they're hiring | Body — relevance framing |
405 
4063. **Adapt email angle by `role_type`:**
407 
408 | Role Type | Email Angle | Example Hook |
409 |-----------|-------------|--------------|
410 | **Hiring manager** | "Before you fill that role" | "I saw you're hiring a BDC Rep — before you finalize that, worth seeing what [product] does instead." |
411 | **Buyer** | Cost/ROI comparison | "You're budgeting for 3 BDC reps ($180K/year). [Product] handles the same workload for a fraction of that." |
412 | **Champion** | "This will make your life easier" | "When your new BDC rep starts, they'll need tools to be effective from day one. That's what [product] does." |
413 | **User** | "You'll want this on your desk" | "If you're scaling the BDC function at [company], [product] handles [task] so you can focus on [higher-value work]." |
414 
4154. **Follow `email-drafting` skill rules:**
416 - Touch 1: 50-90 words. Hook with job posting signal.
417 - Touch 2: 30-50 words. Different proof point or cost/speed comparison.
418 - Touch 3: 20-40 words. Social proof or breakup.
419 - All hard rules apply.
420 
421### Output Contract
422 
423```
424email_sequences: [
425 {
426 contact: { full_name, email, title, role_type, company_name }
427 job_context: { posting_title, signal_type }
428 sequence: [
429 {
430 touch_number: integer
431 send_day: integer
432 subject: string
433 body: string
434 framework: string
435 personalization_layers: {
436 job_posting: string # What from the JD was referenced
437 company_context: string # What proof/value was used
438 prospect_context: string # What about their company was referenced
439 }
440 word_count: integer
441 }
442 ]
443 }
444]
445```
446 
447### Human Checkpoint
448 
449Present 3-5 sample sequences showing each role_type and framing:
450 
451```
452## Sample Emails for Review
453 
454### Hiring Manager: Sarah Chen, VP Sales @ Acme Corp
455Signal: Hiring 3x BDC Representatives | Framing: Replace
456 
457**Touch 1 — Day 1**
458Subject: Before you fill those BDC roles
459> Hi Sarah — I noticed Acme is hiring three BDC reps. Before you go through
460> a 3-month hiring cycle, worth seeing what companies like [peer] are doing
461> instead...
462> [full email]
463 
464### Buyer: Mike Johnson, COO @ Acme Corp
465Signal: Same | Framing: ROI
466 
467**Touch 1 — Day 1**
468Subject: $180K/year in BDC hires — or this
469> Hi Mike — Acme's hiring 3 BDC reps. At ~$60K each fully loaded, that's
470> $180K/year. [Product] handles the same call volume for...
471> [full email]
472 
473---
474 
475Approve these samples? I'll generate the rest in the same style.
476```
477 
478---
479 
480## Step 5: Handoff to Outreach
481 
482Identical to `funding-signal-outreach` Step 5. Package contacts + email sequences for the configured outreach tool. See that composite for the full handoff process.
483 
484### Output Contract
485 
486```
487campaign_package: {
488 tool: string
489 file_path: string
490 contact_count: integer
491 sequence_touches: integer
492 estimated_send_days: integer
493 next_action: string
494}
495```
496 
497### Human Checkpoint
498 
499```
500## Campaign Ready
501 
502Tool: [configured tool]
503Signal type: Hiring signal
504Contacts: X people across Y companies
505Sequence: 3 touches over 12 days
506 
507Ready to launch?
508```
509 
510---
511 
512## Execution Summary
513 
514| Step | Tool Dependency | Human Checkpoint | Typical Time |
515|------|----------------|-----------------|--------------|
516| 0. Config | None | First run only | 5 min (once) |
517| 1. Detect | Configurable (LinkedIn Jobs, Indeed, web search) | Review companies with postings | 2-5 min |
518| 2. Qualify | None (LLM reasoning) | Approve tier rankings | 2-3 min |
519| 3. Find People | Configurable (Apollo, LinkedIn, etc.) | Approve contact list | 2-3 min |
520| 4. Draft Emails | None (LLM reasoning) | Review samples, iterate | 5-10 min |
521| 5. Handoff | Configurable (Smartlead, CSV, etc.) | Final launch approval | 1 min |
522 
523**Total human review time: ~15-20 minutes**
524 
525---
526 
527## Tips
528 
529- **"Replaces" signals are gold.** If they're hiring for what your product does, you have the strongest possible outreach angle. Prioritize these.
530- **Time the outreach to the posting age.** Day 1-7: "Before you start interviewing." Day 7-14: "While you're evaluating candidates." Day 14+: "Before you extend an offer."
531- **Don't say "you don't need to hire."** Instead frame it as "your team gets this capability faster" or "complement your new hire with this." Less threatening to the hiring manager who already committed to the req.
532- **Multiple postings for the same role = scaling signal.** If they're hiring 3x BDC reps, the pain is 3x bigger and the cost comparison is 3x more compelling.
533- **The hiring manager is your best first contact** because they own the problem. But cc'ing or separately reaching the buyer (their boss) with an ROI angle creates a pincer effect.
534 

Discussion

Alternatives

Also in Hiring