LinkedIn AI Lead Engine: Scrape, Qualify & Auto-Outreach on a Daily Schedule
Our own lead-generation engine, running daily: a Playwright scraper finds fresh LinkedIn posts where businesses describe automation pain points, an AI classifier scores each author HOT/WARM/SKIP, qualified leads land in a Google Sheets CRM, and personalised outreach goes out automatically — capped, paced, and logged for safety. We treat it with the same rigour we'd apply to a client's system, including catching and fixing our own classifier's mistakes in production.

The Challenge
Finding automation clients on LinkedIn manually meant scrolling feeds hoping to spot a business owner describing a problem we solve — then researching them, writing a message, and remembering to follow up. Unstructured, unrepeatable, and the first thing dropped in a busy week. Generic mass-outreach tools were the wrong answer: they burn accounts, spam the wrong people, and produce conversations that start with distrust.
What We Built
We built the opposite of a spam cannon: a precision engine that starts from intent. A Python + Playwright scraper runs on a daily schedule via n8n, searching LinkedIn posts for buying-signal keywords across the past week. Each post's author and content go to an LLM classifier with a strict rubric: HOT (actively seeking automation help now), WARM (a real business describing a genuine operational pain), or SKIP (fellow agencies, tool vendors, tutorial content — the majority). Qualified leads land in a Google Sheets CRM with the AI's reasoning and a personalised three-line outreach message referencing their specific post. The engine then sends the DM — or a connection request with note where messaging is closed — through a safety layer: a hard daily cap, human-like typing and delays, a permanent contacted-log preventing double outreach, and per-lead status written back to the Sheet. A separate error-triggered workflow pushes an instant phone alert the moment any daily run fails, so a dead scrape never goes unnoticed the way it briefly did before this was added.
How It Works
The insight behind the engine: the best B2B leads on LinkedIn aren't found by title or industry filters — they're found by what people write. Someone posting 'drowning in manual follow-ups, there has to be a better way' is a warmer lead than any job-title match. So the scraper searches post content for pain-signal keywords, not profiles.
The AI classifier is where quality is enforced, and getting it genuinely reliable took real, ongoing engineering — not a one-time rubric. Running the engine daily on our own pipeline surfaced four distinct ways a text-only classifier gets fooled: it can't tell a real complaint from a freelancer using the same words as a marketing hook unless it also reads their headline; general industry commentary phrased like a personal complaint slips through unless the rule requires first-person, present-tense language; a well-written anecdote that only resolves into a product pitch in its final third evades a rule built to catch obvious pitches; and a correct override rule can still fail to fire if it's buried as one example among many rather than stated as its own explicit instruction. We found and fixed all four by reading the classifier's own logged reasoning against real posts, not by guessing.
Outreach messages are generated per lead, referencing the specific post: a short observation about their problem, one line on how we build exactly that kind of automation, and a soft question. Three lines, no pitch deck, no exclamation marks. Only HOT leads get auto-messaged — WARM leads land in the Sheet for manual review, a deliberate gate that keeps a human in the loop on judgement calls the classifier is inherently less certain about.
The sending layer treats LinkedIn like the fragile, adversarial environment it is. LinkedIn serves two entirely different profile page structures at random, so the messenger handles both, falls back from DM to connection-request-with-note when messaging is gated, detects Premium upsell modals, types with human cadence, and paces sends 90 seconds apart. A hard daily cap and a permanent contact log make over-messaging structurally impossible.
Orchestration is n8n end-to-end: schedule trigger, scrape, dedupe against existing Sheet rows, classify, append, send, and write outreach status back per lead — with retry logic on every network hop, and now a dedicated error-workflow that pushes an instant phone notification if a run ever dies, closing the one real reliability gap the system had. The Sheet is the CRM: one row per lead with post URL, classification, reasoning, the message sent, and current status.
We run this engine for our own pipeline every day, and we're honest about the yield: precision over volume means most days produce zero or one genuinely qualified lead out of dozens of posts scanned, with the majority correctly rejected as competitors, vendors, or noise. That's the deliberate trade-off — a lower-volume pipeline of real conversations beats a high-volume one nobody trusts. The same architecture adapts to any B2B service business whose customers describe their problems in public: swap the keywords, retune the rubric, keep the safety rails and the failure alert.



