Lead Machine n8n
Side project: an n8n lead machine for Zéro Degrés, a refrigerated transport company operating across Paris and the Île-de-France region. Every morning the workflow sweeps cold-chain businesses (bakeries, caterers, food labs, pharmacies…), cross-references Google Places with the French SIRENE company registry, deduplicates on the company ID, has an LLM score each prospect, writes the record to the CRM and fires a personalised email sequence. Self-hosted on Docker, GDPR-compliant by design.
// recruiter view
Side project built for Zéro Degrés, a refrigerated carrier in Paris and Île-de-France: replace the owner's manual evening prospecting with an n8n workflow that finds, qualifies and contacts prospects on its own. He no longer opens Google Maps — he opens a CRM already filled with scored records, with an opening email already sent to the hottest ones.
- ▸10 cold-chain sectors prospected automatically every morning across Paris and the 7 Île-de-France departments — bakeries, caterers, food labs, pharmacies, dark kitchens…
- ▸Two official sources cross-referenced (Google Places for the ground truth, SIRENE for the legal reality): no more ghost listings or closed businesses in the pipeline
- ▸Every prospect scored 0-100 on the criteria that actually drive the profitability of a refrigerated round — sector, zone, volume, opening hour, reachability
- ▸Personalised email sequence with D+4 and D+10 follow-ups, plus automatic reply reading: a quote request fires a real-time alert to the owner
- ▸Zero duplicates by construction: a prospect already approached cannot be contacted again, and any unsubscribe stops the sequence immediately
- ▸GDPR-compliant from the first line: B2B prospecting on public business data, opt-out honoured in the database, SPF/DKIM/DMARC for deliverability
The story behind
- Chapter 01
The observation
Zéro Degrés carries chilled, frozen and dry goods for professionals across Paris and Île-de-France, seven days a week. The offer stands up, the van runs — but prospecting happened in the evening, by hand, typing 'bakery Paris 11' into Google Maps and copying addresses into a spreadsheet. The problem was not commercial, it was mechanical: nobody had the time to do that work every single day.
- Chapter 02
Why n8n and not a script
I could have written a Python script in one evening. But the recipient is not a developer: the owner needed to see the pipeline, understand where it stalls, replay a failed run and adjust a target sector without calling me. The n8n canvas makes the automation readable and every execution inspectable one by one — that is what makes an internal tool survive past delivery.
- Chapter 03
One source was not enough
Google Places gives the ground truth: the business as it actually trades, its address, its hours, its reviews. But it also returns stale listings, closed shops and duplicates. SIRENE gives the legal reality: SIRET, NAF code, headcount, administrative status. Joining the two on the SIRET is the decision that moved the list from 'raw' to 'usable'.
- Chapter 04
The real problem: never contact twice
The trap in a lead machine is not finding companies, it is not re-soliciting the same ones. A single business appears under three spellings depending on the source, and the SIRET is sometimes missing. So I stacked two levels: in-run dedup on a SIRET key with a slug(name) + postcode fallback, then a PostgreSQL guard that queries the full contact history before any write. A prospect that entered once can never re-enter.
- Chapter 05
Encoding the cold-chain business into the scoring
A refrigerated carrier does not want 'prospects', it wants profitable stops on a round. So the scoring prompt carries the criteria that actually drive margin: sector first (a bakery opening at 5:30 am beats an office), then zone and density, volume signal, opening hour, reachability. The LLM weights and writes the pitch; hard exclusions stay in code, where they are verifiable.
- Chapter 06
Compliance as an architectural constraint
Cold email prospecting in 2026 without getting blacklisted takes discipline: B2B only, public business data, documented legitimate interest, one-click unsubscribe. Rather than restating it in a doc, I wired it in: the opt-out check node is a mandatory gate no send branch can bypass, and the IMAP workflow writes any unsubscribe to the database and cuts the sequence within the minute.
After going live
Monitoring & observability
Self-hosted n8n on Docker on a VPS, with the Executions view as the main dashboard and an error workflow pushing every failure to the ops channel — the owner sees the pipeline state without opening a terminal.
Stack
Tracked metrics
- ●Daily run status and duration (n8n Executions)
- ●Quota and error rate on Google Places / SIRENE calls
- ●New records kept per run after dedup
- ●Hot / warm / cold score distribution
- ●Incoming replies classified by intent (quote, interested, later, opt-out)
- ●Email bounce rate and opt-outs — deliverability watch
Production impact
Prospecting went from an evening chore done whenever energy was left, to a process that runs on its own before opening hours. The owner now arbitrates instead of searching.
- ▸The sales pipeline fills itself: no more manual Google Maps searching or copying addresses into a spreadsheet
- ▸Records arrive already scored and argued — human time goes to the callback and the quote, not to collection
- ▸The hottest leads receive their first email the same morning, instead of waiting for a free slot in the week
- ▸A quote request inside a reply fires a real-time alert: no opportunity lost at the bottom of an inbox
- ▸No duplicates and no follow-up after an unsubscribe — the domain's sender reputation is protected over time
- ▸The tool stays operable by a non-developer: adding a target sector or a zone happens in a single node
// results
// stack