All cases
AI · Sales ops

AI that turns keywords into call-ready leads

An AI pipeline that turns a list of keywords into qualified, call-ready leads in the CRM — it finds the companies, gathers their contacts, structures the mess and scores every lead, with nobody touching it in the middle.

Client
B2B service · sells lead-gen as a product
Role
Python developer (solo)
Engagement
Fixed-price · 2024

The problem

The client’s sales team burned hours on the same loop: search Google for a list of keywords, see which companies advertise there, hunt down their contacts, open their sites for more, then judge whether the lead is even a fit. About half the effort was wasted — the lead turned out off-target only after all the prep.

They needed a machine that does the whole grind and hands sales only finished leads — contacts, a description, and a “worth a call” verdict.

What I built

A six-stage pipeline from keyword to CRM record. The stages are independent, so a mid-chain failure only re-runs that one step.

Source

Advertisers via plain Google

Instead of fighting the Google Ads API and its limits, it pulls advertisers the way a user would — searching Google for the client’s keywords and collecting whoever shows up.

Gather

Contacts & site enrichment

For each company it collects phones, emails and office addresses from the results, then visits the site to pull a business description, key people and product pages.

Extract

spaCy structuring + normalization

Snippets and HTML arrive in wild formats. spaCy cheaply pulls structured entities — people, official company names, short summaries — and a separate layer normalizes them to one shape before anything moves on.

Qualify

LLM scoring → Zoho

Each lead goes to an LLM with the client’s criteria: a fit or not, hot or cold, what the hooks are. The verdict plus contacts and description is written straight into Zoho CRM — the manager just calls.

What made it hard

  • Heterogeneous sources — Google snippets, site HTML, meta tags — all in different shapes. Normalization grew into its own rule-heavy module.
  • Balancing spaCy ↔ LLM: all-LLM is slow and pricey, all-spaCy misses meaning. The fix was a cascade — spaCy extracts entities first, the LLM judges only what needs understanding.
  • Per-client prompt engineering: each client’s qualification criteria differ, so the LLM prompt is assembled from a couple of settings — swap the client, re-tune the qualifier, no code changes.

The result

  • Sales receives finished, qualified leads directly in Zoho CRM.
  • The full chain — keyword to CRM record — runs with no manual step in the middle.
  • Managers stop hand-vetting every company — they just call.
What I took away

The spaCy + LLM cascade is a strong pairing: fast, deterministic tools do what they’re good at (structured extraction), and the LLM is reserved for what genuinely needs context. I now reach for that split on most text-data projects.

All cases