1
0 Comments

I built a B2B lead scraper for local businesses that aren't on Apollo or ZoomInfo — here's what I learned

The problem I was solving
I needed contact info for local service businesses — dental clinics, med spas, HVAC contractors. The kind of companies that never raised funding and nobody manually added to a database. Apollo returns nothing. ZoomInfo returns nothing.
So I built my own pipeline.

What it does
You give it a niche and a location ("Dentists in Miami"). It:

Scrapes Google Maps for matching businesses
Visits each company's website individually
Crawls contact and about pages, extracts every email it finds
Runs MX verification on each address
Assigns an AI confidence score (0–100) using GPT-4o

The premium layer uses GPT-4o to extract founder/CEO names from website copy and infer their direct emails — something regex alone can't do.

Stack
TypeScript, Next.js, Node.js, PostgreSQL, Puppeteer (stealth mode), GPT-4o. Dashboard + worker architecture — dashboard handles UI, worker processes companies one by one in the background.

The honest tradeoffs
It's not fast. 100 leads takes 30–60 minutes because every business gets individually visited and verified. That's the point — freshness over speed. No stale data from 2022.
It also doesn't scale to millions of leads. It's built for targeted, high-quality lists: 50–500 companies in a specific niche and city.

What I'd do differently
The biggest technical challenge wasn't scraping — it was filtering garbage. Regex catches everything: placeholder domains, malformed strings, catch-all addresses. I had to build a verification layer that checks MX records before anything gets saved.
I built this for my own use first. Then realized others had the same problem.

Where it is now
Live, working, used it personally for outbound. Looking for feedback from others who've tried to build similar pipelines — especially around verification accuracy and handling anti-scraping measures.
Happy to answer questions about the architecture or the scraping challenges.

on March 23, 2026