Trouve des établissements en France sans site web via l'API Google Places, puis envoie automatiquement un email de prospection depuis ton Outlook.
⚠️ Le pipeline est en 2 étapes car Google Places ne fournit pas d'email. L'étape 1 collecte nom / adresse / téléphone / lien Maps. Tu complètes la colonne
cd C:\Users\louey\maps-prospector
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt- Va sur https://console.cloud.google.com/ → crée un projet.
- Active « Places API (New) » et active la facturation (crédit gratuit mensuel généreux ; au-delà c'est payant — surveille ta conso).
- Crée une clé API (APIs & Services → Credentials).
- Copie
.env.exampleen.envet colle ta clé :
Copy-Item .env.example .env
notepad .envÉdite config.py : CITIES, CATEGORIES (villes et métiers visés).
python collect_leads.py➡️ Crée data/leads.csv (uniquement les établissements sans site web).
Relance autant que tu veux : les doublons sont ignorés.
collect_leads.py laisse la colonne email vide : Google ne fournit jamais
l'email, et comme ces commerces n'ont pas de site, il n'existe pas de source
automatique fiable. Tu la complètes donc toi-même.
Le plus rapide : depuis le dashboard. Chaque ligne a des liens cliquables qui pré-remplissent une recherche avec le nom + la ville :
- 🔎 Google (« nom ville email contact »),
- f Facebook (les pros y affichent souvent un email),
- PJ Pages Jaunes (fiche annuaire).
Tu cliques → tu trouves l'email → tu le colles dans la colonne email de
data/leads.csv → tu recharges la page (touche R).
💡 Tu as déjà les téléphones : pour un pitch « vous n'avez pas de site », un appel convertit souvent mieux qu'un email froid.
Les lignes sans email valide sont automatiquement ignorées à l'envoi.
Renseigne ton identité dans config.py (SENDER_NAME, SENDER_PHONE, …) —
c'est obligatoire pour la conformité.
python send_emails.py --dry-run # 1) simulation, ne rien envoyer
python send_emails.py --limit 5 # 2) test réel sur 5 emails
python send_emails.py # 3) envoi (limite = DAILY_SEND_LIMIT)Sécurités intégrées : anti-doublon (data/sent_log.csv), limite par exécution,
pause entre chaque envoi, mention d'identité + désinscription dans l'email.
Une interface web pour tout suivre et tout piloter depuis les boutons :
streamlit run dashboard.pyou double-clic sur lancer_dashboard.ps1. Ça ouvre le navigateur sur
http://localhost:8501.
Le dashboard affiche :
- Compteurs : Total, En attente, Envoyés, Réponses, STOP, Erreurs.
- Graphe des emails envoyés par jour.
- Tableau filtrable des prospects avec leur statut (⏳ en attente · 📤 envoyé ·
✅ répondu · 🛑 STOP ·
⚠️ erreur · ✉️❓ email manquant). - Boutons (barre de gauche) : Collecter · Vérifier les réponses · Simuler · Envoyer (avec case de confirmation pour l'envoi réel).
| Statut | Source |
|---|---|
| En attente / Envoyé / Erreur | data/leads.csv croisé avec data/sent_log.csv |
| Répondu / STOP | data/replies.csv, généré par python check_replies.py |
check_replies.py scanne ta boîte de réception Outlook et marque comme
« Répondu » tout établissement contacté qui t'a écrit, et « STOP » si le message
contient un mot de désabonnement. Lance-le régulièrement (ou via le bouton).
- Prospection B2B en France : autorisée sans consentement préalable si le message concerne l'activité professionnelle du destinataire et qu'il peut s'opposer facilement (règle CNIL). Le template inclut identité + « STOP ».
- RGPD : tu constitues un fichier de contacts → tu dois pouvoir répondre aux demandes de suppression. Traite les réponses « STOP » sans délai.
- Volume : garde des limites basses (défaut 30/exéc., 45 s d'intervalle) pour éviter d'être classé spam et de faire bloquer ta boîte Outlook.
- CGU Google : on utilise l'API officielle (pas de scraping du site Maps).