Contexte
L'European Accessibility Act entre en application en juin 2025. À partir de cette date, des dizaines de milliers de sites européens deviennent légalement obligés d'être conformes WCAG 2.1 AA — sous peine d'amendes par pays (jusqu'à 50k€/an pour les collectivités françaises au titre du RGAA).
J'ai construit EEL pour automatiser l'identification de ces sites non conformes, générer des rapports personnalisés, et les transformer en prospects qualifiés. Le pipeline complet va du scraping public à l'envoi d'email A/B testé, en passant par la génération HTML du rapport et son hébergement sur Cloudflare.
Le challenge métier
Un audit d'accessibilité manuel coûte 3 000 à 8 000€ et prend 2 à 5 jours par site. Impossible de prospecter à grande échelle dans ces conditions. EEL résout ce problème en automatisant intégralement le pré-audit : chaque prospect reçoit un rapport individualisé avec son score, ses violations critiques, et l'amende applicable à son pays — le tout pour un coût marginal proche de zéro.
Le flow opérationnel — en 9 étapes
EEL transforme un CSV de prospects en signaux d'intérêt qualifiés. Chaque étape passe le flambeau à la suivante sans intervention humaine — c'est ce qui permet de scanner et adresser 30 prospects par jour de façon répétable :
- 1. Acquisition — import du CSV (22k+ collectivités INSEE enrichies, ou entreprises EU).
- 2. Crawl — découverte des pages du site cible (sitemap + suivi des liens internes, max 5 pages).
- 3. Scan parallèle — 5 moteurs WCAG lancés simultanément (axe-core, Lighthouse, pa11y, IBM, QualWeb).
- 4. Normalisation — cross-reference max-per-tool avec niveaux de confidence (high/medium/low selon le nombre de moteurs qui détectent la violation).
- 5. Analyse contextuelle — GPT-4o-mini lit le HTML pour repérer les vrais blocages métier (formulaires inaccessibles, panier KO, etc).
- 6. Génération du rapport — HTML personnalisé FR/EN avec 3 variants d'angle (legal, business, competitive).
- 7. Hébergement — push sur Cloudflare Pages, URL unique par prospect (
eel.moonlist.tech/rapport/...). - 8. Cold email — push Instantly v2 avec 54 templates A/B (9 angles × 2 langues × 3 steps J0/J+3/J+7).
- 9. Signal de retour — le clic sur l'une des 3 URLs renvoie l'angle qui a résonné — donnée précieuse pour la suite du funnel.
CSV 22k+ prospects INSEE"] A --> B["2. Crawl
sitemap + liens internes"] B --> C["3. Scan parallèle
axe-core / Lighthouse / pa11y / IBM / QualWeb"] C --> D["4. Normalisation
cross-reference max-per-tool"] D --> E["5. Analyse contextuelle
GPT-4o-mini sur HTML"] E --> F["6. Rapport HTML
3 variants (legal / business / competitive)"] F --> G["7. Hébergement Cloudflare Pages
URL unique par prospect"] G --> H["8. Cold email Instantly v2
54 templates A/B en 3 steps"] H --> I["9. Signal de retour
click URL = angle qui résonne"]
Stack technique
- Puppeteer (headless Chrome)
- axe-core, Lighthouse, pa11y
- IBM accessibility-checker
- QualWeb
- Cross-reference max-per-tool
- Niveaux high/medium/low confidence
- GPT-4o-mini pour contexte HTML
- HTML responsive FR/EN
- 3 variants (legal / business / competitive)
- Cloudflare Pages + domaine custom
- Instantly API v2 (Bearer token)
- 54 templates A/B (9 × 2 × 3 steps)
- Dashboard Express.js pour orchestration
3 décisions d'architecture clés
1. Cross-reference "max-per-tool" plutôt que somme
Premier bug rencontré : la somme naïve des violations des 5 moteurs donnait 2 003 violations pour un seul
site — chiffre absurde car les moteurs détectent souvent les mêmes problèmes. La logique
max(violations par outil) donne 584 violations
dédupliquées, avec un niveau de confiance hiérarchisé : si 5/5 outils détectent un problème = high confidence,
1/5 = low confidence.
2. Trois versions du rapport, indexées par "clé d'angle"
Pour le même prospect et la même donnée brute (score WCAG, violations détectées), le système génère trois fichiers HTML distincts stockés sur Cloudflare Pages avec une URL chacun. Chaque version est un rendu indexé par une clé d'angle marketing :
- clé
legal— rapport orienté risque réglementaire : amende Arcom/EAA, échéances, jurisprudence par pays. - clé
business— rapport orienté manque à gagner : SEO impacté, conversion perdue, accessibilité = part de marché. - clé
competitive— rapport orienté benchmark : score du prospect comparé à celui d'un concurrent identifié.
Les trois URLs sont insérées dans la séquence email à des emplacements différents (J0 / J+3 / J+7 par exemple). Quel lien le prospect clique = quel angle a résonné chez lui. C'est une donnée précieuse réinjectée dans le funnel pour les relances suivantes ou pour qualifier le lead.
3. Pool collectivités séparé via API Service Public
Pour la France, j'ai créé un pipeline distinct qui extrait les 22 184 collectivités françaises
(EPCI, départements, régions, mairies) depuis l'API api-lannuaire.service-public.gouv.fr,
les enrichit avec INSEE (population, code postal), puis les batche par 30/jour pour passer sous les filtres
anti-spam d'Instantly. C'est une vraie cible B2G avec un argumentaire spécifique (amende Arcom + FIPHFP).
Résultats
Lien direct avec Salesforce
EEL est un mini-Marketing-Cloud doublé d'un Sales Cloud. Voici la cartographie 1-pour-1 :
- Pool 22 184 collectivités = Lead Database Salesforce avec champs custom (population, code INSEE, type EPCI).
- Score WCAG 0-100 multi-moteurs pondérés = Lead Scoring avec règles déclaratives + champs formula.
- 54 templates A/B (9 angles × 2 langues × 3 steps) = Marketing Cloud Journey Builder avec branches conditionnelles.
- Rapports HTML auto-générés stockés sur Cloudflare = Reports & Dashboards Salesforce + Files attachment.
- Click sur URL = signal d'angle = Web-to-Lead avec Custom Field "argument_qui_resonne".
- Batch 30/jour sous filtres anti-spam = Apex Scheduled Job avec gouverneurs respectés.
Lessons learned (honnêtes)
- La somme naïve des moteurs WCAG était absurde — j'aurais dû lire la doc des outils avant de coder. Leçon : RTFM avant le clavier.
- Instantly v2 ne te dit pas pourquoi tes warm-ups sont bloqués — j'ai perdu une semaine sur un compte mal configuré côté SPF/DKIM. Leçon : la délivrabilité email se prépare en amont, pas en aval.
- Le pool collectivités a un cycle de décision très long — il faut accepter que la conversion ne sera pas dans le mois. Adapter le funnel et les KPIs en conséquence.
- Un cold email "B2G" doit parler humain, pas process — mes premiers emails étaient trop techniques. Le 2e jet, plus citoyen, performait 3x mieux.