I built the prospecting system I wished I had when I was selling.
Manual LinkedIn prospecting was slow, expensive, and missed timing signals. By the time a rep noticed a job change or engagement spike, the window had closed. I built a multi-signal automation system that finds, scores, and reaches out to prospects automatically — for $2-5 a day.

Prospecting by hand doesn't scale and misses the best signals
A sales rep manually checking LinkedIn for job changes, engagement spikes, and buying committee composition might find 10-15 qualified prospects in an hour. Most of those are already stale — the signal happened days ago.
The cost per qualified lead was high. The timing was bad. And the reps who were best at prospecting were the ones who should have been spending their time closing, not searching.
Six phases, fully automated
LinkedIn Search
Loads ICP config from PostgreSQL, generates title x industry query combinations, searches via Apify with rate-limiting (50 results per query, 3-second delays). Finds prospects that match your ideal customer profile automatically.
Dedup & Filter
Extracts profile URLs, checks against existing PostgreSQL records, removes duplicates before any enrichment happens. This single step saved $15-30 per run — the original version enriched first, then deduped, wasting money on data it already had.
Profile Scraping
Batch scrapes full LinkedIn profiles via Apify in batches of 10. Pulls work history, skills, headline, summary, connections — everything needed for scoring and personalized outreach.
Company Enrichment
Scrapes company pages in batches of 5, upserts to the accounts table with foreign key relationships. Captures company size, industry, growth signals, and tech stack indicators.
Signal Scoring
Time-decay weighted scoring: job changes (85 pts), pain language in headlines (30 pts), skill matches (25 pts), seniority fit (20 pts). Multi-person engagement from the same company scores 90 pts. Freshest signals rank highest.
Delivery & Outreach
Scored leads feed into the AI BDR agent — a separate 8-workflow, 122-node system that generates hyper-personalized cold emails with Claude and sends 50/day with threaded follow-up sequences.
Lessons that cost real money to learn
AI fabrication in lead scoring
Claude invented plausible-sounding resume experience during enrichment. A prospect's profile said "sales manager" and Claude extrapolated an entire career trajectory. Fixed with explicit constraints: score only what the profile literally says, never infer or fabricate.
Enriching before deduplicating
The first version enriched every discovered profile, then checked for duplicates. That wasted $15-30 per run on data we already had. Moving dedup upstream — before any enrichment API calls — was the single biggest cost optimization.
Google Sheets hit a wall at 500 records
Started with Google Sheets as the database. Hit rate limits at 60 requests per minute, silent row drops above 500 records, and concurrent write corruption. Migrated to PostgreSQL with proper foreign keys, indexes, and batch operations.
Batch size tuning across APIs
Batches of 10-20 hit rate limits unpredictably across different APIs — Apify, Claude, Gmail all have different thresholds. Standardized on batch size 5 across the entire system. Slower, but reliable and predictable.
n8n data flow drops data silently
n8n's default "previous node" behavior silently dropped data in branching workflows. A node connected to two downstream branches would sometimes only send data to one. Fixed by using explicit node references instead of relying on default data flow.
Part of a four-system GTM automation portfolio
The LinkedIn engine is one piece of a larger system. Every GTM automation I build follows the same pattern: discover, deduplicate, pre-filter, enrich, score, deliver. AI handles unstructured extraction and nuanced scoring. Everything else is deterministic.
AI BDR Agent
122 nodes across 8 workflows. Takes scored leads and runs a full 7-stage outreach pipeline: discovery, enrichment, scoring, email generation, batch sending (50/day), 3-touch follow-up sequences, and an AI orchestrator that reads pipeline state and decides what to run next.
Restaurant Lead Intelligence
Parallel system for a different vertical. 65-80% email discovery rate, 150-point scoring algorithm, multi-state coverage. Same architectural pattern: discover, dedup, pre-filter, enrich, score, deliver.
ATS Job Discovery Engine
Job market intelligence across 50+ ATS platforms. Monitors job postings for buying signals — companies hiring for roles that indicate need for the product being sold.
Cost optimization is non-negotiable
The cheapest API call is the one you never make. Three layers of dedup reduce enrichment costs by 25-35%. Deterministic pre-filtering eliminates 40-60% of records before any AI scoring. HTML stripping before Claude calls reduces tokens by 60-80%. The result: $2-5/day to monitor and score hundreds of prospects.
Full Stack
What changed
Before: Manual LinkedIn searching. 10-15 prospects per hour. Stale signals. High cost per qualified lead. Best closers spending hours on prospecting.
After: 500-1,200 leads processed per run. Time-decay scoring surfaces the freshest, highest-intent prospects first. AI-generated personalized outreach at 50 emails per day with threaded follow-ups. Total cost: $2-5/day.
Design Philosophy
- Cost optimization is non-negotiable. The cheapest API call is the one you never make.
- Linear beats clever. Simple sequential workflows are easier to debug, maintain, and explain.
- AI is a tool, not the architecture. Claude handles unstructured extraction. Everything else is deterministic.
Need a prospecting engine that runs while you sleep?
Let's Talk