Lead Enrichment — Multi-Source Data Completion
Enrich CRM contact records by filling missing fields from multiple sources. Works with DuckDB workspace entries or standalone JSON data.
Sources (Priority Order)
- 1. LinkedIn (via linkedin-scraper skill) — name, title, company, education, connections
- Web Search (via websearch tool) — email patterns, company info, social profiles
- Company Website (via webfetch) — team pages, about pages, contact info
- Email Pattern Discovery — derive email from name + company domain
Enrichment Pipeline
Step 1: Assess What's Missing
CODEBLOCK0
Step 2: Prioritize by Value
- - High priority: Missing email (needed for outreach)
- Medium priority: Missing title/company (needed for personalization)
- Low priority: Missing education, connections count, about text
Step 3: Enrich Per Record
For each record with gaps:
If LinkedIn URL is known but other fields missing:
- 1. Use linkedin-scraper to visit profile
- Extract: title, company, location, education, about
- Update DuckDB record
If LinkedIn URL is missing:
- 1. Search LinkedIn:
{name} {company} or INLINECODE1 - Verify match (name + company alignment)
- Store LinkedIn URL, then scrape full profile
If Email is missing:
- 1. Find company domain (web search or LinkedIn company page)
- Try common patterns:
-
first@domain.com
-
first.last@domain.com
-
flast@domain.com
-
firstl@domain.com
- 3. Optionally verify with web search: INLINECODE6
- Check company team/about page for email format clues
If Company info is missing:
- 1. Web search:
"{name}" "{title}" or check LinkedIn - Fetch company website for: industry, size, description, funding
Step 4: Update Records
CODEBLOCK1
Bulk Enrichment Mode
For enriching many records at once:
- 1. Query all incomplete records from DuckDB
- Group by company (scrape company once, apply to all employees)
- Process in batches of 10-20 records
- Report progress after each batch:
Enrichment Progress: 45/120 leads (38%)
├── Emails found: 32/45 (71%)
├── LinkedIn matched: 41/45 (91%)
├── Titles updated: 38/45 (84%)
└── ETA: ~15 min remaining
- 5. Save checkpoint after each batch (in case of interruption)
Enrichment Quality Rules
- - Confidence scoring: Mark each enriched field with confidence (high/medium/low)
- High: Direct match from LinkedIn profile or company website
- Medium: Inferred from patterns (email format) or partial match
- Low: Best guess from web search results
- - Never overwrite existing data unless explicitly asked
- Flag conflicts: If enriched data contradicts existing data, flag for review
- Dedup check: Before inserting LinkedIn URL, check it's not already assigned to another contact
Email Pattern Discovery
Common corporate email formats by frequency:
- 1.
first.last@domain.com (most common, ~45%) - INLINECODE9 (~20%)
- INLINECODE10 (~15%)
- INLINECODE11 (~10%)
- INLINECODE12 (~5%)
- INLINECODE13 (~3%)
- INLINECODE14 (~2%)
Strategy:
- 1. If you know one person's email at the company, derive the pattern
- Search web for INLINECODE15
- Check company team page source code for mailto: links
- Use the most common pattern as fallback
Output
After enrichment, provide a summary:
CODEBLOCK3
DuckDB Field Mapping
Standard field names for Ironclaw CRM objects:
| Enrichment Data | DuckDB Field | Type |
|---|
| Full name | Name | text |
| Email address |
Email | email |
| LinkedIn URL | LinkedIn URL | url |
| Job title | Title | text |
| Company name | Company | text / relation |
| Location | Location | text |
| Education | Education | text |
| Phone | Phone | phone |
| Company size | Company Size | text |
| Industry | Industry | text |
| Enrichment date | Enriched At | date |
| Confidence | Enrichment Confidence | enum (high/medium/low) |
潜在客户信息丰富 — 多源数据补全
通过从多个来源填充缺失字段来丰富CRM联系人记录。适用于DuckDB工作区条目或独立JSON数据。
数据来源(按优先级排序)
- 1. LinkedIn(通过linkedin-scraper技能)— 姓名、职位、公司、教育背景、人脉
- 网络搜索(通过websearch工具)— 邮箱格式、公司信息、社交资料
- 公司网站(通过webfetch)— 团队页面、关于页面、联系方式
- 邮箱格式发现 — 从姓名+公司域名推导邮箱
信息丰富流程
步骤1:评估缺失内容
sql
-- 查询目标对象以发现缺口
SELECT 姓名, 邮箱, LinkedIn URL, 公司, 职位, 所在地
FROM v_leads
WHERE 邮箱 IS NULL OR LinkedIn URL IS NULL OR 职位 IS NULL;
步骤2:按价值排序
- - 高优先级:缺失邮箱(外联所需)
- 中优先级:缺失职位/公司(个性化所需)
- 低优先级:缺失教育背景、人脉数量、简介文本
步骤3:逐条丰富
对于每条有缺口的记录:
如果已知LinkedIn URL但其他字段缺失:
- 1. 使用linkedin-scraper访问个人资料
- 提取:职位、公司、所在地、教育背景、简介
- 更新DuckDB记录
如果LinkedIn URL缺失:
- 1. 搜索LinkedIn:{姓名} {公司} 或 {姓名} {职位}
- 验证匹配(姓名+公司一致性)
- 存储LinkedIn URL,然后抓取完整资料
如果邮箱缺失:
- 1. 查找公司域名(网络搜索或LinkedIn公司页面)
- 尝试常见格式:
- first@domain.com
- first.last@domain.com
- flast@domain.com
- firstl@domain.com
- 3. 可选:通过网络搜索验证:邮箱 {姓名} site:{域名}
- 查看公司团队/关于页面获取邮箱格式线索
如果公司信息缺失:
- 1. 网络搜索:{姓名} {职位} 或查看LinkedIn
- 抓取公司网站获取:行业、规模、描述、融资情况
步骤4:更新记录
sql
-- 通过DuckDB透视视图更新
UPDATE v_leads SET
邮箱 = ?,
LinkedIn URL = ?,
职位 = ?,
公司 = ?,
所在地 = ?
WHERE id = ?;
批量丰富模式
用于一次性丰富多条记录:
- 1. 查询所有不完整记录 从DuckDB
- 按公司分组(抓取一次公司信息,应用于所有员工)
- 分批处理 每批10-20条记录
- 每批后报告进度:
丰富进度:45/120条线索(38%)
├── 已找到邮箱:32/45(71%)
├── 已匹配LinkedIn:41/45(91%)
├── 已更新职位:38/45(84%)
└── 预计剩余时间:约15分钟
- 5. 每批后保存检查点(以防中断)
丰富质量规则
- - 置信度评分:为每个丰富字段标记置信度(高/中/低)
- 高:直接匹配自LinkedIn资料或公司网站
- 中:从格式(邮箱格式)或部分匹配推断
- 低:基于网络搜索结果的最佳猜测
- - 绝不覆盖现有数据,除非明确要求
- 标记冲突:如果丰富数据与现有数据矛盾,标记待审
- 去重检查:在插入LinkedIn URL前,检查是否已分配给其他联系人
邮箱格式发现
按频率排序的常见企业邮箱格式:
- 1. first.last@domain.com(最常见,约45%)
- first@domain.com(约20%)
- flast@domain.com(约15%)
- firstl@domain.com(约10%)
- first_last@domain.com(约5%)
- last.first@domain.com(约3%)
- first.l@domain.com(约2%)
策略:
- 1. 如果知道公司内某人的邮箱,推导出格式
- 网络搜索 @{域名} 邮箱格式
- 查看公司团队页面源代码中的mailto:链接
- 使用最常见格式作为后备方案
输出
丰富完成后,提供摘要:
丰富完成:处理120条线索
├── 邮箱:找到94个(78%),仍有26个缺失
├── LinkedIn:匹配108个(90%),12个未找到
├── 职位:更新115个(96%)
├── 公司:确认118个(98%)
├── 所在地:找到89个(74%)
└── 平均置信度:高(82%),中(14%),低(4%)
主要剩余缺口:
- - 26条线索缺失邮箱(多为小型/隐形公司)
- 12条线索缺失LinkedIn(常见姓名,匹配模糊)
DuckDB字段映射
Ironclaw CRM对象的标准字段名:
邮箱 | 邮箱 |
| LinkedIn URL | LinkedIn URL | 网址 |
| 职位 | 职位 | 文本 |
| 公司名称 | 公司 | 文本/关联 |
| 所在地 | 所在地 | 文本 |
| 教育背景 | 教育背景 | 文本 |
| 电话 | 电话 | 电话 |
| 公司规模 | 公司规模 | 文本 |
| 行业 | 行业 | 文本 |
| 丰富日期 | 丰富于 | 日期 |
| 置信度 | 丰富置信度 | 枚举(高/中/低) |