Work01 — FeaturedAI · SaaS · Lead Generation

Kontakly GTM.

Moteur de prospection B2B autonome propulsé par l'IA qui trouve, qualifie et contacte les leads sans intervention humaine.

CLIENT
Nextise GmbH
ROLE
Full-Stack Engineer & DevOps
YEAR
2025
DURATION
6+ months (ongoing)
STATUS
In Production
kontakly
§01 — OVERVIEW
Kontakly GTM est une plateforme SaaS multi-tenant conçue sur mesure pour Nextise GmbH afin d'automatiser entièrement leur pipeline de prospection B2B. Le système fonctionne en autonomie complète : il scanne les principaux portails d'emploi allemands (dont la Bundesagentur für Arbeit et Freelancermap), qualifie chaque entreprise découverte via l'IA Google Gemini 2.5 Flash, enrichit les leads avec les coordonnées directes des décideurs en explorant leurs sites web, et pousse les prospects directement dans les files d'attente de campagnes d'e-mails à froid—le tout sans aucune action humaine. La plateforme prend en charge plusieurs axes de ciblage : l'axe 'solutions' (entreprises recrutant sur des postes automatisables), l'axe 'séminaires' (entreprises planifiant une adoption interne de l'IA), et la chasse aux projets de freelance (entreprises publiant des briefs d'automatisation). Chaque canal dispose de ses propres mots-clés, règles de tri, invites système d'IA et modèles d'e-mails pour maximiser le taux de conversion.
§02 — CHALLENGE

Le Bug de Dédoublonnement à Zéro Lead

Après les premiers cycles de traitement, les lancements suivants renvoyaient 0 lead. La cause était une requête de dédoublonnement trop agressive en base de données qui excluait toutes les entreprises déjà vues, y compris celles rejetées par l'IA. J'ai corrigé chirurgicalement la requête pour que seuls les prospects validés (is_prospect=True) bloquent les détections futures, maintenant les pistes rejetées visibles pour transparence dans le CRM sans polluer les scans.

Blocage Infini du Pipeline en Production (K8s Hangs)

L'étape d'enrichissement des contacts se bloquait indéfiniment sur le cluster Kubernetes. Avec 50 threads de crawling concurrents, une seule connexion TCP non fermée bloquait toute la file d'attente de ThreadPoolExecutor.map(). J'ai réécrit l'exécuteur pour appliquer des limites de temps strictes de 90 secondes sur chaque tâche Future et configuré un arrêt non bloquant avec cancel_futures=True, éliminant tout blocage.

Régression Silencieuse des Mots-Clés de Ciblage

Le scraper ABG retombait silencieusement sur les mots-clés génériques de l'axe solutions à cause d'une manipulation de sys.path capturée dans un bloc try/except. J'ai nettoyé les imports du projet en utilisant des imports relatifs Python standard, révélant la véritable erreur et rétablissant un ciblage dynamique précis par axe.

Perte Silencieuse de Leads en Exécution Parallèle

Lorsque les scrapers ABG et Freelancermap s'exécutaient en parallèle, le scraper ABG atteignait seul la limite de 250 leads. Une opération de découpe (slice) après fusion éliminait alors tous les leads de Freelancermap. J'ai supprimé cette limite globale superflue puisque chaque scraper gère déjà sa propre limite en amont.

§03 — THE BUILD
Active GTM dashboard showing real-time pipeline scraping and lead discovery stats
Dynamic track campaign editor with Gemini 2.5 Flash system prompt controls
Real-time lead enrichment logger crawling corporate website contact details
Tableau de bord GTM affichant les statistiques de scraping et de découverte en temps réel
§04 — APPROACH
La plateforme s'articule autour d'un pipeline autonome en 5 étapes : Scrape → Pre-sort → AI Qualify → Contact Enrich → CRM Push. Le scraping s'appuie sur une API REST pour ABG et un navigateur headless Playwright pour Freelancermap. Le pré-tri applique des filtres YAML (mots-clés d'exclusion, statuts juridiques) avant tout appel API d'IA. L'évaluation par IA exploite Google Gemini 2.5 Flash avec des instructions adaptées. L'enrichissement explore les pages de contact, Impressum et politiques de confidentialité, puis interroge Google Custom Search pour extraire l'adresse e-mail directe du décideur. Kontakly est conteneurisé sous Docker, déployé sur Kubernetes (DigitalOcean) derrière un contrôleur d'Ingress NGINX avec TLS, et géré par des pipelines CI/CD automatisés via GitHub Actions.
STACK
PythonFlaskMySQLGoogle GeminiPlaywrightKubernetesDockerGitHub Actions
§05 — OUTCOMES
5 étapes
Pipeline entièrement autonome, isolé et reprenable en temps réel
2 sources
Portails d'emploi allemands scannés en parallèle (ABG + Freelancermap)
4 axes
Axes de ciblage B2B optimisés (solutions, séminaires et freelance)
Quotidien
Lancements nocturnes automatisés avec verrou de sécurité de 23 heures
Décideurs
Extraction des contacts des décideurs avec validation d'e-mail directe
K8s
Déploiement en production sur cluster DigitalOcean Kubernetes
NEXT PROJECT
02 / 5
BarriereHilfe

Un écosystème d'accessibilité numérique en 3 tiers délivrant des solutions WCAG natives à grande échelle.