Skip to main content 홈 크리에이터 uitbreidenos uitkit lead-enrichment
lead-enrichment Lead enrichment pipelines: web scraping to structured prospect profiles, company intelligence signals, CRM population — Firecrawl, Clearbit, Apollo patterns
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/UitbreidenOS/UitKit --skill lead-enrichment명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... name lead-enrichment description Lead enrichment pipelines: web scraping to structured prospect profiles, company intelligence signals, CRM population — Firecrawl, Clearbit, Apollo patterns
Lead Enrichment Skill
When to activate
Building a pipeline that turns a raw email/URL list into rich prospect profiles
Scraping company websites and LinkedIn for firmographic data
Populating HubSpot/Salesforce records from external research
Generating ICP scores based on enriched company data
Monitoring signals (funding rounds, hiring surges, exec changes) for account triggers
When NOT to use
Single ad-hoc lookups — use a browser or LinkedIn directly
Bulk B2C consumer data — different regulations and data sources
When verified data is already in your CRM — don't re-enrich unnecessarily
Instructions
The enrichment pipeline
Raw Input (email / domain / LinkedIn URL)
↓
Step 1: IDENTIFY — resolve email to person + company
Step 2: ENRICH — fetch firmographic data (company, tech stack, headcount)
Step 3: SIGNAL CHECK — recent news, funding, hiring, exec changes
Step 4: SCORE — ICP fit score
Step 5: STORE — upsert to CRM with enriched fields
Email → person resolution
async function resolveEmailToPerson (email : string ): Promise <PersonData | null > {
const res = await (
)
data = res. ()
(data. . !== )
{
email,
: data. . ,
: data. . ,
: data. . ,
: (email),
}
}
( ) {
res = ( , {
: ,
: { : , : process. . ! },
: . ({ email }),
})
res. ()
}
fetch
`https://api.hunter.io/v2/email-verifier?email=${email} &api_key=${process.env.HUNTER_API_KEY} `
const
await
json
if
data
status
'valid'
return
null
return
firstName
data
first_name
lastName
data
last_name
company
data
organization
domain
getDomain
async
function
enrichFromApollo
email : string
const
await
fetch
'https://api.apollo.io/v1/people/match'
method
'POST'
headers
'Content-Type'
'application/json'
'x-api-key'
env
APOLLO_API_KEY
body
JSON
stringify
return
json
Company enrichment via web scraping (Firecrawl) import FirecrawlApp from '@mendable/firecrawl-js'
const firecrawl = new FirecrawlApp ({ apiKey : process.env .FIRECRAWL_API_KEY })
async function enrichCompanyFromWebsite (domain : string ): Promise <CompanyData > {
const result = await firecrawl.scrapeUrl (`https://${domain} ` , {
formats : ['extract' ],
extract : {
schema : {
type : 'object' ,
properties : {
companyName : { type : 'string' },
description : { type : 'string' },
industry : { type : 'string' },
products : { type : 'array' , items : { type : 'string' } },
techStack : { type : 'array' , items : { type : 'string' } },
teamSize : { type : 'string' },
founded : { type : 'number' },
headquarters : { type : 'string' },
},
},
},
})
return result.extract as CompanyData
}
Signal detection (trigger-based outreach) async function detectTriggerSignals (company : string ): Promise <TriggerSignal []> {
const signals : TriggerSignal [] = []
const fundingNews = await searchRecentNews (`${company} funding round 2026` )
if (fundingNews.length > 0 ) {
signals.push ({ type : 'funding' , relevance : 0.9 , context : fundingNews[0 ].title })
}
const hiringData = await checkLinkedInJobs (company)
if (hiringData.engineeringJobCount > 10 ) {
signals.push ({ type : 'hiring_surge' , relevance : 0.7 , context : `${hiringData.engineeringJobCount} open engineering roles` })
}
const techChanges = await checkBuiltWithHistory (getDomain (company))
if (techChanges.recentAdditions .length > 0 ) {
signals.push ({ type : 'tech_adoption' , relevance : 0.6 , context : `Added: ${techChanges.recentAdditions.join(', ' )} ` })
}
return signals.sort ((a, b ) => b.relevance - a.relevance )
}
Claude-powered profile synthesis async function synthesiseProspectProfile (
person : PersonData ,
company : CompanyData ,
signals : TriggerSignal []
): Promise <ProspectProfile > {
const { object } = await generateObject ({
model : anthropic ('claude-opus-4-7' ),
schema : z.object ({
icpScore : z.number ().min (0 ).max (100 ),
painPoints : z.array (z.string ()),
outreachAngle : z.string (),
bestChannel : z.enum (['email' , 'linkedin' , 'cold_call' ]),
bestTiming : z.string (),
notAGoodFit : z.boolean (),
notAGoodFitReason : z.string ().optional (),
}),
prompt : `Analyse this prospect for a ${process.env.OUR_PRODUCT_DESCRIPTION} .
Person: ${person.firstName} ${person.lastName} , ${person.jobTitle} at ${company.companyName}
Company: ${company.description} . ${company.teamSize} employees. ${company.industry} .
Tech stack: ${company.techStack.join(', ' )}
Recent signals: ${signals.map(s => s.context).join('; ' )}
Score their ICP fit, identify pain points we can solve, and suggest the best outreach angle.` ,
})
return { ...person, ...company, signals, ...object }
}
Full pipeline async function enrichLeadList (emails : string [] ): Promise <EnrichedLead []> {
const results : EnrichedLead [] = []
for (const email of emails) {
try {
console .log (`Enriching ${email} ...` )
const [person, company] = await Promise .all ([
resolveEmailToPerson (email),
enrichCompanyFromWebsite (getDomain (email)),
])
if (!person || !company) {
results.push ({ email, status : 'not_found' })
continue
}
const signals = await detectTriggerSignals (company.companyName )
const profile = await synthesiseProspectProfile (person, company, signals)
await upsertHubSpotContact (email, profile)
results.push ({ email, status : 'enriched' , profile })
await new Promise (r => setTimeout (r, 500 ))
} catch (err) {
results.push ({ email, status : 'error' , error : err.message })
}
}
return results
}
Example User: Build a pipeline that takes 50 company domains from a CSV, scrapes each website for company data, detects funding and hiring signals, scores ICP fit, and pushes results to HubSpot.
scripts/enrich-pipeline.ts — reads domains.csv, runs enrichment, writes results.json
enrichCompanyFromWebsite(domain) — Firecrawl structured extraction
detectTriggerSignals(company) — funding + hiring + tech signals
scoreICP(company, criteria) — 0-100 score
upsertHubSpotContact(email, enrichedData) — creates/updates CRM records
Progress logging, error capture to failed-enrichments.csv