3
Outputs written per record
2
Live pipelines — EDO scoring + podcast guest qualification
4
Signal categories scored
Eliminated
Manual research
Overview
CModel had hundreds of high-value EDOs in HubSpot. Every record looked the same. Reps had names and websites. Research was manual, slow, and incomplete.
I built an end-to-end pipeline: HubSpot list in → live web signal enrichment (Serper) → Claude ICP scoring → automated write-back. Every scored company now carries a 0–100 fit score, a lane classification (Buyer / Channel / Both), a two-sentence signal note written for the rep, and a personalized outreach hook on the contact.
Same architecture later powered a second pipeline for podcast guest qualification. One system, two jobs.
Technical Decisions
Three decisions that separated a pipeline that works from one that looks like it works.
- Used organic search instead of news results because the signals that matter for EDOs are often months old.
- Handled Claude's occasional markdown fences so the pipeline never dies silently.
- Resolved company-to-contact associations so the hook lands on the right person.
What a Scored Record Looks Like
Before: a name and a website. After: everything the rep needs before the first call.
Before the pipeline runs, an EDO record in HubSpot looks like every other company in the CRM — org name, type, website, a contact or two. No intelligence. The rep has to guess whether it's worth their time.
After:
Company Record — Post-Pipeline
edo_fit_score
82
edo_lane
Buyer
edo_signal_note
"This EDO posted two new project manager roles and announced a $40M industrial park expansion in Q1 — active build-out signals with clear portfolio alignment. Primary buyer candidate."
Contact Record — Post-Pipeline
newsletter_hook
"Given the industrial park expansion you're building right now, I thought this might actually be worth your time —"
The rep opens the record knowing exactly who they're calling, why, what's happening in the org right now, and how to open the conversation. None of that existed in the CRM before.
Current Status
The pipeline is live. Real records. Real write-backs. Manual research on scored companies is gone.
"The job wasn't to automate research. It was to replace the research step entirely — so the rep opens a record already knowing what to say."
What Was Built
- EDO scoring pipeline: HubSpot CRM List → Serper web signal enrichment → Claude ICP scoring → HubSpot write-back (score, lane, signal note, newsletter hook)
- Podcast intake pipeline: Riverside transcript or intake form → Claude guest profile extraction → Serper enrichment → Claude fit scoring → HubSpot contact update
- Custom HubSpot fields: edo_fit_score (0–100), edo_lane (Buyer / Channel / Both), edo_signal_note, newsletter_hook, podcast_fit_status
- Serper integration: organic web search, 5 results per company, signal-optimized query construction per EDO
- Claude integration: two-call per record pattern (ICP scoring + hook generation), JSON fence fallback parsing
- HubSpot associations resolution: company → contact lookup before contact-level write-back
- Stack: Python · Flask · HubSpot CRM API v3 · Anthropic Claude (claude-sonnet-4-5) · Serper · Heroku