4 min

40

The SDR Lead Machine

SDRs were spending too much time preparing outreach: finding companies and contacts, writing messages, following up by hand. I built a semi-automated system that detects, enriches, scores, assigns and tracks leads, from Scrapy to Microsoft Lists via n8n and GPT-4o-mini.

The problem

The sales work itself wasn’t the issue, but everything before it: finding companies and the right contacts, understanding their technical context, writing a message that doesn’t smell like a template, following up, tracking. Each task is doable by hand, which is why teams put off automating it.

The real goal

Not to automate prospecting end to end, but to prepare cleaner, faster, better-contextualized sales work. SDRs stay in control of sending, follow-up and sales decisions.

What I built

data → enrichment → scoring → generation → SDR interface → tracking

Starting data. A public API, the Tranco list and sector compilations: more than 50,000 French company websites. Many are inactive or off-target, and that’s expected: quality comes later.

Detecting competing tech. A Scrapy crawler looks in the HTML, scripts, cookies, headers and meta tags for traces of emailing, CRM, marketing automation and ticketing tools (Mailchimp, HubSpot, Brevo, Salesforce, Splio, Sarbacane, Weezevent, etc.). Out of about 50,000 sites, about 10,000 companies use a relevant tool. Detection gives a probability, not a certainty: shared scripts, dynamic loading. → How detection works in detail

Hunter.io enrichment. Sector, size, country, and sales contacts tied to the domain. Volume isn’t the goal: a bad contact wastes the SDR’s time.

Two business databases. For each competing tool, a list of pain points (deliverability, support, cost, segmentation, integrations…). And a database of customer references (sector, context, tool replaced, problem solved), so each message rests on credible proof rather than “we have customers in your sector.”

Scoring. Headcount (51 to 1,000 employees: +3), organization type (public company or government body: +3, association: +2), number of relevant contacts, priority competing tool. It’s not a prediction, it’s a sorting tool: when everything is interesting, nothing is.

The n8n workflow. It sorts by score, caps at 40 companies per week, removes duplicates, assigns evenly across the 3 SDRs, adds pain points and a customer reference based on tool and sector, generates a first message and a follow-up, creates the rows in Microsoft Lists and notifies the team in Teams.

n8n workflow "Contact info search and processing": schedule, sorting, sales assignment, AI agents, record creation, and notification.

Why 40 per week?

It’s not a technical limit. Too large a flow exceeds what SDRs can actually handle and ends up ignored. 40 well-prepared companies beat 200 poorly followed ones.

Generation. GPT-4o-mini via OpenRouter receives the company, the tool, its pain points, the chosen reference and tone constraints. It phrases, it doesn’t decide who to contact or with which argument: that’s the workflow’s business logic. For high-volume writing, its cost/performance ratio is very good.

The SDR interface. A shared Microsoft List, one row per company with contacts, messages and statuses (prospect, email, sales). Not glamorous, but filterable and already in the SDRs’ ecosystem. Power Automate handles each lead’s lifecycle: switch to en_cours, flip to non_repondu after 5 days, reply detection, closing as soon as a sales status is set, follow-up reminders.

Reporting. A Power BI dashboard makes the system manageable: tune scoring and thresholds, compare salespeople. Over the launch period:

KPI Value
Total leads ~2,000
Leads in progress 270
Closed leads 62
Refusals 7
Email errors 26
Off-target 31

What broke

  • Web data is dirty: errors, redirects, broken HTML, empty sites. It took cleaning steps I hadn’t planned.
  • Hunter.io doesn’t know every domain: little or no data, 404s, to handle without blocking the pipeline. I should have set a strategy from the start (retry, queue, exclude).
  • Scrapy signatures age: a competitor changes CDN or renames its scripts, and detection misses. It’s never finished.
  • Human alignment was the hardest part: getting SDRs to adopt the statuses, the handling rules and the way to read automatically generated leads.

That’s why the Teams notification matters as much as the code: number of leads, breakdown per salesperson, instructions on statuses and follow-ups, link to the list.

Teams message sent automatically when a new SDR batch is created, with per-salesperson breakdown and management guidelines.

If I did it again: normalize data earlier (case, encodings, duplicate domains), add structured logs and alerts from day one, and split the workflow into sub-workflows before it gets dense.

Key takeaways

I thought I was building a prospecting tool. Mostly I built an assembly: data, business rules, scoring, generation and an operational interface. Each brick is simple; the assembly creates the value, and a tool without clear instructions ends up abandoned.

Read next

4AI Detection of Business Signals: Building a Useful RevOps System2Automatically Enriching Lemlist Contacts with Apollo via n8n2 hBuilding a Multi-Source Competitive Intelligence Pipeline with Trustpilot, LinkedIn, and the Web