NEUROSERV

Le Registre, ou comment j'ai remplacé trois semaines de travail manuel par quatre agents.

L'architecture complète, les sources publiques utilisées, les trois erreurs qui ont façonné le code, et les règles que je me suis interdit de contourner. Rien n'est théorique, tout tourne.

Version 1 · Août 2026 Ihsan Assouma · Cotonou Lecture 8 minutes

Pourquoi ce système existe.

J'ai passé trois semaines sur un prospect dont le site renvoyait une erreur 503. Puis trois autres sur quelqu'un dont les boutiques tournaient exclusivement sur WhatsApp, sans catalogue, sans API, rien où se brancher.

Six semaines, deux fois la même faute : je n'avais jamais vérifié la plateforme avant d'investir mon temps. C'est une vérification qui prend quatre secondes quand une machine la fait, et que je n'ai jamais faite en six semaines.

Le principe qui gouverne tout le reste : chaque décision qui peut être prise à partir d'une donnée mesurable doit être prise par du code, avant qu'un humain n'y consacre une minute.

Les quatre agents.

Chacun fait une seule chose et écrit un fichier que le suivant lit. Aucun n'appelle un modèle de langage. Ce sont des scripts Python, et c'est volontaire : sur des données structurées, une règle explicite est plus fiable, plus rapide et plus vérifiable qu'une génération.

01 Le Rabatteur source-*.py

Il constitue la liste brute. Deux sources publiques, aucune base achetée.

  • AL'annuaire d'un organisme de labellisation. Le sitemap est déclaré dans le robots.txt, les fiches portent le nom, le site, le téléphone et l'email publiés par la marque elle-même. 328 marques.
  • BLe registre officiel des entreprises françaises. L'API publique de l'État, filtrée sur les codes NAF de la cosmétique. Elle donne le nom, le SIREN, le dirigeant, l'effectif. Elle ne donne pas le site web.

C'est ce dernier point qui demande le plus de travail. Le registre ne connaît pas les domaines, alors le script les dérive de la raison sociale, retire les formes juridiques et les mots vides, teste trois formes en .fr et en .com, vérifie le DNS, puis charge la page.

La vérification qui change tout. Ma première version acceptait un mot du nom trouvé n'importe où dans la page. Elle m'a ramené une page de vente de domaine et trois homonymes. Un mot courant apparaît dans n'importe quelle page française. Maintenant le nom doit apparaître dans le titre, le og:site_name ou le premier h1, là où un site se déclare.

Pour les emails, même règle : jamais devinés, jamais construits. Seulement ceux réellement publiés. Comme beaucoup de sites utilisent un formulaire plutôt qu'un lien, le script lit aussi les mentions légales, obligatoires en France et qui doivent porter un moyen de contact. Le taux d'emails trouvés est passé de 11 à 61%.

02 Le Trieur collecteur.py

Il ouvre chaque boutique et lit ce qui tourne dessous, à partir du HTML et des en-têtes de réponse.

Ce qu'il litCe qu'il en déduit
Signatures dans le HTMLShopify, WooCommerce, PrestaShop, Wix, Squarespace
En-têtes HTTPRattrape le Shopify en headless, invisible dans le HTML
Catalogue publicNombre de produits, prix médian, panier moyen estimé
Variantes indisponiblesTaux de ruptures réel, déclinaison par déclinaison
Scripts tiersChat déjà installé, outil de relance en place

Puis il note. CHAUD quand la plateforme est compatible et qu'aucun chat n'est installé. TIÈDE quand un chat existe déjà, le besoin est reconnu mais la vente devient une comparaison. À VOIR quand le site est vivant mais la plateforme indéterminée. ÉCARTÉ quand rien ne peut s'y brancher.

Le piège qui a fait tomber un lot entier. Un site lent lève un ReadTimeoutError d'urllib3, qui n'hérite pas de RequestException. Il traversait mon filtre et interrompait le traitement de 549 domaines. Dans un traitement par lot, aucune entrée ne doit pouvoir arrêter le passage. Un site injoignable est un résultat, pas une panne.
03 La Plume generateur-emails.py

Elle écrit une accroche par boutique, à partir des chiffres que Le Trieur a mesurés. Un seul angle par email, choisi selon le signal le plus fort. Empiler les arguments dilue.

  • 1Ruptures si le taux dépasse 12%. Le signal le plus concret, mesuré, vérifiable, directement lié à des ventes perdues.
  • 2Emailing sans chat. La marque paie pour relancer ceux qui sont partis, rien pour parler à ceux qui sont là.
  • 3Grand catalogue sans conseil. Au-delà de 80 produits, le choix devient un obstacle.
  • 4Hors horaires par défaut. Une semaine compte 168 heures, dont 40 ouvrées.
La règle inscrite en dur, en tête du fichier. Aucun chiffre de performance inventé. Les seuls chiffres autorisés sont ceux mesurés sur la boutique, ceux issus d'un calcul explicite, et un taux publié avec sa source nommée.

Ce n'est pas de la morale. J'ai envoyé treize messages LinkedIn en juillet avec des « +20 à 40% de conversion » que je n'avais mesurés nulle part. Zéro réponse sur treize. Un fondateur e-commerce repère une statistique fabriquée en trois secondes, et à ce moment tout le reste devient suspect.

Détail qui semble mineur et qui ne l'est pas : l'élision. Écrire « le catalogue de Absolution » trahit le publipostage à la première ligne. Une fonction de six lignes gère l'apostrophe devant voyelle et h muet.

def article(nom):
    return f"d'{nom}" if nom[:1].lower() in "aeiouyh" else f"de {nom}"
04 Le Greffier journal-envois.py · boite-mail.py

Il tient le registre et lit la boîte. Sans lui, la prospection se désagrège en trois jours : on relance quelqu'un qui a répondu, on oublie celui qui n'a rien dit, et on réécrit à une adresse qui a demandé à ne plus l'être.

Il se connecte en IMAP et classe chaque message entrant en six catégories : réponse réelle, demande de désinscription, rebond, défi antispam, réponse d'absence, et le reste.

Ce qu'il a trouvé et que je n'aurais jamais vu. Trois de mes emails étaient retenus par un antispam à défi, du type qui répond automatiquement « confirmez votre identité » et garde le message en quarantaine. Livrés nulle part. Ces trois marques n'auraient jamais reçu mon message, et je n'aurais jamais su pourquoi.

Il compare aussi le nombre de messages dans le dossier Envoyés au nombre enregistré au journal. Un écart signifie que des messages ne sont jamais partis.

Ce qu'il ne fait pas, et ne fera pas : répondre. Quand un prospect répond, c'est moi qui écris. C'est le seul moment de toute la chaîne qui décide de quelque chose.

Les trois erreurs qui ont écrit le code.

Chaque garde-fou de ce système existe parce que quelque chose est allé de travers. Aucun n'a été prévu à l'avance.

Err 01

Ne jamais laisser un cas particulier arrêter un lot

Un seul site lent a fait tomber le traitement de 549 domaines. La correction tient en un except volontairement large, avec le commentaire qui explique pourquoi il l'est.

Err 02

Ne jamais faire confiance au texte d'une source

Les titres de page d'un annuaire contenaient des entités HTML non décodées. L'ESSENTIEL partait tel quel dans l'objet de l'email. Le CSV ouvert dans un tableur ne le montrait pas. Décoder, normaliser la casse, puis relire à l'œil dix lignes au hasard.

Err 03

Ne jamais croire un script qui sort en code 0

Une automatisation LinkedIn a tourné pendant des jours en affichant « réussite » alors qu'aucun message ne partait, parce que le serveur qu'elle pilotait ne se connectait pas. Depuis, elle vérifie qu'un fichier de résultat existe, qu'il contient des actions, et elle échoue bruyamment sinon.

Ce que je me suis interdit.

RèglePourquoi
Aucune base achetéeUne liste achetée produit des rebonds, et un taux de rebond au-dessus de 3% fait chuter la réputation du domaine sans retour possible
Aucune adresse devinéeSeules les adresses professionnelles publiées sur un site ou un annuaire public sont retenues
Source et date conservéesChaque contact porte l'URL de la fiche d'où il vient et le jour du relevé
Désinscription en une ligneRépondre STOP suffit, et le traitement se fait dans l'heure
Aucun pixel de suiviIls dégradent la délivrabilité et la confiance, pour une mesure dont je n'ai pas besoin
Un seul lien par emailAu-delà, le message bascule du registre personnel au registre publicitaire
Montée en charge lente20 emails par jour la première semaine, sur un domaine dédié, jamais depuis une adresse personnelle

Ce que ce système n'a pas encore prouvé.

Je n'ai pas de client. Ce document décrit une machine qui fonctionne, pas un résultat commercial.

Ce que je peux montrer : 736 marques trouvées, 226 écartées automatiquement sur les 328 premières, 131 emails uniques rédigés depuis des mesures réelles, une note de 10 sur 10 en test de délivrabilité, 2 rebonds sur 71 envois, aucune plainte.

Ce que je ne peux pas montrer : un taux de réponse stabilisé, un coût d'acquisition, un client signé. Le calcul à rebours demande entre 1 600 et 6 000 emails pour dix clients. J'en suis à 71. Il est trop tôt, et je le dirai quand ce ne sera plus le cas.

Pourquoi je publie ça maintenant plutôt qu'après. Un système décrit pendant qu'il tourne se raconte avec ses erreurs. Décrit après un succès, il se raconte avec les erreurs effacées, et il ne sert plus à personne.

La suite du registre.

Je publierai la version 2 quand j'aurai des chiffres de conversion réels, ou quand j'aurai compris pourquoi il n'y en a pas. Les deux m'intéressent autant.

Écrivez-moi si vous voulez la recevoir, ou si vous construisez quelque chose de similaire et que vous vous êtes cassé les dents au même endroit.

ihsan@agentvente.com