← All Projects
AUTOMATIONGTM Systems

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.

n8nPostgreSQLClaude APIApifyPython
LinkedIn Prospecting Engine n8n workflow
Core discovery workflow — 31 nodes across 5 pipeline phases
$6.49
Cost per scoring run
6
Automated workflows
$2-5
Daily operating cost
1,200
Leads per run

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

01

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.

02

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.

03

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.

04

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.

05

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.

06

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

Orchestrationn8n (self-hosted DigitalOcean), 6 core workflows + 8 BDR workflows
DatabasePostgreSQL — 4 tables (icp_configs, li_prospects, li_accounts, li_scrape_jobs)
AIClaude API for scoring and email generation, explicit anti-fabrication constraints
ScrapingApify (3 actors), batch size 5, rate-limited with delays
OutreachGmail API with RFC 2822 threading (Message-ID, In-Reply-To, References)

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