No lead platform prospects the way I do, so I built my own.
- Client
- Internal tooling
- Industry
- Lead generation infrastructure
- Location
- San Diego, CA
- Services
- Python, Supabase, n8n, Next.js
4
source waterfall for owner emails
5x
weekly, fully unattended runs
1
table of record, no spreadsheets
The situation
Agency prospecting usually means buying a list or renting a generic data platform. Generic was the problem: none of them qualify San Diego businesses the way I do, so I built the waterfall myself on top of the APIs and tools worth paying for.
The requirement: find San Diego small businesses with weak online presence, figure out who owns them, and get a personalized email drafted, without me touching anything.
The call I made
Own the whole pipeline in code, and never pay for the same data twice. Deduplication happens by Google placeId before any paid API call, so re-running the system costs nothing and never overwrites work I have edited by hand.
One honest lesson shaped the architecture: scraping search engines for emails got bot blocked fast. APIs and AI search cost a little, but they do not break at 2am.
What I built and ran
A Python pipeline searches the Google Places API for businesses with weak web presence and scores them HOT, WARM, or COLD. Owner emails come from a four source waterfall: website scrape, Hunter.io, AI web search, then verified pattern guessing with deliverability checks.
HOT leads get an AI research pass that pulls personalization facts, then a drafted email. Everything upserts into a Supabase table over PostgREST, which an internal dashboard I built in Next.js reads and writes.
A signals job re-checks stale leads for review spikes, rating drops, and website changes, and bumps re-engaged businesses back into the outreach queue. n8n ties it together: a button in the dashboard triggers the pipeline on a headless VPS, and a drip sender works the approved queue. The same dashboard publishes my agency's blog through Sanity.
What happened
The system runs on cron every weekday morning with no manual steps. Prospecting went from a chore I avoided to infrastructure I trust.
Because the dashboard owns the schema and everything else speaks PostgREST, each piece is replaceable. The Python box, the n8n workflows, and the frontend never need to know about each other.
What I took from it
The best marketing stack is the one you can read the source of. Building it myself means every part of the funnel is debuggable.
- Python
- Google Places API
- Supabase
- PostgREST
- n8n
- Next.js
- Anthropic API
- Sanity