Inbound lead enrichment

Fills in missing data for inbound leads — researches the company, identifies the person's role and seniority, finds other stakeholders at the company, checks for existing CRM relationships, and updates the lead record.

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/lead-generation/composites/inbound-lead-enrichment#main ~/.claude/skills/inbound-lead-enrichment

For one project only, change the path to .claude/skills/inbound-lead-enrichment.

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 text500 lines
inbound-lead-enrichment/SKILL.md500 lines18.0 KBpushed 96d agoRawView on GitHub

Inbound Lead Enrichment

Takes inbound leads with incomplete data and fills in the gaps. Researches the company, identifies the person's role, finds other stakeholders at the company, and checks for existing relationships in CRM. Turns a bare email address into a full lead profile.

When to Auto-Load

Load this composite when:

  • User says "enrich these leads", "fill in the missing data", "research these inbound leads"
  • inbound-lead-qualification flags leads as insufficient_data
  • inbound-lead-triage detects leads with missing company/title fields
  • User has a list of emails or partial lead data and needs complete profiles

Architecture

[Raw Leads] → Step 1: Assess Gaps → Step 2: Company Research → Step 3: Person Research → Step 4: Stakeholder Discovery → Step 5: Relationship Check → Step 6: Compile & Output
                   ↓                      ↓                         ↓                          ↓                             ↓                          ↓
            Gap inventory        Company profiles         Person profiles            Buying committee          CRM/pipeline matches       Enriched lead records

Step 0: Configuration (Once Per Client)

On first run, establish enrichment tool preferences.

{
  "enrichment_tools": {
    "company_research": {
      "primary": "SixtyFour | Orthogonal | web-search",
      "secondary": "web-search"
    },
    "person_research": {
      "primary": "SixtyFour | Orthogonal | web-search",
      "secondary": "web-search"
    },
    "stakeholder_finding": {
      "primary": "SixtyFour | Orthogonal | web-search",
      "secondary": "web-search"
    }
  },
  "crm_source": {
    "tool": "HubSpot | Salesforce | CSV | none",
    "access_method": ""
  },
  "buyer_personas": [],
  "enrichment_depth": {
    "tier_1_leads": "deep",
    "tier_2_leads": "deep",
    "tier_3_leads": "standard",
    "tier_4_leads": "minimal",
    "untiered_leads": "standard"
  }
}

On subsequent runs: Load config silently.


Step 1: Assess Data Gaps

Process

For each lead, inventory what's known vs. unknown:

Required fields (must fill):

  • company_name — What company do they work for?
  • company_domain — Company website domain
  • person_name — Full name
  • person_title — Current job title
  • person_email — Contact email (usually already have this from inbound)

Valuable fields (fill if possible):

  • company_size — Employee count or range
  • company_industry — Industry classification
  • company_stage — Funding stage or maturity
  • company_hq — Headquarters location
  • company_description — One sentence about what they do
  • person_seniority — IC, Manager, Director, VP, C-Level, Founder
  • person_department — Engineering, Sales, Marketing, etc.
  • person_linkedin — LinkedIn profile URL
  • person_tenure — How long at current company

Bonus fields (nice to have):

  • company_tech_stack — Known technologies used
  • company_recent_news — Any recent events (funding, launches, hires)
  • person_background — Previous companies, education
  • person_social_activity — Recent posts or engagement topics

Gap Classification

For each lead, classify the enrichment effort needed:

Gap Level Missing Enrichment Needed Cost
Minimal 1-2 valuable fields Quick web search Free
Standard Company or title missing Web search + possible API lookup Low
Deep Multiple required fields missing Multi-source research Medium
Email-only Only have an email address Full research from scratch High

Output

  • Gap inventory table showing each lead and what's missing
  • Recommended enrichment depth per lead (based on gap level AND urgency tier if available)
  • Cost estimate if paid tools will be used

Human Checkpoint

"Here's what's missing across your leads. [X] need deep enrichment, [Y] need standard, [Z] just need a quick lookup. Estimated cost: [amount]. Proceed?"


Step 2: Company Research

Process

For each unique company in the lead list (deduplicate — don't research the same company twice for multiple leads):

From email domain (if company name is missing):

  1. Extract domain from email (e.g., [email protected]acme.com)
  2. Skip personal email domains (gmail, yahoo, hotmail, outlook, etc.)
  3. Look up the domain → company name, description

Company profile research:

Field Primary Source Fallback Source
Company name Domain lookup Web search
Description Company website (homepage, about page) LinkedIn company page, web search
Employee count SixtyFour or Orthogonal, LinkedIn company page Web search
Industry LinkedIn company page, SixtyFour or Orthogonal Infer from website content
Stage/Funding SixtyFour or Orthogonal, news articles Web search
HQ Location LinkedIn company page, website Web search
Tech stack Job postings, BuiltWith Web search
Recent news Web search (last 90 days) Twitter/social mentions

Research depth by config:

  • Deep: All fields, multiple sources, verify across sources
  • Standard: Required + valuable fields, primary source only
  • Minimal: Company name + description + size only

Output

Each company gets a company_profile block:

{
  "company_name": "",
  "company_domain": "",
  "company_description": "",
  "employee_count": "",
  "employee_range": "",
  "industry": "",
  "sub_industry": "",
  "stage": "",
  "last_funding": "",
  "hq_location": "",
  "tech_stack": [],
  "recent_news": [],
  "research_sources": [],
  "confidence": "high | medium | low"
}

Handling Personal Email Domains

If the lead used a personal email (gmail, etc.):

  1. Check if name + any other available data can identify the company (e.g., form field, chat message)
  2. If company is mentioned in their form submission or chat, use that
  3. If truly unknown, flag as company_unidentified — still proceed with person research if name is available

Step 3: Person Research

Process

For each lead, build a person profile:

From name + company (if title is missing):

  1. Search LinkedIn for person at company (via configured tool or web search)
  2. Cross-reference with SixtyFour or Orthogonal
  3. If multiple matches, use email domain to disambiguate

Person profile research:

Field Primary Source Fallback Source
Full name Input data LinkedIn profile
Current title LinkedIn profile, SixtyFour or Orthogonal Web search
Seniority level Infer from title LinkedIn profile
Department Infer from title LinkedIn profile
Tenure at company LinkedIn profile Web search
Previous companies LinkedIn profile Web search
Education LinkedIn profile Skip
LinkedIn URL SixtyFour or Orthogonal, web search Skip
LinkedIn headline LinkedIn profile Skip
Recent activity LinkedIn posts (if scraper configured) Skip

Seniority inference rules:

  • Titles containing: Intern, Associate, Coordinator, Specialist → IC_junior
  • Titles containing: Analyst, Engineer, Designer, Developer (no "Senior/Lead/Staff") → IC_mid
  • Titles containing: Senior, Lead, Staff, Principal → IC_senior
  • Titles containing: Manager, Team Lead → Manager
  • Titles containing: Director, Head of → Director
  • Titles containing: VP, Vice President, SVP, EVP → VP
  • Titles containing: Chief, C-level abbreviations (CTO, CMO, CRO, CFO), President → C_Level
  • Titles containing: Founder, Co-founder, Owner → Founder

Adjust for company size:

  • At companies <20 employees: inflate seniority one level (a "Manager" has Director-level scope)
  • At companies >5000 employees: deflate seniority one level (a "Director" may have Manager-level autonomy)

Output

Each lead gets a person_profile block:

{
  "full_name": "",
  "current_title": "",
  "seniority_level": "",
  "department": "",
  "tenure_months": null,
  "previous_companies": [],
  "education": "",
  "linkedin_url": "",
  "linkedin_headline": "",
  "recent_activity_summary": "",
  "research_sources": [],
  "confidence": "high | medium | low"
}

Step 4: Stakeholder Discovery

Process

For each company in the lead list, identify other relevant people — the buying committee.

Why this matters:

  • Inbound leads are rarely the sole decision-maker
  • Finding the rest of the buying committee early accelerates the deal
  • Multi-threading (engaging multiple people at a company) dramatically improves win rates

Who to find (based on buyer personas from config):

  1. Economic buyer — Person who signs the check. Usually VP+ or C-level in the relevant department.
  2. Champion — Person most likely to push for adoption internally. Usually a senior IC or Director who feels the pain.
  3. Technical evaluator — Person who will assess the product's technical fit. Usually engineering or ops.
  4. End user — Person who will use the product daily. Their buy-in prevents post-sale churn.

Process per company:

  1. Using the buyer personas, determine which roles to search for
  2. Search via configured tool (SixtyFour or Orthogonal, LinkedIn, company-contact-finder)
  3. For each stakeholder found, capture: name, title, seniority, LinkedIn URL, email (if available)
  4. Note the relationship to the inbound lead: same team? Same department? Different function?

Depth control:

  • Deep enrichment (Tier 1-2 leads): Find all 4 stakeholder types. Research each.
  • Standard enrichment (Tier 3 leads): Find economic buyer + champion only.
  • Minimal enrichment (Tier 4 / untiered): Skip stakeholder discovery.

Output

Each company gets a stakeholder_map:

{
  "company": "",
  "inbound_lead": {
    "name": "",
    "title": "",
    "role_in_deal": "economic_buyer | champion | evaluator | user | unknown"
  },
  "stakeholders_found": [
    {
      "name": "",
      "title": "",
      "seniority": "",
      "linkedin_url": "",
      "email": "",
      "role_in_deal": "",
      "relationship_to_lead": "",
      "confidence": "high | medium | low"
    }
  ],
  "buying_committee_completeness": "full | partial | minimal",
  "recommended_multi_thread": ""
}

Stakeholder Prioritization

If the inbound lead IS the economic buyer → stakeholders are supporting context If the inbound lead is a user/evaluator → finding the economic buyer is critical If the inbound lead is unknown → identifying their role determines the multi-threading strategy


Step 5: Relationship Check

Process

For each lead AND each discovered stakeholder, check existing systems for prior relationships:

Check 1 — CRM (HubSpot, Salesforce, CSV):

  • Does this person already exist in our system?
  • If yes: what's their current status? (active lead, contacted, nurture, customer, churned)
  • If yes: who owns the relationship?

Check 2 — Outreach history (outreach_log):

  • Have we emailed/messaged this person before?
  • If yes: when, what channel, what was the outcome?
  • Critical: prevent the "we cold-emailed you last week and you ignored us, now you came inbound" collision

Check 3 — Company-level pipeline (companies table or CRM):

  • Is there an active deal with this company?
  • If yes: at what stage? Who's the deal owner?
  • An inbound lead at a company with an active deal is a HUGE signal — flag it prominently

Check 4 — Signal history (signals table):

  • Has this company appeared in any signal scans?
  • If yes: which signals? Were they acted on?

Check 5 — Mutual connections (if data available):

  • Does anyone on our team know someone at this company?
  • If yes: note the warm intro path

Output

Each lead gets a relationship_context block:

{
  "person_in_crm": true/false,
  "person_crm_status": "",
  "person_outreach_history": [
    {
      "date": "",
      "channel": "",
      "campaign": "",
      "outcome": ""
    }
  ],
  "company_in_pipeline": true/false,
  "company_deal_stage": "",
  "company_deal_owner": "",
  "company_signal_history": [],
  "mutual_connections": [],
  "relationship_summary": ""
}

Step 6: Compile & Output

Enriched Lead Record

Merge all research into a single enriched record per lead:

{
  "original_data": {},
  "company_profile": {},
  "person_profile": {},
  "stakeholder_map": {},
  "relationship_context": {},
  "enrichment_metadata": {
    "enrichment_depth": "deep | standard | minimal",
    "fields_filled": X,
    "fields_still_missing": [],
    "sources_used": [],
    "confidence_overall": "high | medium | low",
    "enrichment_date": "",
    "cost_incurred": ""
  }
}

Output Formats

Primary: Enriched CSV

Produce a CSV that extends the original lead data with all enriched fields:

Original Fields + Company Fields + Person Fields + Stakeholder Fields + Relationship Fields + Metadata
All input columns company_description, employee_count, industry, stage, hq, tech_stack, recent_news current_title, seniority, department, tenure, linkedin_url, headline stakeholder_1_name, stakeholder_1_title, stakeholder_1_role, ... (up to 4) in_crm, crm_status, in_pipeline, deal_stage, outreach_history_summary enrichment_depth, confidence, fields_missing, sources_used

Save to the current working directory or wherever the user prefers (e.g., leads/inbound-enriched-[date].csv).

Secondary: Enrichment Report

## Lead Enrichment Report: [Date]

### Summary
- **Total leads enriched:** X
- **Deep enrichment:** X leads (Tier 1-2)
- **Standard enrichment:** X leads (Tier 3)
- **Minimal enrichment:** X leads (Tier 4)

### Data Quality
- **Fully enriched** (all required + valuable fields): X leads
- **Mostly enriched** (all required, some valuable): X leads
- **Partially enriched** (some required fields still missing): X leads
- **Could not enrich** (insufficient starting data): X leads

### Company Research
- **Unique companies researched:** X
- **Companies already in CRM:** X
- **Companies with active deals:** X (flag for deal owner)
- **Companies with signal history:** X

### Stakeholder Discovery
- **Total stakeholders found:** X across Y companies
- **Economic buyers identified:** X
- **Champions identified:** X
- **Full buying committees mapped:** X companies

### Relationship Flags
- **Leads already in CRM:** X (update status, don't create duplicates)
- **Previously contacted leads:** X (check outreach history before re-engaging)
- **Companies with active deals:** X (coordinate with deal owner)
- **Warm intro paths found:** X

### Cost
- **Enrichment tool credits used:** [breakdown by tool]
- **Cost per lead:** [average]

### CSV saved to: [path]

Handling Edge Cases

Lead with only an email, nothing else:

  1. Extract domain → look up company
  2. Search "[name] [company]" on LinkedIn/web
  3. If still can't identify: flag as enrichment_failed with reason, recommend manual lookup
  4. Don't waste paid API credits on truly unidentifiable leads — web search first

Same company appears multiple times (multiple inbound leads):

  • Research the company ONCE, apply to all leads
  • Stakeholder discovery runs once per company, not per lead
  • Note the multi-lead signal: "3 people from [Company] came inbound — buying committee forming?"

Lead claims a title that doesn't match LinkedIn:

  • Trust LinkedIn over self-reported form data (people sometimes inflate titles on forms)
  • Note the discrepancy: "Form says 'VP of Engineering', LinkedIn says 'Senior Engineer'"
  • Use the LinkedIn title for qualification purposes

Company recently renamed, merged, or was acquired:

  • If the company domain redirects, follow the redirect
  • Note the corporate action: "[Company] was acquired by [Parent] in [date]"
  • Qualify against the current entity, not the historical one

Person left the company since filling the form:

  • If LinkedIn shows a different company than the form submission, flag it
  • Note: "Lead submitted via [Company] but now at [New Company] as of [date]"
  • Qualify both companies if both are potentially relevant

Enrichment tool rate limits or failures:

  • If primary tool fails, fall back to secondary (web search is always available)
  • If both fail for a specific lead, mark as enrichment_partial and move on
  • Never block the entire batch because one lead failed

Very high volume (100+ leads):

  • Batch company research first (deduplicate companies)
  • Parallelize person research via Task agents (15-20 leads per batch)
  • Skip stakeholder discovery for Tier 4 and untiered leads
  • Provide cost estimate before running paid enrichment tools

Personal email domains:

  • If form had a company field: use it even though email is personal
  • If no company info: attempt LinkedIn search by name
  • Last resort: flag as company_unidentified, enrich person only

Update Protocol

After enrichment is complete, update the source systems:

  1. If CRM is configured: Create/update lead records with enriched data. Don't overwrite existing data — append or fill gaps only.
  2. Flag duplicates: If enrichment reveals a lead already exists in CRM under a different email, flag the duplicate rather than creating a second record.

Tools Required

  • Web search — primary fallback for all research
  • SixtyFour or Orthogonal — company + person lookup (optional, enhances depth)
  • LinkedIn scraper (Apify) — person profile enrichment (optional)
  • Company-contact-finder — stakeholder discovery
  • CRM access — relationship checks (HubSpot, Salesforce, CSV)
  • Read/Write — CSV I/O and config management
  • Task tool — for parallelizing enrichment across large lead batches
1---
2name: inbound-lead-enrichment
3version: 1.0.0
4description: >
5 Fills in missing data for inbound leads — researches the company, identifies the person's
6 role and seniority, finds other stakeholders at the company, checks for existing CRM
7 relationships, and updates the lead record. Produces enriched lead data ready for
8 qualification or outreach. Tool-agnostic.
9tags: [lead-generation]
10---
11 
12# Inbound Lead Enrichment
13 
14Takes inbound leads with incomplete data and fills in the gaps. Researches the company, identifies the person's role, finds other stakeholders at the company, and checks for existing relationships in CRM. Turns a bare email address into a full lead profile.
15 
16## When to Auto-Load
17 
18Load this composite when:
19- User says "enrich these leads", "fill in the missing data", "research these inbound leads"
20- `inbound-lead-qualification` flags leads as `insufficient_data`
21- `inbound-lead-triage` detects leads with missing company/title fields
22- User has a list of emails or partial lead data and needs complete profiles
23 
24## Architecture
25 
26```
27[Raw Leads] → Step 1: Assess Gaps → Step 2: Company Research → Step 3: Person Research → Step 4: Stakeholder Discovery → Step 5: Relationship Check → Step 6: Compile & Output
28 ↓ ↓ ↓ ↓ ↓ ↓
29 Gap inventory Company profiles Person profiles Buying committee CRM/pipeline matches Enriched lead records
30```
31 
32---
33 
34## Step 0: Configuration (Once Per Client)
35 
36On first run, establish enrichment tool preferences.
37 
38```json
39{
40 "enrichment_tools": {
41 "company_research": {
42 "primary": "SixtyFour | Orthogonal | web-search",
43 "secondary": "web-search"
44 },
45 "person_research": {
46 "primary": "SixtyFour | Orthogonal | web-search",
47 "secondary": "web-search"
48 },
49 "stakeholder_finding": {
50 "primary": "SixtyFour | Orthogonal | web-search",
51 "secondary": "web-search"
52 }
53 },
54 "crm_source": {
55 "tool": "HubSpot | Salesforce | CSV | none",
56 "access_method": ""
57 },
58 "buyer_personas": [],
59 "enrichment_depth": {
60 "tier_1_leads": "deep",
61 "tier_2_leads": "deep",
62 "tier_3_leads": "standard",
63 "tier_4_leads": "minimal",
64 "untiered_leads": "standard"
65 }
66}
67```
68 
69**On subsequent runs:** Load config silently.
70 
71---
72 
73## Step 1: Assess Data Gaps
74 
75### Process
76For each lead, inventory what's known vs. unknown:
77 
78**Required fields (must fill):**
79- `company_name` — What company do they work for?
80- `company_domain` — Company website domain
81- `person_name` — Full name
82- `person_title` — Current job title
83- `person_email` — Contact email (usually already have this from inbound)
84 
85**Valuable fields (fill if possible):**
86- `company_size` — Employee count or range
87- `company_industry` — Industry classification
88- `company_stage` — Funding stage or maturity
89- `company_hq` — Headquarters location
90- `company_description` — One sentence about what they do
91- `person_seniority` — IC, Manager, Director, VP, C-Level, Founder
92- `person_department` — Engineering, Sales, Marketing, etc.
93- `person_linkedin` — LinkedIn profile URL
94- `person_tenure` — How long at current company
95 
96**Bonus fields (nice to have):**
97- `company_tech_stack` — Known technologies used
98- `company_recent_news` — Any recent events (funding, launches, hires)
99- `person_background` — Previous companies, education
100- `person_social_activity` — Recent posts or engagement topics
101 
102### Gap Classification
103 
104For each lead, classify the enrichment effort needed:
105 
106| Gap Level | Missing | Enrichment Needed | Cost |
107|-----------|---------|-------------------|------|
108| **Minimal** | 1-2 valuable fields | Quick web search | Free |
109| **Standard** | Company or title missing | Web search + possible API lookup | Low |
110| **Deep** | Multiple required fields missing | Multi-source research | Medium |
111| **Email-only** | Only have an email address | Full research from scratch | High |
112 
113### Output
114- Gap inventory table showing each lead and what's missing
115- Recommended enrichment depth per lead (based on gap level AND urgency tier if available)
116- Cost estimate if paid tools will be used
117 
118### Human Checkpoint
119"Here's what's missing across your leads. [X] need deep enrichment, [Y] need standard, [Z] just need a quick lookup. Estimated cost: [amount]. Proceed?"
120 
121---
122 
123## Step 2: Company Research
124 
125### Process
126For each unique company in the lead list (deduplicate — don't research the same company twice for multiple leads):
127 
128**From email domain (if company name is missing):**
1291. Extract domain from email (e.g., `[email protected]``acme.com`)
1302. Skip personal email domains (gmail, yahoo, hotmail, outlook, etc.)
1313. Look up the domain → company name, description
132 
133**Company profile research:**
134 
135| Field | Primary Source | Fallback Source |
136|-------|---------------|-----------------|
137| Company name | Domain lookup | Web search |
138| Description | Company website (homepage, about page) | LinkedIn company page, web search |
139| Employee count | SixtyFour or Orthogonal, LinkedIn company page | Web search |
140| Industry | LinkedIn company page, SixtyFour or Orthogonal | Infer from website content |
141| Stage/Funding | SixtyFour or Orthogonal, news articles | Web search |
142| HQ Location | LinkedIn company page, website | Web search |
143| Tech stack | Job postings, BuiltWith | Web search |
144| Recent news | Web search (last 90 days) | Twitter/social mentions |
145 
146**Research depth by config:**
147- **Deep:** All fields, multiple sources, verify across sources
148- **Standard:** Required + valuable fields, primary source only
149- **Minimal:** Company name + description + size only
150 
151### Output
152Each company gets a `company_profile` block:
153```
154{
155 "company_name": "",
156 "company_domain": "",
157 "company_description": "",
158 "employee_count": "",
159 "employee_range": "",
160 "industry": "",
161 "sub_industry": "",
162 "stage": "",
163 "last_funding": "",
164 "hq_location": "",
165 "tech_stack": [],
166 "recent_news": [],
167 "research_sources": [],
168 "confidence": "high | medium | low"
169}
170```
171 
172### Handling Personal Email Domains
173If the lead used a personal email (gmail, etc.):
1741. Check if name + any other available data can identify the company (e.g., form field, chat message)
1752. If company is mentioned in their form submission or chat, use that
1763. If truly unknown, flag as `company_unidentified` — still proceed with person research if name is available
177 
178---
179 
180## Step 3: Person Research
181 
182### Process
183For each lead, build a person profile:
184 
185**From name + company (if title is missing):**
1861. Search LinkedIn for person at company (via configured tool or web search)
1872. Cross-reference with SixtyFour or Orthogonal
1883. If multiple matches, use email domain to disambiguate
189 
190**Person profile research:**
191 
192| Field | Primary Source | Fallback Source |
193|-------|---------------|-----------------|
194| Full name | Input data | LinkedIn profile |
195| Current title | LinkedIn profile, SixtyFour or Orthogonal | Web search |
196| Seniority level | Infer from title | LinkedIn profile |
197| Department | Infer from title | LinkedIn profile |
198| Tenure at company | LinkedIn profile | Web search |
199| Previous companies | LinkedIn profile | Web search |
200| Education | LinkedIn profile | Skip |
201| LinkedIn URL | SixtyFour or Orthogonal, web search | Skip |
202| LinkedIn headline | LinkedIn profile | Skip |
203| Recent activity | LinkedIn posts (if scraper configured) | Skip |
204 
205**Seniority inference rules:**
206- Titles containing: Intern, Associate, Coordinator, Specialist → `IC_junior`
207- Titles containing: Analyst, Engineer, Designer, Developer (no "Senior/Lead/Staff") → `IC_mid`
208- Titles containing: Senior, Lead, Staff, Principal → `IC_senior`
209- Titles containing: Manager, Team Lead → `Manager`
210- Titles containing: Director, Head of → `Director`
211- Titles containing: VP, Vice President, SVP, EVP → `VP`
212- Titles containing: Chief, C-level abbreviations (CTO, CMO, CRO, CFO), President → `C_Level`
213- Titles containing: Founder, Co-founder, Owner → `Founder`
214 
215**Adjust for company size:**
216- At companies <20 employees: inflate seniority one level (a "Manager" has Director-level scope)
217- At companies >5000 employees: deflate seniority one level (a "Director" may have Manager-level autonomy)
218 
219### Output
220Each lead gets a `person_profile` block:
221```
222{
223 "full_name": "",
224 "current_title": "",
225 "seniority_level": "",
226 "department": "",
227 "tenure_months": null,
228 "previous_companies": [],
229 "education": "",
230 "linkedin_url": "",
231 "linkedin_headline": "",
232 "recent_activity_summary": "",
233 "research_sources": [],
234 "confidence": "high | medium | low"
235}
236```
237 
238---
239 
240## Step 4: Stakeholder Discovery
241 
242### Process
243For each company in the lead list, identify other relevant people — the buying committee.
244 
245**Why this matters:**
246- Inbound leads are rarely the sole decision-maker
247- Finding the rest of the buying committee early accelerates the deal
248- Multi-threading (engaging multiple people at a company) dramatically improves win rates
249 
250**Who to find (based on buyer personas from config):**
251 
2521. **Economic buyer** — Person who signs the check. Usually VP+ or C-level in the relevant department.
2532. **Champion** — Person most likely to push for adoption internally. Usually a senior IC or Director who feels the pain.
2543. **Technical evaluator** — Person who will assess the product's technical fit. Usually engineering or ops.
2554. **End user** — Person who will use the product daily. Their buy-in prevents post-sale churn.
256 
257**Process per company:**
2581. Using the buyer personas, determine which roles to search for
2592. Search via configured tool (SixtyFour or Orthogonal, LinkedIn, company-contact-finder)
2603. For each stakeholder found, capture: name, title, seniority, LinkedIn URL, email (if available)
2614. Note the relationship to the inbound lead: same team? Same department? Different function?
262 
263**Depth control:**
264- **Deep enrichment** (Tier 1-2 leads): Find all 4 stakeholder types. Research each.
265- **Standard enrichment** (Tier 3 leads): Find economic buyer + champion only.
266- **Minimal enrichment** (Tier 4 / untiered): Skip stakeholder discovery.
267 
268### Output
269Each company gets a `stakeholder_map`:
270```
271{
272 "company": "",
273 "inbound_lead": {
274 "name": "",
275 "title": "",
276 "role_in_deal": "economic_buyer | champion | evaluator | user | unknown"
277 },
278 "stakeholders_found": [
279 {
280 "name": "",
281 "title": "",
282 "seniority": "",
283 "linkedin_url": "",
284 "email": "",
285 "role_in_deal": "",
286 "relationship_to_lead": "",
287 "confidence": "high | medium | low"
288 }
289 ],
290 "buying_committee_completeness": "full | partial | minimal",
291 "recommended_multi_thread": ""
292}
293```
294 
295### Stakeholder Prioritization
296If the inbound lead IS the economic buyer → stakeholders are supporting context
297If the inbound lead is a user/evaluator → finding the economic buyer is critical
298If the inbound lead is unknown → identifying their role determines the multi-threading strategy
299 
300---
301 
302## Step 5: Relationship Check
303 
304### Process
305For each lead AND each discovered stakeholder, check existing systems for prior relationships:
306 
307**Check 1 — CRM (HubSpot, Salesforce, CSV):**
308- Does this person already exist in our system?
309- If yes: what's their current status? (active lead, contacted, nurture, customer, churned)
310- If yes: who owns the relationship?
311 
312**Check 2 — Outreach history (`outreach_log`):**
313- Have we emailed/messaged this person before?
314- If yes: when, what channel, what was the outcome?
315- Critical: prevent the "we cold-emailed you last week and you ignored us, now you came inbound" collision
316 
317**Check 3 — Company-level pipeline (`companies` table or CRM):**
318- Is there an active deal with this company?
319- If yes: at what stage? Who's the deal owner?
320- An inbound lead at a company with an active deal is a HUGE signal — flag it prominently
321 
322**Check 4 — Signal history (`signals` table):**
323- Has this company appeared in any signal scans?
324- If yes: which signals? Were they acted on?
325 
326**Check 5 — Mutual connections (if data available):**
327- Does anyone on our team know someone at this company?
328- If yes: note the warm intro path
329 
330### Output
331Each lead gets a `relationship_context` block:
332```
333{
334 "person_in_crm": true/false,
335 "person_crm_status": "",
336 "person_outreach_history": [
337 {
338 "date": "",
339 "channel": "",
340 "campaign": "",
341 "outcome": ""
342 }
343 ],
344 "company_in_pipeline": true/false,
345 "company_deal_stage": "",
346 "company_deal_owner": "",
347 "company_signal_history": [],
348 "mutual_connections": [],
349 "relationship_summary": ""
350}
351```
352 
353---
354 
355## Step 6: Compile & Output
356 
357### Enriched Lead Record
358 
359Merge all research into a single enriched record per lead:
360 
361```
362{
363 "original_data": {},
364 "company_profile": {},
365 "person_profile": {},
366 "stakeholder_map": {},
367 "relationship_context": {},
368 "enrichment_metadata": {
369 "enrichment_depth": "deep | standard | minimal",
370 "fields_filled": X,
371 "fields_still_missing": [],
372 "sources_used": [],
373 "confidence_overall": "high | medium | low",
374 "enrichment_date": "",
375 "cost_incurred": ""
376 }
377}
378```
379 
380### Output Formats
381 
382**Primary: Enriched CSV**
383 
384Produce a CSV that extends the original lead data with all enriched fields:
385 
386| Original Fields | + Company Fields | + Person Fields | + Stakeholder Fields | + Relationship Fields | + Metadata |
387|----------------|------------------|-----------------|---------------------|----------------------|-----------|
388| All input columns | company_description, employee_count, industry, stage, hq, tech_stack, recent_news | current_title, seniority, department, tenure, linkedin_url, headline | stakeholder_1_name, stakeholder_1_title, stakeholder_1_role, ... (up to 4) | in_crm, crm_status, in_pipeline, deal_stage, outreach_history_summary | enrichment_depth, confidence, fields_missing, sources_used |
389 
390Save to the current working directory or wherever the user prefers (e.g., `leads/inbound-enriched-[date].csv`).
391 
392**Secondary: Enrichment Report**
393 
394```markdown
395## Lead Enrichment Report: [Date]
396 
397### Summary
398- **Total leads enriched:** X
399- **Deep enrichment:** X leads (Tier 1-2)
400- **Standard enrichment:** X leads (Tier 3)
401- **Minimal enrichment:** X leads (Tier 4)
402 
403### Data Quality
404- **Fully enriched** (all required + valuable fields): X leads
405- **Mostly enriched** (all required, some valuable): X leads
406- **Partially enriched** (some required fields still missing): X leads
407- **Could not enrich** (insufficient starting data): X leads
408 
409### Company Research
410- **Unique companies researched:** X
411- **Companies already in CRM:** X
412- **Companies with active deals:** X (flag for deal owner)
413- **Companies with signal history:** X
414 
415### Stakeholder Discovery
416- **Total stakeholders found:** X across Y companies
417- **Economic buyers identified:** X
418- **Champions identified:** X
419- **Full buying committees mapped:** X companies
420 
421### Relationship Flags
422- **Leads already in CRM:** X (update status, don't create duplicates)
423- **Previously contacted leads:** X (check outreach history before re-engaging)
424- **Companies with active deals:** X (coordinate with deal owner)
425- **Warm intro paths found:** X
426 
427### Cost
428- **Enrichment tool credits used:** [breakdown by tool]
429- **Cost per lead:** [average]
430 
431### CSV saved to: [path]
432```
433 
434---
435 
436## Handling Edge Cases
437 
438**Lead with only an email, nothing else:**
4391. Extract domain → look up company
4402. Search "[name] [company]" on LinkedIn/web
4413. If still can't identify: flag as `enrichment_failed` with reason, recommend manual lookup
4424. Don't waste paid API credits on truly unidentifiable leads — web search first
443 
444**Same company appears multiple times (multiple inbound leads):**
445- Research the company ONCE, apply to all leads
446- Stakeholder discovery runs once per company, not per lead
447- Note the multi-lead signal: "3 people from [Company] came inbound — buying committee forming?"
448 
449**Lead claims a title that doesn't match LinkedIn:**
450- Trust LinkedIn over self-reported form data (people sometimes inflate titles on forms)
451- Note the discrepancy: "Form says 'VP of Engineering', LinkedIn says 'Senior Engineer'"
452- Use the LinkedIn title for qualification purposes
453 
454**Company recently renamed, merged, or was acquired:**
455- If the company domain redirects, follow the redirect
456- Note the corporate action: "[Company] was acquired by [Parent] in [date]"
457- Qualify against the current entity, not the historical one
458 
459**Person left the company since filling the form:**
460- If LinkedIn shows a different company than the form submission, flag it
461- Note: "Lead submitted via [Company] but now at [New Company] as of [date]"
462- Qualify both companies if both are potentially relevant
463 
464**Enrichment tool rate limits or failures:**
465- If primary tool fails, fall back to secondary (web search is always available)
466- If both fail for a specific lead, mark as `enrichment_partial` and move on
467- Never block the entire batch because one lead failed
468 
469**Very high volume (100+ leads):**
470- Batch company research first (deduplicate companies)
471- Parallelize person research via Task agents (15-20 leads per batch)
472- Skip stakeholder discovery for Tier 4 and untiered leads
473- Provide cost estimate before running paid enrichment tools
474 
475**Personal email domains:**
476- If form had a company field: use it even though email is personal
477- If no company info: attempt LinkedIn search by name
478- Last resort: flag as `company_unidentified`, enrich person only
479 
480---
481 
482## Update Protocol
483 
484After enrichment is complete, update the source systems:
485 
4861. **If CRM is configured:** Create/update lead records with enriched data. Don't overwrite existing data — append or fill gaps only.
4872. **Flag duplicates:** If enrichment reveals a lead already exists in CRM under a different email, flag the duplicate rather than creating a second record.
488 
489---
490 
491## Tools Required
492 
493- **Web search** — primary fallback for all research
494- **SixtyFour or Orthogonal** — company + person lookup (optional, enhances depth)
495- **LinkedIn scraper (Apify)** — person profile enrichment (optional)
496- **Company-contact-finder** — stakeholder discovery
497- **CRM access** — relationship checks (HubSpot, Salesforce, CSV)
498- **Read/Write** — CSV I/O and config management
499- **Task tool** — for parallelizing enrichment across large lead batches
500 

Discussion

Alternatives

Also in Company & contact data