SignalScout : de la prospection sourcée, ou un champ vide

Un outil de recherche B2B qui transforme un CSV de leads en accroches d'e-mails à froid, chacune avec une URL source, une date et un niveau de confiance. Quand il ne sait pas, il ne dit rien.

Client
Nuits
Année
2026
Statut
En ligne
Rôle
Fondateur solo, Design produit, Ingénierie, Systèmes IA
Stack
Astro 7, Cloudflare Workers, Cloudflare D1, Durable Objects, Turnstile, OpenRouter, Exa, Firecrawl, Polar, Resend, Sentry
SignalScout : de la prospection sourcée, ou un champ vide

Le contexte

SignalScout est un produit B2B commercial de Nuits, mon studio d’une personne à Helsinki. Vous téléversez un CSV de leads. Vous récupérez une accroche de prospection pour chacun, et à côté de chaque accroche se trouvent l’URL d’où elle vient, la date de cette source, et le degré de confiance du système dans le lien entre les deux.

Si la recherche n’a rien donné d’exploitable, le champ revient vide. Il ne revient pas plausible.

Le problème

Tous les outils de prospection à l’IA que j’ai essayés avaient le même mode de défaillance, et ce n’était un bug chez aucun d’eux. Demandez une accroche personnalisée et vous en obtenez une. Toujours. Il n’existe aucune entrée pour laquelle la chose dit qu’elle ne sait pas. Vous recevez donc un paragraphe très sûr de lui sur une levée de fonds qui ne s’est jamais conclue, adressé à une personne qui ne l’a pas levée, et vous mettez votre propre nom en bas et vous appuyez sur envoyer.

Le coût est asymétrique. Générer la phrase coûte une fraction de centime. L’envoyer coûte votre réputation auprès du seul prospect que vous vouliez vraiment. Personne ne valorisait ça correctement, surtout parce qu’une cellule vide a l’air d’un produit cassé et qu’une cellule fabriquée a l’air d’un produit qui marche.

Mon rôle

Tout. Nuits n’a jamais embauché personne.

Ça veut dire le positionnement, le modèle de prix, l’interface, les états vides, les agents de recherche, le banc d’évaluation, l’intégration de facturation, les e-mails transactionnels, les tableaux de bord d’erreurs et la phrase, sur la page tarifs, qui admet que la recherche par IA peut se tromper. Je l’ai conçu et je l’ai écrit. Il n’y a personne à qui refiler le texte inconfortable.

L’approche

J’ai conçu l’état vide avant de concevoir quoi que ce soit d’autre. Pas comme un cas limite : comme l’écran principal. Si le produit a l’air juste et calme quand il n’a rien trouvé, le reste de l’interface peut être honnête sans avoir à s’excuser.

À partir de là, la forme a suivi. Chaque affirmation en sortie porte une provenance sur laquelle l’acheteur peut cliquer. La confiance est une propriété des preuves, pas un nombre que j’ai demandé à un modèle d’inventer à son propre sujet. Et le prix devait être au lead plutôt qu’au siège, parce qu’un prix au siège punit exactement l’opérateur soigneux qui envoie quarante bons e-mails au lieu de quatre mille mauvais. Les packs de crédits sont à 19 $, 79 $ et 249 $.

La construction

Ça tourne sur Astro 7 déployé sur Cloudflare Workers. D1 détient les comptes, les registres de crédits et les enregistrements de jobs. Chaque lot de recherche reçoit un Durable Object, et c’est la pièce qui rend le produit possible tout court : un lead prend des dizaines de secondes à rechercher correctement, un CSV de deux cents prend un moment, et un Durable Object survit à la fermeture de l’onglet par l’utilisateur. Turnstile garde l’endpoint de téléversement pour que le chemin coûteux ne soit pas gratuit pour des inconnus.

La recherche se fait en trois étapes, et c’est cette séparation qui constitue tout le design. Une étape de récupération utilise Exa pour la recherche neuronale et Firecrawl pour aller chercher et extraire les pages trouvées, en renvoyant des documents candidats accompagnés de leurs URL et de leurs dates de publication. Une étape de rédaction ne voit que ces documents et n’a le droit de faire référence à rien d’autre. Une étape de notation relit ensuite chaque affirmation générée face au texte source et jette tout ce qu’elle ne peut pas y localiser. La confiance est calculée après coup à partir de la fraîcheur des sources et du fait que des sources indépendantes concordent ou non, si bien que le modèle ne corrige jamais sa propre copie.

Les modèles arrivent par OpenRouter, ce qui me permet de router par étape plutôt que par produit. L’extraction et la classification tournent sur quelque chose de peu cher et de rapide, parce que c’est là qu’est l’essentiel du volume de tokens. Seule la phrase finale, une fois par lead, part vers un modèle cher. Le coût par lead reste assez prévisible pour qu’on puisse fixer un prix en face, ce qui est la vraie raison de cette séparation.

Les modes de défaillance sont la partie intéressante. La collision d’entités est la pire : deux entreprises portent le même nom, la récupération renvoie les deux, et l’accroche décrit la mauvaise de façon convaincante. La correspondance de domaine et un contrôle de même entité dans l’étape de notation en attrapent l’essentiel. Les sources périmées viennent en deuxième : un communiqué de presse de trois ans est techniquement vrai et socialement désastreux, donc l’âge alimente directement la confiance. Les paywalls et les murs anti-robots produisent des extractions partielles qui se lisent comme des extractions complètes, ce que la notation traite comme une absence plutôt que comme une preuve.

Polar gère les paiements en tant que marchand de référence, donc la TVA européenne est le travail de quelqu’un d’autre. Resend envoie les reçus et les notifications de fin de job. Sentry attrape ce que je n’avais pas prévu, ce qui fait une liste plus longue que je ne le voudrais.

Le résultat

C’est en ligne et ça vend des crédits. La sortie laisse des champs vides, et la page tarifs indique clairement que la recherche par IA peut se tromper, ce qui est une chose étrange à mettre à côté d’un bouton d’achat et la raison pour laquelle je fais confiance à ce bouton d’achat.

Ce que je ferais autrement

J’ai construit le pipeline en trois étapes avant d’avoir un jeu d’évaluation, donc pendant le premier mois « mieux » n’était qu’une impression. J’aurais dû étiqueter cent leads à la main dès le premier jour et obliger chaque changement de prompt à faire ses preuves face à eux.

J’ai aussi fixé le prix des packs de crédits avant de connaître mon vrai coût par lead. Le palier à 19 $ était optimiste. J’aurais préféré livrer un seul prix, mesurer pendant un mois, puis construire l’échelle.