Lead Enricher
Takes raw inbound lead data (often just a name and email) and enriches it into a complete lead record. Uses WebSearch for public data, checks tools.lead_enrichment config for Apollo or ZoomInfo API paths, and outputs a fully populated lead record ready for qualification and routing.
Prerequisites
agency.config.json populated (ICP, tools config)
- WebSearch tool available
- Inbound lead data: at minimum, email address or company name
- Optional: Apollo.io API access (configured in
tools.lead_enrichment)
- Optional: ZoomInfo access (configured in
tools.lead_enrichment)
Capabilities Used
company-researcher -- deep company data extraction
person-researcher -- contact-level enrichment
linkedin-researcher -- LinkedIn profile data
email-validator -- verify email deliverability
crm-writer -- write enriched record back to CRM
Phase 0: Intake
Read agency.config.json:
icp.segments[] -- for ICP fit tagging during enrichment
tools.lead_enrichment -- check which enrichment tools are available:{
"tools": {
"lead_enrichment": {
"primary": "apollo",
"apollo_api_key": "env:APOLLO_API_KEY",
"zerobounce_api_key": "env:ZEROBOUNCE_API_KEY",
"fallback": "websearch"
}
}
}
crm.tabs -- where to write enriched records
services[] -- for service-need matching during enrichment
Accept parameters:
lead -- (required) lead object with available fields
mode -- single | batch. Default: single
leads -- (required if mode = batch) array of lead objects
enrichment_depth -- basic | standard | deep. Default: standard
validate_email -- boolean, run email validation. Default: true
write_to_crm -- boolean, write enriched record to CRM. Default: true
Minimum lead input:
{
"email": "priya@freshskin.co"
}
Or:
{
"contact_name": "Priya Mehta",
"company_name": "FreshSkin Co"
}
Phase 1: Email Domain Extraction
If only email provided:
- Extract domain:
freshskin.co
- Derive company domain: check if
freshskin.co resolves to a website
- Flag freemail domains (gmail.com, yahoo.com, outlook.com) -- lower quality lead signal
If company name provided but no domain:
- WebSearch:
"{{company_name}}" website
- Extract the primary domain
Phase 2: Contact Enrichment
Apollo Path (if tools.lead_enrichment.primary = "apollo")
Use Apollo People Match or People Search:
- Input: email or name + company
- Extract: full name, title, phone, LinkedIn URL, company details
- Apollo returns: person match confidence, verified email, company firmographics
WebSearch Path (if Apollo unavailable or as supplement)
Run person-researcher with available data:
Name + Company search:
- WebSearch:
"{{contact_name}}" "{{company_name}}"
- WebSearch:
"{{contact_name}}" linkedin
- WebSearch:
"{{contact_name}}" {{company_domain}}
Extract:
- Full name (verify spelling)
- Current title and role
- LinkedIn profile URL
- Twitter/X handle
- Other social profiles
- Professional background summary
- Recent activity (posts, interviews, conference appearances)
LinkedIn Enrichment
Run linkedin-researcher for:
- Profile headline and summary
- Current role details (start date, description)
- Previous roles (career trajectory)
- Education
- Skills and endorsements
- Connections count (proxy for network size)
- Recent posts (content they care about)
- Groups (interests and focus areas)
Compile:
CONTACT RECORD
---
Full name: [verified name]
Email: [email]
Email status: [valid/invalid/catch-all/unknown]
Title: [current title]
Phone: [if found]
LinkedIn: [URL]
Twitter: [handle]
Location: [city, country]
Seniority: [C-level/VP/Director/Manager/Individual]
Department: [Marketing/Ecommerce/Engineering/Operations/Executive]
Phase 3: Company Enrichment
Apollo Path (if available)
Use Apollo Organization Enrich:
- Input: domain
- Extract: company name, industry, employee count, revenue range, tech stack, social profiles
WebSearch Path
Run company-researcher with the company domain:
Firmographic data:
- Company legal name
- Industry and sub-industry (SIC/NAICS if available)
- Employee count (exact or range)
- Revenue estimate (range)
- Founded year
- Headquarters location
- Funding status (bootstrapped, seed, Series A/B/C, public)
- Total funding raised
Digital presence:
- Website URL and platform (Shopify, WooCommerce, custom, etc.)
- Technology stack (via BuiltWith signals in search results)
- Social profiles: LinkedIn company page, Instagram, Twitter, Facebook, YouTube
- App store presence (if applicable)
- Review sites (G2, Capterra, Trustpilot, Google Reviews)
Business signals:
- Recent funding rounds
- Job postings (roles, departments expanding)
- Press mentions (last 6 months)
- Partnership announcements
- Product launches
- Awards or recognition
- Competitor landscape (who else is in their space)
Compile:
COMPANY RECORD
---
Company name: [legal name]
Domain: [primary domain]
Industry: [vertical]
Sub-industry: [niche]
Employee count: [range]
Revenue estimate: [range]
Founded: [year]
HQ: [city, country]
Funding: [status + total raised]
Platform: [ecommerce platform]
Tech stack: [key technologies detected]
Social profiles:
LinkedIn: [URL]
Instagram: [handle]
Twitter: [handle]
Facebook: [URL]
YouTube: [URL]
Recent signals:
Hiring: [roles if any]
Funding: [recent round if any]
Press: [notable mentions]
Product: [recent launches]
Phase 4: Email Validation
If validate_email = true:
ZeroBounce Path (if configured)
- Submit email to ZeroBounce API
- Get: status (valid/invalid/catch-all/spamtrap/abuse/unknown), sub-status, domain info
Heuristic Path (if no API)
- Check MX records for domain
- Check if domain is active
- Flag disposable email domains
- Flag role-based emails (info@, hello@, support@)
Validation result:
Email validation:
Address: [email]
Status: [valid/invalid/risky/unknown]
Type: [personal/role-based/freemail]
Deliverability: [HIGH/MEDIUM/LOW]
Risk flags: [catch-all, new domain, etc.]
Phase 5: ICP Tagging
Match enriched data against icp.segments[]:
For each segment, check:
- Industry match
- Company size match (employee range)
- Revenue range match
- Geography match
- Platform match
- Stage match (post-PMF, mid-market, enterprise)
Tag the lead:
ICP Assessment:
Best segment match: [segment name]
Fit score: [1-5]
Matching criteria: [list of matches]
Non-matching criteria: [list of misses]
Fit verdict: STRONG_FIT / MODERATE_FIT / WEAK_FIT / NO_FIT
Phase 6: Service Need Detection
Based on enriched data, flag potential service needs:
- Store development: Outdated store, non-Shopify platform, poor mobile experience
- CRO: High traffic + low conversion signals, basic product pages
- Catalog management: Large SKU count, poor product imagery
- Performance marketing: Low traffic, no paid ads visible, competitor ads running
- SEO: Low organic visibility, thin content, no blog
- Email marketing: No email capture visible, no post-purchase flow
Detected needs:
1. [Service] -- [signal that indicates this need] -- Confidence: [HIGH/MEDIUM/LOW]
2. [Service] -- [signal] -- Confidence: [level]
Phase 7: Output
Return structured JSON:
{
"enrichment_date": "2026-03-07",
"enrichment_depth": "standard",
"contact": {
"full_name": "Priya Mehta",
"email": "priya@freshskin.co",
"email_valid": true,
"email_type": "personal",
"title": "Founder & CEO",
"phone": "+91-98XXXXXXXX",
"linkedin": "https://linkedin.com/in/priyamehta",
"twitter": "@priyamehta",
"location": "Mumbai, India",
"seniority": "C-level",
"department": "Executive"
},
"company": {
"name": "FreshSkin Co",
"domain": "freshskin.co",
"industry": "Beauty & Skincare",
"sub_industry": "D2C Skincare",
"employee_count": "25-50",
"revenue_estimate": "INR 5-10 Cr/year",
"founded": 2022,
"hq": "Mumbai, India",
"funding": {"status": "Series A", "total_raised": "INR 8 Cr"},
"platform": "Shopify",
"tech_stack": ["Shopify", "Klaviyo", "Google Analytics"],
"social": {
"linkedin": "https://linkedin.com/company/freshskinco",
"instagram": "@freshskinco",
"twitter": "@freshskinco"
},
"recent_signals": {
"hiring": ["Marketing Manager", "Content Creator"],
"funding": "Series A closed Dec 2025",
"product_launches": ["New serum line launched Jan 2026"]
}
},
"icp_assessment": {
"best_segment": "Post-PMF D2C India",
"fit_score": 4,
"fit_verdict": "STRONG_FIT",
"matching": ["industry", "size", "geo", "platform", "stage"],
"non_matching": []
},
"detected_needs": [
{"service": "CRO", "signal": "Basic product pages, no trust elements", "confidence": "HIGH"},
{"service": "Catalog Management", "signal": "50+ SKUs with inconsistent photography", "confidence": "MEDIUM"}
],
"enrichment_sources": ["websearch", "linkedin", "zerobounce"],
"data_completeness": "85%",
"missing_fields": ["phone", "revenue_exact"],
"generated_at": "2026-03-07T10:00:00Z"
}
Phase 8: CRM Write and Handoff
If write_to_crm = true:
- Write enriched record to CRM via
crm-writer
- Set
enrichment_status = "complete"
- Set
enrichment_date = today
- Set
icp_fit = fit verdict
Handoff options:
- If
auto_qualify flag set, trigger lead-qualifier with enriched data
- If
auto_route flag set, trigger lead-router after qualification
- Otherwise, present enriched record for manual review
APPROVAL GATE: "Lead enriched. [Data completeness]% complete. Route to qualification?"
Example Usage
Trigger phrases:
- "Enrich this lead: priya@freshskin.co"
- "I got a new inbound lead, enrich them: [name] at [company]"
- "Batch enrich this week's inbound leads"
- "Look up everything about [person] at [company]"
- "Fill in the missing data for [lead]"
- "Enrich and qualify [lead name]"
1---2name: lead-enricher3description: Enriches inbound leads with firmographic and technographic data. Takes minimal lead info and enriches via WebSearch, Apollo, or ZoomInfo to produce a complete lead record with company size, revenue, tech stack, social profiles, and decision-maker details.4---56# Lead Enricher78Takes raw inbound lead data (often just a name and email) and enriches it into a complete lead record. Uses WebSearch for public data, checks `tools.lead_enrichment` config for Apollo or ZoomInfo API paths, and outputs a fully populated lead record ready for qualification and routing.910## Prerequisites1112- `agency.config.json` populated (ICP, tools config)13- WebSearch tool available14- Inbound lead data: at minimum, email address or company name15- Optional: Apollo.io API access (configured in `tools.lead_enrichment`)16- Optional: ZoomInfo access (configured in `tools.lead_enrichment`)1718## Capabilities Used19201. `company-researcher` -- deep company data extraction212. `person-researcher` -- contact-level enrichment223. `linkedin-researcher` -- LinkedIn profile data234. `email-validator` -- verify email deliverability245. `crm-writer` -- write enriched record back to CRM2526## Phase 0: Intake2728Read `agency.config.json`:29- `icp.segments[]` -- for ICP fit tagging during enrichment30- `tools.lead_enrichment` -- check which enrichment tools are available:31 ```json32 {33 "tools": {34 "lead_enrichment": {35 "primary": "apollo",36 "apollo_api_key": "env:APOLLO_API_KEY",37 "zerobounce_api_key": "env:ZEROBOUNCE_API_KEY",38 "fallback": "websearch"39 }40 }41 }42 ```43- `crm.tabs` -- where to write enriched records44- `services[]` -- for service-need matching during enrichment4546Accept parameters:47- `lead` -- (required) lead object with available fields48- `mode` -- `single` | `batch`. Default: `single`49- `leads` -- (required if mode = `batch`) array of lead objects50- `enrichment_depth` -- `basic` | `standard` | `deep`. Default: `standard`51- `validate_email` -- boolean, run email validation. Default: `true`52- `write_to_crm` -- boolean, write enriched record to CRM. Default: `true`5354Minimum lead input:55```json56{57 "email": "priya@freshskin.co"58}59```60Or:61```json62{63 "contact_name": "Priya Mehta",64 "company_name": "FreshSkin Co"65}66```6768## Phase 1: Email Domain Extraction6970If only email provided:71- Extract domain: `freshskin.co`72- Derive company domain: check if `freshskin.co` resolves to a website73- Flag freemail domains (gmail.com, yahoo.com, outlook.com) -- lower quality lead signal7475If company name provided but no domain:76- WebSearch: `"{{company_name}}" website`77- Extract the primary domain7879## Phase 2: Contact Enrichment8081### Apollo Path (if tools.lead_enrichment.primary = "apollo")82Use Apollo People Match or People Search:83- Input: email or name + company84- Extract: full name, title, phone, LinkedIn URL, company details85- Apollo returns: person match confidence, verified email, company firmographics8687### WebSearch Path (if Apollo unavailable or as supplement)88Run `person-researcher` with available data:8990**Name + Company search**:91- WebSearch: `"{{contact_name}}" "{{company_name}}"`92- WebSearch: `"{{contact_name}}" linkedin`93- WebSearch: `"{{contact_name}}" {{company_domain}}`9495**Extract**:96- Full name (verify spelling)97- Current title and role98- LinkedIn profile URL99- Twitter/X handle100- Other social profiles101- Professional background summary102- Recent activity (posts, interviews, conference appearances)103104### LinkedIn Enrichment105Run `linkedin-researcher` for:106- Profile headline and summary107- Current role details (start date, description)108- Previous roles (career trajectory)109- Education110- Skills and endorsements111- Connections count (proxy for network size)112- Recent posts (content they care about)113- Groups (interests and focus areas)114115Compile:116```117CONTACT RECORD118---119Full name: [verified name]120Email: [email]121Email status: [valid/invalid/catch-all/unknown]122Title: [current title]123Phone: [if found]124LinkedIn: [URL]125Twitter: [handle]126Location: [city, country]127Seniority: [C-level/VP/Director/Manager/Individual]128Department: [Marketing/Ecommerce/Engineering/Operations/Executive]129```130131## Phase 3: Company Enrichment132133### Apollo Path (if available)134Use Apollo Organization Enrich:135- Input: domain136- Extract: company name, industry, employee count, revenue range, tech stack, social profiles137138### WebSearch Path139Run `company-researcher` with the company domain:140141**Firmographic data**:142- Company legal name143- Industry and sub-industry (SIC/NAICS if available)144- Employee count (exact or range)145- Revenue estimate (range)146- Founded year147- Headquarters location148- Funding status (bootstrapped, seed, Series A/B/C, public)149- Total funding raised150151**Digital presence**:152- Website URL and platform (Shopify, WooCommerce, custom, etc.)153- Technology stack (via BuiltWith signals in search results)154- Social profiles: LinkedIn company page, Instagram, Twitter, Facebook, YouTube155- App store presence (if applicable)156- Review sites (G2, Capterra, Trustpilot, Google Reviews)157158**Business signals**:159- Recent funding rounds160- Job postings (roles, departments expanding)161- Press mentions (last 6 months)162- Partnership announcements163- Product launches164- Awards or recognition165- Competitor landscape (who else is in their space)166167Compile:168```169COMPANY RECORD170---171Company name: [legal name]172Domain: [primary domain]173Industry: [vertical]174Sub-industry: [niche]175Employee count: [range]176Revenue estimate: [range]177Founded: [year]178HQ: [city, country]179Funding: [status + total raised]180Platform: [ecommerce platform]181Tech stack: [key technologies detected]182183Social profiles:184 LinkedIn: [URL]185 Instagram: [handle]186 Twitter: [handle]187 Facebook: [URL]188 YouTube: [URL]189190Recent signals:191 Hiring: [roles if any]192 Funding: [recent round if any]193 Press: [notable mentions]194 Product: [recent launches]195```196197## Phase 4: Email Validation198199If `validate_email` = true:200201### ZeroBounce Path (if configured)202- Submit email to ZeroBounce API203- Get: status (valid/invalid/catch-all/spamtrap/abuse/unknown), sub-status, domain info204205### Heuristic Path (if no API)206- Check MX records for domain207- Check if domain is active208- Flag disposable email domains209- Flag role-based emails (info@, hello@, support@)210211Validation result:212```213Email validation:214 Address: [email]215 Status: [valid/invalid/risky/unknown]216 Type: [personal/role-based/freemail]217 Deliverability: [HIGH/MEDIUM/LOW]218 Risk flags: [catch-all, new domain, etc.]219```220221## Phase 5: ICP Tagging222223Match enriched data against `icp.segments[]`:224225For each segment, check:226- Industry match227- Company size match (employee range)228- Revenue range match229- Geography match230- Platform match231- Stage match (post-PMF, mid-market, enterprise)232233Tag the lead:234```235ICP Assessment:236 Best segment match: [segment name]237 Fit score: [1-5]238 Matching criteria: [list of matches]239 Non-matching criteria: [list of misses]240 Fit verdict: STRONG_FIT / MODERATE_FIT / WEAK_FIT / NO_FIT241```242243## Phase 6: Service Need Detection244245Based on enriched data, flag potential service needs:246247- **Store development**: Outdated store, non-Shopify platform, poor mobile experience248- **CRO**: High traffic + low conversion signals, basic product pages249- **Catalog management**: Large SKU count, poor product imagery250- **Performance marketing**: Low traffic, no paid ads visible, competitor ads running251- **SEO**: Low organic visibility, thin content, no blog252- **Email marketing**: No email capture visible, no post-purchase flow253254```255Detected needs:256 1. [Service] -- [signal that indicates this need] -- Confidence: [HIGH/MEDIUM/LOW]257 2. [Service] -- [signal] -- Confidence: [level]258```259260## Phase 7: Output261262Return structured JSON:263264```json265{266 "enrichment_date": "2026-03-07",267 "enrichment_depth": "standard",268 "contact": {269 "full_name": "Priya Mehta",270 "email": "priya@freshskin.co",271 "email_valid": true,272 "email_type": "personal",273 "title": "Founder & CEO",274 "phone": "+91-98XXXXXXXX",275 "linkedin": "https://linkedin.com/in/priyamehta",276 "twitter": "@priyamehta",277 "location": "Mumbai, India",278 "seniority": "C-level",279 "department": "Executive"280 },281 "company": {282 "name": "FreshSkin Co",283 "domain": "freshskin.co",284 "industry": "Beauty & Skincare",285 "sub_industry": "D2C Skincare",286 "employee_count": "25-50",287 "revenue_estimate": "INR 5-10 Cr/year",288 "founded": 2022,289 "hq": "Mumbai, India",290 "funding": {"status": "Series A", "total_raised": "INR 8 Cr"},291 "platform": "Shopify",292 "tech_stack": ["Shopify", "Klaviyo", "Google Analytics"],293 "social": {294 "linkedin": "https://linkedin.com/company/freshskinco",295 "instagram": "@freshskinco",296 "twitter": "@freshskinco"297 },298 "recent_signals": {299 "hiring": ["Marketing Manager", "Content Creator"],300 "funding": "Series A closed Dec 2025",301 "product_launches": ["New serum line launched Jan 2026"]302 }303 },304 "icp_assessment": {305 "best_segment": "Post-PMF D2C India",306 "fit_score": 4,307 "fit_verdict": "STRONG_FIT",308 "matching": ["industry", "size", "geo", "platform", "stage"],309 "non_matching": []310 },311 "detected_needs": [312 {"service": "CRO", "signal": "Basic product pages, no trust elements", "confidence": "HIGH"},313 {"service": "Catalog Management", "signal": "50+ SKUs with inconsistent photography", "confidence": "MEDIUM"}314 ],315 "enrichment_sources": ["websearch", "linkedin", "zerobounce"],316 "data_completeness": "85%",317 "missing_fields": ["phone", "revenue_exact"],318 "generated_at": "2026-03-07T10:00:00Z"319}320```321322## Phase 8: CRM Write and Handoff323324If `write_to_crm` = true:325- Write enriched record to CRM via `crm-writer`326- Set `enrichment_status` = "complete"327- Set `enrichment_date` = today328- Set `icp_fit` = fit verdict329330Handoff options:331- If `auto_qualify` flag set, trigger `lead-qualifier` with enriched data332- If `auto_route` flag set, trigger `lead-router` after qualification333- Otherwise, present enriched record for manual review334335**APPROVAL GATE**: "Lead enriched. [Data completeness]% complete. Route to qualification?"336337## Example Usage338339Trigger phrases:340- "Enrich this lead: priya@freshskin.co"341- "I got a new inbound lead, enrich them: [name] at [company]"342- "Batch enrich this week's inbound leads"343- "Look up everything about [person] at [company]"344- "Fill in the missing data for [lead]"345- "Enrich and qualify [lead name]"