Système de prospection automatisée qui audite silencieusement chaque prospect avant de générer un email ancré sur un fait vérifié, pas sur une formule générique.
Troisième itération d'un système de prospection construit chez Tol Product Lab, après deux versions précédentes qui reposaient sur le crawl du site prospect et l'analyse de son code source par un modèle IA. Argus remplace cette étape par un appel gratuit à l'API PageSpeed de Google.
Ce dépôt documente l'architecture et le fonctionnement du système. Les workflows n8n eux-mêmes ne sont pas publiés ici.
- Fiche projet complète — contexte, décisions d'architecture, résultat d'un run test
- Article de build — pourquoi le crawl IA a été abandonné, ce que ça a changé, le piège rencontré en production
Le système est découpé en trois workflows n8n indépendants, chacun avec sa propre responsabilité et son propre déclencheur :
| Workflow | Rôle | Déclencheur |
|---|---|---|
| Lead Generator | Collecte, dédoublonnage, audit, génération des emails | Formulaire n8n, à la demande |
| Mail Sender | Envoi programmé des emails J0 et J5 | Cron n8n |
| Deliverability Cron | Suivi des réponses et mise à jour du statut des prospects | Cron n8n |
Cette séparation permet de relancer une collecte de prospects sans jamais interférer avec les envois en cours, et de faire tourner le suivi de délivrabilité indépendamment du reste.
Trois feuilles Google Sheets structurent l'ensemble du système.
Une seule ligne, relue à chaque exécution de Mail Sender.
| Colonne | Rôle |
|---|---|
sender_name |
Nom utilisé en signature dans chaque email envoyé |
sender_activity |
Activité de l'expéditeur, utilisée dans le prompt de génération |
tone |
Ton imposé à l'ensemble des emails générés (ex. tutoiement professionnel) |
performance_threshold |
Seuil en dessous duquel un score de performance PageSpeed est jugé faible |
seo_threshold |
Seuil en dessous duquel un score SEO PageSpeed est jugé faible |
service-seo, service-devweb, service-refonte |
Description libre du service correspondant à chaque problème détectable, utilisée pour l'email J5 |
sending-now, sending-after |
Deux créneaux horaires quotidiens (HH:MM) auxquels Mail Sender est autorisé à envoyer |
La base active, une ligne par entreprise qualifiée avec email.
| Colonne | Rôle |
|---|---|
title, website, phone, email, city |
Identité et coordonnées du prospect |
searchString |
Recherche Google Maps d'origine |
reviewsCount, googleNote |
Nombre d'avis et note Google, quand disponibles |
seo_score, performance_score, LCP |
Résultat brut de l'audit PageSpeed |
subject |
Objet de l'email, généré une fois pour la séquence |
j0, j5 |
Contenu généré des deux emails de la séquence |
j0_date, j5_date |
Date d'envoi effective (J0) ou date cible (J5), au format ISO |
sending_log |
Marqueur d'étape (ex. j0:sended) utilisé pour piloter le passage au J5 |
status |
Statut de délivrabilité (SENT, FINISHED, ou statut Gmail brut en cas de rebond) |
messageId, threadId |
Identifiants Gmail du message et du thread, utilisés par Deliverability Cron |
Les entreprises identifiées sans email public. Colonnes volontairement réduites, aucune donnée liée à l'envoi n'y figure jamais.
| Colonne | Rôle |
|---|---|
title, website, phone, city |
Identité et coordonnées connues |
searchString |
Recherche Google Maps d'origine |
reviewsCount, googleNote |
Note Google et nombre d'avis, quand disponibles |
Point d'entrée du système, déclenché manuellement via un formulaire n8n (mots-clés, ville, limite de résultats).
Vue d'ensemble du workflow : collecte Apify, dédoublonnage, audit PageSpeed, génération des emails.
- Collecte — un acteur Apify (Google Maps Scraper) recherche les entreprises correspondant aux critères et retourne, en un seul appel, identité, contact, note Google et nombre d'avis.
- Extraction de l'email — le meilleur email disponible est choisi, en excluant les adresses génériques (
info@,contact@,no-reply@, etc.) quand une alternative existe. - Dédoublonnage — chaque résultat est comparé aux bases Prospects et Reserve existantes. Toute entreprise déjà connue, contactée ou non, est ignorée.
- Tri par email — sans email, l'entreprise est écrite dans Reserve et sort du pipeline. Avec email, elle continue vers l'audit.
- Audit PageSpeed — pour chaque prospect avec un site, un appel à l'API PageSpeed Insights retourne les scores de performance, de SEO et le LCP. Un délai de 5 secondes est appliqué entre chaque appel pour rester sous les limites de requêtes de l'API.
- Détection du problème dominant — les scores sont comparés aux seuils définis dans Configuration (
performance_threshold,seo_threshold) pour déterminer un problème unique parmi trois : pas de site, site lent, site mal référencé. - Génération des emails — un appel à Google Gemini (node Basic LLM Chain) génère le contenu des emails J0 et J5 à partir du problème détecté, du ton configuré, de la note Google et du nombre d'avis quand ils existent. La date cible du J5 (aujourd'hui + 5 jours) est calculée à cette étape.
Exemple de sortie réelle, générée par le modèle gratuit configuré par défaut (Google Gemini), sans retouche manuelle sur le texte :
Objet : Vitesse de chargement de [Cabinet comptable], Lyon
J0 : [Cabinet comptable] bénéficie d'une excellente image à Lyon avec une note de 4.8 sur 361 avis clients. Cette réputation solide contraste toutefois avec l'expérience technique actuelle de votre site web. Lors d'un test récent, j'ai constaté qu'il faut 36.3 secondes pour que le contenu principal s'affiche à l'écran. Ce délai semble en décalage avec le professionnalisme que reflètent vos témoignages clients. Avez-vous déjà eu des retours de vos visiteurs concernant la fluidité de navigation sur votre interface ?
J5 : Je reviens vers vous car un temps de chargement de 36.3 secondes pénalise directement votre référencement et vos chances de convertir de nouveaux prospects à Lyon. [...]
Cette génération vient de Google Gemini, un modèle gratuit. Aucune retouche manuelle sur le texte.
- Écriture — le résultat complet (contenu, sujet, dates, scores) est écrit dans Prospects.
Déclenché par un cron n8n, indépendant de la collecte.
Vérification du créneau, sélection J0/J5, envoi séquentiel et journalisation.
- Vérification du créneau — l'heure actuelle est comparée aux colonnes
sending-*de Configuration. Le workflow s'arrête immédiatement si l'heure ne correspond à aucun créneau autorisé. - Sélection des envois du jour — deux lots sont constitués séparément :
- J0 : prospects sans
j0_date, sanssending_log, sansmessageId, limités à 10 par exécution - J5 : prospects dont le
sending_logvautj0:sended, dontj5_datecorrespond à aujourd'hui, et dont lestatusest toujoursSENT(donc sans rebond ni désabonnement entre-temps)
- J0 : prospects sans
- Envoi séquentiel — chaque lot est traité en boucle, un email à la fois, avec un temps d'attente entre chaque envoi Gmail pour limiter le débit.
- Composition du message — le corps de l'email correspond au contenu
j0ouj5du prospect, selon le lot en cours, suivi de la signaturesender_name. - Journalisation — après envoi,
messageId,threadId, le statut Gmail et la date d'envoi (j0_dateouj5_date) sont réécrits dans Prospects, etsending_logpasse àj0:sendedouj5:sended.
Le plafond de 10 envois par lot et la vérification de créneau horaire limitent volontairement le débit d'envoi, plutôt que d'envoyer tout le volume disponible d'un coup.
Déclenché par un cron n8n séparé, sur les prospects au statut SENT.
Lecture des threads Gmail et mise à jour du statut de délivrabilité.
- Lecture — récupération de tous les prospects Prospects dont le
statusvautSENT. - Vérification du thread — pour chaque prospect, le thread Gmail correspondant (
threadId) est relu. - Détermination du statut — si le thread contient plus d'un message, une réponse a été reçue et le statut passe à
FINISHED. Sinon, le statut resteSENT. - Écriture — le nouveau statut est réécrit dans Prospects.
Ce workflow ne gère pas explicitement les rebonds et désabonnements dans la version documentée ici. La logique de coupure de séquence sur status différent de SENT est appliquée en amont, dans la sélection J5 du Mail Sender : un statut modifié entre le J0 et la date cible du J5 exclut automatiquement le prospect du second envoi.
Recherche d'agences immobilières à Lyon, France, limite de 20 résultats. Chiffre d'un run isolé, pas une moyenne mesurée dans le temps.
12 prospects qualifiés avec email, sur 20 entreprises trouvées. Emails et téléphones masqués.
- 20 prospects trouvés
- 12 qualifiés avec email, entrés en circuit d'envoi
- 8 sans email, déposés en base Réserve
- 24m 48s de traitement total, de la recherche à la génération des emails
- Pas de troisième email de relance
- Pas de contact par SMS
- Pas d'analyse du contenu du site au-delà des scores PageSpeed
- La note Google et le nombre d'avis ne servent qu'à enrichir le copy du J0, jamais à prioriser ou scorer les prospects entre eux
Eyitola Sagbohan — AI Automation Engineer, Product Developer, Indie Hacker. Tol Product Lab conçoit des systèmes d'automatisation et des produits digitaux pour les marchés francophones.