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-qualificationflags leads asinsufficient_datainbound-lead-triagedetects 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 domainperson_name— Full nameperson_title— Current job titleperson_email— Contact email (usually already have this from inbound)
Valuable fields (fill if possible):
company_size— Employee count or rangecompany_industry— Industry classificationcompany_stage— Funding stage or maturitycompany_hq— Headquarters locationcompany_description— One sentence about what they doperson_seniority— IC, Manager, Director, VP, C-Level, Founderperson_department— Engineering, Sales, Marketing, etc.person_linkedin— LinkedIn profile URLperson_tenure— How long at current company
Bonus fields (nice to have):
company_tech_stack— Known technologies usedcompany_recent_news— Any recent events (funding, launches, hires)person_background— Previous companies, educationperson_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):
- Extract domain from email (e.g.,
jane@acme.com→acme.com) - Skip personal email domains (gmail, yahoo, hotmail, outlook, etc.)
- 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.):
- Check if name + any other available data can identify the company (e.g., form field, chat message)
- If company is mentioned in their form submission or chat, use that
- 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):
- Search LinkedIn for person at company (via configured tool or web search)
- Cross-reference with SixtyFour or Orthogonal
- 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":