Attention, l’image ci-dessus n’a rien à voir avec le contenu de l’article. Mais je l’aime bien moi, cette illustration. Pas vous ?

L’IP Reverse : exploitez votre trafic non-converti !

… ou comment j’ai codé un mini-Clearbit pour transformer des simples visiteurs en Leads.

Puisque j’ai l’honneur d’avoir été invité à commencer cette série d’articles sur le Growth, j’ai décidé de vous partager un outil fait maison que l’on m’a souvent demandé d’expliquer plus en détails. C’est notamment sous l’impulsion d’influenceurs Growth français comme Guillaume Cabane, qui a fait le choix de partager ses meilleurs hacks, mais aussi d’entrepreneurs comme Carlos Diaz qui a récemment réveillé mon esprit patriotique 🇫🇷 et m’a convaincu du bienfait de partager ce processus avec la communauté française. Profitez-en, ça vient de sortir ✌.

Dans mon activité de freelance, je passe une bonne partie de mon temps à mettre en place des processus d’acquisition de trafic. Mais une autre facette de mon travail correspond à optimiser ce trafic, et c’est peut-être la plus importante. Il faut garder en tête que, bien souvent, 1% de taux de conversion supplémentaire valent mieux que 20% de trafic en plus. J‘ai donc créé un outil qui me permet, chaque matin, de récupérer les noms d’entreprises et emails d’une partie du trafic perdu la veille. Et d’envoyer automatiquement ce rapport par mail à l’équipe commerciale.

Les données ci-dessus sont des exemples fictifs.

Vous le savez peut-être, Google Analytics ne permet pas d’accéder à l’IP des visiteurs. Difficile donc de faire de l’IP Geolocation. Pour ça, il faudra compter sur des services comme Clearbit : grâce aux adresses IPs de vos visiteurs, ils déterminent l’adresse email et le nom de la société d’éventuels prospects. L‘outil est génial et tout le monde s’accorde à dire qu’il est générateur de leads. Il coûte, en revanche, à partir de 1 000€/mois. Bien au delà du budget Marketing mensuel que la plupart des start-ups peuvent se permettre d’allouer. C’est pour ça que j’ai codé ce mini-Clearbit pour permettre aux start-ups que j’accompagne d’identifier et relancer plus facilement des visiteurs non-convertis.


Disclaimer: J’ai décidé de passer l’outil en open-source, il n’a donc aucunement vocation à rivaliser avec un service professionnel comme Clearbit. Avant de vous lancer dans la mise en place, comprenez bien que, de par son fonctionnement, ce script est uniquement efficace sur du trafic B2B.

J’ai fait en sorte de vulgariser et de vous accompagner au maximum sur la mise en place de l’outil, même si vous n’avez jamais écrit une ligne de code vous devriez être capable de l’implémenter en moins de deux heures.


Dans un premier temps, voilà ce dont vous allez avoir besoin pour que tout fonctionne bien :

Obligatoire :

  • Un serveur privé (type VPS) pour planifier l’exécution de la tâche toutes les nuits. Pour la suite du tutoriel, je vais utiliser un VPS OVH à 2€/mois.
  • Un VPN pour éviter de se faire blacklister votre IP sur Google. Ca serait dommage, non ? Personnellement, j’utilise NordVPN.
  • L’accès au compte Google Analytics de votre entreprise.

Optionnel :

  • Votre CRM sur Pipedrive pour que le script puisse vérifier que les Leads n’existent pas déjà.

Générer le rapport Google Analytics

Pour récolter les données qui nous intéressent commençons par installer le plug-in Google Analytics. Ouvrez une nouvelle feuille Spreadsheet dans Google Drive, puis rendez-vous dans “Add-ons” > “Get Add-ons…”

Ou “Modules complémentaires” pour la version française.

Recherchez et installez “Google Analytics”

Une fois le plug-in installé, créez un nouveau rapport comme ceci:

Je vous laisse renseigner le nom que vous souhaitez, ça n’a pas d’importance. Assurez-vous d’être sur la bonne propriété/vue et choisissez les Metrics qui vous intéressent, personnellement je ne sélectionne que “Users” car je regarde le reste du rapport directement sur Google Analytics. Vous pourrez changer ces metrics quand vous le souhaitez. L’important ici c’est de bien choisir “Service Provider” en dimension :

Vous devriez arriver sur l’onglet ci-dessous:

Le tableau de bord des rapports, chaque rapport correspond à une colonne. Ici nous n’avons qu’un rapport.

Modifiez la cellule B4 et écrivez ‘yesterday’ à la place de ‘30daysAgo’.

On planifie ensuite la génération de ce rapport, tous les jours entre minuit et une heure du matin:

Add-ons > Google Analytics > Schedule Reports
Le rapport est généré tous les jours entre minuit et une heure du matin.

Vous pouvez cliquer sur “Run a report” (dans ‘Add-on’ -> ‘Google Analytics’) pour voir le rendu et faire un premier test. Tous les jours cette page sera donc actualisée entre minuit et une heure du matin, avec la liste de nos utilisateurs de la veille trié par le nom de leur fournisseur internet. Enfin, créez un nouvel onglet intitulé “Report” et laissez le vide pour l’instant, c’est dans cet onglet que nous allons venir écrire notre rapport.

Attention, l’ordre des onglets doit toujours être le même :

Envoyer le rapport par mail

Bien que nous ne traitons pas encore les données récupérées, nous allons anticiper un peu et mettre en place l’envoi automatique par email de ce que l’on va récolter.
Rendez-vous dans “Tools” > “Script Editor”.

Une fois dans l’éditeur de script, rendez vous dans “Resources” > “Libraries” pour ajouter le plugin “SheetConverter” qui va nous permettre d’envoyer notre tableau par e-mail.

Dans le champ ‘Add a library’ inscrivez la clé du plugin “SheetConverter” :

Mo6Ljr7ZKrMeYO9mHqOdo9oxc-w7mEonb

Sélectionnez la dernière version et sauvegardez.
Copiez/collez maintenant le script qui va vous permettre d’envoyer les données récoltées par email, vous pouvez le retrouver en intégralité ici :

https://github.com/gvdh/Daily-traffic-report/blob/master/spreadsheet.js

Il ne vous reste plus qu’à renseigner vos emails à la place de “EMAIL1”, “EMAIL2”, le nom de l’onglet si vous n’avez pas mis “Report” et de renseigner l’URL de votre rapport entier dans la variable “full_report” (vous pouvez mettre un lien vers Google Analytics, ou vers le rapport original etc…). Le champ CC est facultatif.

Pour être honnête, je n’ai pas eu le temps de m’étendre sur le style. N’hésitez pas à contribuer sur le projet Github en proposant quelque chose de mieux ! Pour l’instant, je vous ai laissé le style css que j’applique à l’email (stocké dans les variables first, second & third), vous pouvez bien sûr le modifier à votre guise.

Pour appeler cette méthode, et donc envoyer les mails, nous pouvons nous contenter d’une simple requête GET sur notre script. Pour ça sauvegardez le fichier puis rendez-vous dans ‘Publish > Deploy as a web app’

Attention ici, plusieurs points à prendre en compte. Il faut absolument republier une version à chaque changement sur le script, pour cela il faut sélectionner “New” dans “Project version”. Ensuite, n’oubliez pas de rendre le script accessible à “Anyone, even anonymous” pour que votre serveur puisse effectuer une requête dessus . Voici ce que donne la configuration chez moi :

Copiez le lien “Current web app URL”, vous en aurez besoin plus tard.

Installation et mise en place de votre serveur

Avant d’intégrer le code qui va vous permettre de traiter les données récupérées, il faut lui fournir un serveur pour qu’il puisse s’exécuter automatiquement tous les jours. Que votre ordinateur soit ouvert ou non.

Comme précisé en introduction, la suite de l’exemple se base sur un VPS OVH à 2€/mois. Pas de panique si vous souhaitez utiliser un autre fournisseur, sachez juste que les commandes que je vais écrire sont adaptées à un serveur qui tourne sur Debian 9 (Stretch) (en version 64 bits).

Pour les plus novices d’entre vous, je vous invite à partir sur le même serveur que moi. La localisation a peu d’importance (pour l’exemple, j’ai pris un serveur à Singapour) puisque l’on utilisera des IPs françaises pour nos recherches. L’important c’est de bien sélectionner Debian 9 en tant que système d’exploitation. Attention une fois la commande passée il faut à peu près 1/2h pour recevoir ses identifiants de connexion par mail.

Par défaut, le nom d’utilisateur est toujours root. C’est l’administrateur “suprème”.

Pour se connecter je vous laisse consulter la documentation OVH. Normalement rien de bien compliqué mais cela dépend de votre système d’exploitation. Sur Mac, je n’ai qu’à effectuer la requête suivante dans mon terminal:

ssh root@mon_ipv4

On vous demandera alors d’autoriser la connexion au serveur, puis de renseigner votre mot de passe.

Le script que l’on va faire tourner est en Ruby, vous allez donc devoir l’installer. Une fois connecté à votre serveur, écrivez-ceci dans votre terminal :

apt-get update
apt install ruby

Puis répondez “Y” lorsque l’on vous demande de confirmer l’utilisation de mémoire :

Vous venez d’installer Ruby, c’était rapide non ? Vous pouvez le vérifier en écrivant “ruby -v” :

Installez maintenant les dépendances requises pour faire fonctionner le script :

apt install curl

puis :

apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
apt-get install libmariadbd-dev

et enfin :

curl -OL https://raw.githubusercontent.com/gvdh/Daily-traffic-report/master/Gemfile
gem install bundler
bundle install

L’environnement Ruby est installé, nous allons maintenant créer la base de données MySQL.

Création de la base de données

A chaque traitement de la donnée que l’on récupère, nous allons stocker des informations sur une base de donné mysql. Cela nous permet de conserver toutes les informations traitées et d’augmenter le temps d’exécution de l’outil.

On commence par installer le client mysql sur notre serveur :

sudo apt-get -y install mariadb-server mariadb-client
sudo mysql_secure_installation

Lors de la configuration, après avoir mis le mot de passe que vous souhaitiez, vous pouvez répondre “n” à toutes les questions posées.

Pour la suite je vous invite néanmoins à sécuriser votre base, sans m’étendre sur le sujet vous pourrez trouver plus d’informations ici.

Connectez-vous en écrivant :

mysql -u root -p

Créez ensuite votre base de données :

CREATE DATABASE reversing CHARACTER SET utf8;

Puis signalez à mySQL que vous souhaitez maintenant l’utiliser :

USE reversing; 

Et créez maintenant la table suivante :

CREATE TABLE reversed (
original_name VARCHAR(80),
name VARCHAR(80),
domain VARCHAR(80),
position_1_name VARCHAR(80),
position_1_mail VARCHAR(80),
position_2_name VARCHAR(80),
position_2_mail VARCHAR(80),
number_of_visits SMALLINT,
pipedrive_url VARCHAR(80)
);

Voilà, votre base SQL est prête à être utilisée ! Courage, vous avez fait le plus dur. On va maintenant compléter le script pour qu’il puisse fonctionner.

Mise en place du script

Pour finir, nous allons préparer le code qui s’exécutera tous les jours pour générer les informations que l’on recherche.

Rendez-vous sur le repository Github du projet :

https://github.com/gvdh/Daily-traffic-report

Commencez par cliquer sur ‘Star’ en haut à droite de la page (c’est très important pour la suite). Copiez ensuite l’intégralité du code que vous trouverez dans “reversing.rb” dans votre éditeur de texte préféré (Sublime Text par exemple) sur votre ordinateur. Il y a pas mal de champs que vous allez devoir remplir et l’éditeur de texte par défaut d’un serveur, VIM, peut vite vous perdre. Ne vous inquiétez pas je vous montrerais ensuite comment copier un fichier de votre ordinateur à votre serveur.

Voici comment fonctionne le script :

Rien à modifier ici. On commence par faire appel aux dépendances qui nous intéressent. Open-Uri et net/https sont présents par défaut dans l’environnement Ruby et nous permettent d’effectuer des requêtes sur les internets. Mysql2 nous permet d’interagir avec une base de données, Nokogiri facilite le traitement du contenu des pages que l’on récupère, et je pense que le terme google_drive est assez explicite.

Ensuite on configure via des variables constantes les identifiants de votre VPN favori. Personnellement je tourne sur NordVPN. On renseigne également les positions que l’on va rechercher lors de la récupération d’emails. Si vous souhaitez changer les positions recherchées parmi vos prospects, écrivez les à la place de ‘CTO’ et ‘CEO’. La ligne 12 ne sert qu’à configurer l’encodage des requêtes que l’on enverra auprès de Google.

Que soyez développeur ou non, vous pouvez voir ici le cheminement du script. On commence par récupérer la donnée présente sur le spreadsheet. C’est pour ça que l’on a déjà installé la gem ‘google_drive’. Pour que cela fonctionne, vous allez devoir créer un fichier ‘config.json’ avec vos clés d’identification Google, pas de panique tout est très bien expliqué ici dans la partie “On behalf of you”:

Une fois votre fichier config.json crée et placé dans le même répertoire (Documents, par exemple) que le fichier “reversing.rb”, on récupère les données via la méthode “parsing_spreadsheets” :

Changez ici la partie {{YOUR_KEY_URL}} par l’ID de votre spreadsheet. Concrètement, vous le retrouverez dans l’URL après https://docs.google.com/spreadsheets/d/… Par exemple :

https://docs.google.com/spreadsheets/d/KEY_SPREADSHEET/edit#gid=98783798

Les deux onglets sont stockés dans la variable ‘sheets’ que l’on va passer en paramètre de notre méthode ‘going_through_regex’. Cette méthode fait passer chacune des lignes de notre rapport par une Regex qui regroupe les noms des différents FAIs afin de ne garder que les noms d’entreprise potentielles.

Croyez-moi, le vrai cadeau ici c’est cette Regex, elle fait presque 5.000 caractères car je l’alimente au fur et à mesure. Vous pouvez la retrouver en intégralité ici : https://raw.githubusercontent.com/gvdh/Daily-traffic-report/master/isp_regex. N’hésitez pas à y rajouter des noms de FAIs en faisant une pull request sur le projet Github, le but étant de ne rester qu’avec des noms d’entreprises !

On effectue maintenant une recherche sur la base de données mySQL que vous avez précédemment créée. Si une entreprise était déjà présente, on ne ré-effectuera pas toutes les requêtes et on récupèrera les données déjà stockées pour les inscrire dans le rapport. Remplissez les champs {{YOUR_USERNAME}} et {{YOUR_PASSWORD}} qui correspondent à vos identifiants SQL créés un peu plus tôt.

Par défaut votre username sera ‘root’ et votre mot de passe ‘password’. Pensez à les modifier !

On effectue la même recherche sur le compte Pipedrive de votre entreprise, vous pouvez ré-adapter cette méthode avec un autre CRM. Pensez-ici à remplir les champs YOUR_API_KEY et YOUR_COMPANY_NAME.

Si vous n’avez pas Pipedrive vous pouvez simplement commenter la méthode pour ne pas l’utiliser, comme ceci :

Pour la suite, vous allez avoir besoin des adresses IPs de votre VPN préféré. Vous pouvez soit les stocker manuellement dans la variable “@ips” soit faire appel à la méthode “getting_ips” qui reproduit la requête Ajax qu’effectue NordVPN pour proposer les serveurs recommandés.

Attention: il vous faudra un abonnement chez NordVPN si vous souhaitez utiliser leur IPs. Le cas échéant vous pouvez renseigner manuellement les IPs de votre VPN dans une variable @ips comme ceci :

Si vous souhaitez utiliser un autre VPN.

Jusqu’ici tout va bien, non ? On vient de stocker le nom des entreprises potentielles qui nous intéressent et récupérer celles que l’on connaissait déjà. C’est un bon début. On va maintenant corser un peu tout ça en appellant la méthode “searching_domains” pour essayer de trouver leur noms de domaine respectifs. Rien à modifier ici.

On arrive dans le côté un peu plus complexe du code. Une recherche Google est effectuée sur chacune des potentielles entreprises identifiées. Si la première URL obtenue correspond à une entreprise enregistrée sur l’API gratuite Autocomplete Clearbit alors on stocke le nom de domaine et la raison sociale.

Vous remarquerez peut-être les sleep() de 150 secondes et l’itération sur l’IP utilisée. Concrètement, on effectue une requête sur Google toutes les 2,5 minutes avec une IP différente, et ce pour trois raisons:

  • La plupart des VPNs ont des quotas de connexion/comptes, dans le cas de NordVPN ce quota équivaut à une connexion toutes les 2,5 minutes.
  • Google n’est pas très friand du scraping de ses pages de résultats, on évite donc le spam.
  • Il n’est pas impossible de tomber sur une IP blacklistée. Si la requête échoue le script va re-tenter sa chance avec toutes les IPs avant de s’avouer vaincu.

L’inconvénient c’est que cette méthode ralentit considérablement l‘exécution du code. Gardez bien en tête qu’il est conçu pour tourner de manière quotidienne et surtout la nuit. Dans mon cas, il tourne sur un trafic quotidien de ~250 new users/jours et il dure généralement 2h00. Le rapport arrive donc aux alentours de 03h00 du matin. C’est aussi pour ça que vous avez implémenté une base de données mySQL: pour ne pas ré-effectuer les requêtes sur des entreprises qui seraient déjà passées et donc accélérer la vitesse d’exécution du script.

Une fois que nous avons nos noms de domaines, on peut commencer à obtenir les noms des personnes recherchées selon les positions que l’on a renseigné dans les premières ligne du script. On appelle donc la méthode “searching_names”:

Rien à modifier ici non plus. Une recherche Google pour chacune des positions et, si l’entreprise a bien été identifiée, on devrait récupérer le nom de la personne en poste. La recherche d’e-mails peut commencer !

On va utiliser un petit hack qui peut nous permettre de savoir gratuitement si un email existe ou non. Attention cette astuce ne fonctionne que sur Google Suite.

Rien à modifier. Pour chaque entreprise avec un nom de domaine et le nom d’une personne en poste, on envoie une requête à l’URL suivant :

https://mail.google.com/mail/gxlu?email={email}

Sans rentrer trop dans le détail, si l’e-mail existe Google nous renvoie un cookie dans le header, si il n’existe pas Google ne renvoie pas de cookie. C’est aussi simple que ça : pas de mail, pas de cookie. 🍪

On teste donc une trentaine de combinaisons différentes (par exemple nom.prénom@nomdedomaine.fr) jusqu’à ce que l’on trouve un email.

Si vous souhaitez étendre la recherche aux mails hors Google Suite, vous pouvez effectuer recherche via une API de collectes d’emails, par exemple avec Voilanorbert. Par défaut cette méthode n’est pas appelée dans le code, pour l’utiliser il vous suffit d’enlever le # en face de cette ligne (Attention l’accès à l’API de Voilanorbert est payante) :

Une fois que cela est fait, le script appellera la méthode “searching_through_voilanorbert” si aucun e-mail n’a été trouvé précédemment.

Encore une fois, n’oubliez pas de remplir les champs entre {{ }}.

Il ne nous reste plus qu’à stocker les données récoltées dans notre base de données grâce à la méthode “storing_database” :

Cette méthode contient aussi un compteur de visites assez basique qui vous permettra d’identifier plus facilement les entreprises qui reviennent régulièrement.

Enfin, on vient écrire nos résultats sur le spreadsheet pour préparer l’envoi des e-mails à travers la méthode “storing_spreadsheets”:

Ca y est ! Les données sont sauvegardées dans notre troisième onglet.

On termine par l’envoi du rapport par e-mail via la méthode “sending_report”.

Ici on va faire appel au script que vous avez mis en place au début de cette article. Rappelez-vous, lors du déploiement de la Web APP, Google Script Editor vous a donné le lien d’accès à votre application. Recopiez le simplement à la place de ‘YOUR_WEB_APP_URL’.

Récapitulons, dans le script vous avez dû renseigner :

  • Vos identifiants de connexion VPN.
  • La key URL de votre spreadsheet.
  • Les identifiants de la base SQL installée sur votre serveur.
  • L’api key et nom de votre entreprise sur Pipedrive OU commenter la méthode.
  • L’url de votre Web App sur Google Script Editor.

Une fois que vous avez renseigné tous les champs du script vous pouvez envoyer le fichier sur votre serveur. Pour cela rien de plus simple :

scp /chemin/reversing.rb root@IPserver:~/reversing.rb

Vous allez également avoir besoin de copier le config.json, contenant vos identifiants Google Drive, que vous avez crée plus tôt :

scp /chemin/config.json root@IPserver:~/config.json

Par exemple pour un utilisateur Mac qui a mis ses fichiers dans Documents:

Programmer le lancement du script

On touche au but ! Pour ne pas avoir à lancer le script tous les jours, il ne nous reste plus qu’à configurer un planificateur de tâches qui exécutera notre tâche tous les jours à la même heure.Pour cela, j’utilise la gem Wheneverize (que l’on a installé plus tôt dans la partie “Installation et mise en place de votre serveur”. Pour l’installer rien de plus simple, sur votre serveur rendez-vous dans le répertoire où se trouve l’application :

cd ~/

puis écrivez :

wheneverize .

Cette commande va créer un fichier “config/schedule.rb”. Pour lancer le script tous les jours à 01:05 AM, écrivez ceci:

echo -e "set :output, '~/file.log'\nevery 1.day, at: '1:05 am' do\n command 'ruby  ~/reversing.rb'\nend" > ~/config/schedule.rb

(Attention, selon la configuration de votre serveur vous pouvez être amener à changer l’heure ci-dessus, vous pouvez vérifier l’heure de votre serveur en écrivant “time”.)

suivi de

 whenever — update-crontab

Voilà ! Le script sera exécuté tous les matins à 01:05 am, juste après la génération du rapport par le plugin google analytics que nous avons installé plus tôt.

Dernière chose, nous allons nous authentifier auprès de Google pour être sûr d’avoir accès à notre spreadsheet à chaque fois. Sur votre serveur, écrivez :

irb

Pour lancer la console Ruby. Nous allons simuler l’ouverture d’un client comme ceci :

require 'google_drive'
session = GoogleDrive::Session.from_config("config.json")

Google va ensuite vous demander de vous connecter à une page et de lui donner en retour le code d’autorisation :

Après vous être connecté vous devriez tomber sur votre code d’autorisation :

Renseignez-le, puis activez l’API google drive sur la page suivante :

Rassurez-vous, c’est terminé ! Vous avez tout mis en place, bravo 💪 ! Si vous êtes sceptique, vous pouvez tester le fonctionnement en exécutant la commande suivante :

cd ~/
ruby reversing.rb

Comme mentionné au début de cet article, j’ai décidé de mettre l‘intégralité du code en open-source sur Github. N’hésitez donc pas à y contribuer et/ou à m’apporter des feedback. Je ne peux pas vous garantir d’avoir le temps d’y apporter des modifications, puisque tout roule chez moi, mais sait-on jamais.

Quoiqu’il arrive, gardez toujours en tête que ce ne sont que des suppositions effectuées par un script, et qu’il est toujours préférable de regarder le rapport entier avant d’envoyer un e-mail.

Si vous avez une question n’hésitez pas à la poster en commentaire ou à me joindre sur la Slack Growth France. Si vous utiliser l’outil et/ou souhaitez remercier, je suis intéressé par vos retours d’expériences en commentaire ou par message privé.

N’hésitez pas non plus à montrer votre soutien en clappant ou partageant l’article (sur Medium vous pouvez clapper jusqu’à 50 fois, voir 100 pour certains comptes). Je passerais d’autres outils similaires en open-source si je vois que ça peut servir à certains 👍 !