ooligo
n8n-flow

Turn website de-anonymization signals into ICP-filtered warm outreach with n8n

Difficulty
intermédiaire
Setup time
1-2 hours
For
revops · sdr
RevOps

Stack

Un flow n8n qui capte les visiteurs de site web identifiés au niveau de la personne depuis Warmly et RB2B via leurs webhooks sortants, note chaque personne identifiée selon un barème ICP configurable, écarte tous ceux qui ne correspondent pas, déduplique sur une fenêtre hebdomadaire, interroge Salesforce pour un contact existant et toute action en cours qu’il vaut mieux ne pas perturber, achemine le survivant vers le propriétaire du compte ou vers un pool de SDR de territoire, demande à Claude de rédiger une première prise de contact chaleureuse ancrée sur la page précise que la personne a consultée, et livre le contexte — brouillon inclus — sous forme de notification Slack accompagnée d’un Lead ou d’une Task Salesforce. Le bundle situé à apps/web/public/artifacts/visitor-deanon-to-outreach-n8n/ fournit l’export n8n complet ainsi qu’un _README.md couvrant l’import, les variables d’environnement, la configuration des identifiants, le barème ICP et la vérification par branche.

When to use this

Utilisez-le lorsqu’un outil de dé-anonymisation résout déjà votre trafic anonyme en personnes nommées, mais que le flux brut est inexploitable. RB2B pousse chaque visiteur américain identifié dans un canal Slack sans aucun filtre ICP ; en une semaine, les représentants cessent de le lire parce que la plupart des identifications sont des chercheurs d’emploi, des étudiants, des concurrents et des personnes situées à trois niveaux de votre acheteur. L’Autopilot de Warmly peut agir sur les visites, mais c’est une boîte noire payante sur le palier à 30 000 $/an et il rédige sans voir les opportunités ouvertes de votre CRM. Le symptôme est le même dans les deux cas : des visiteurs identifiés qui correspondent exactement à votre ICP reçoivent le même traitement que le bruit, si bien que personne n’agit vite sur ceux qui comptent.

Ce flow s’intercale entre l’outil de dé-anon et le représentant. Il applique votre barème ICP — fonction du poste, niveau de séniorité, tranche de taille d’entreprise, liste de pays autorisés et intention de page — dans un seul nœud Code que l’équipe ops peut lire et modifier, de sorte que les seuls visiteurs qui atteignent un représentant sont ceux qui méritent une prise de contact chaleureuse. Parce que la dé-anon vous donne une personne et la page qu’elle a consultée, le brouillon de Claude peut faire référence à « vous consultiez la page tarifs » plutôt qu’à une douleur générique du secteur. Cette précision est tout l’intérêt d’agir sur une visite de site web plutôt que sur une liste froide.

C’est aussi le bon schéma lorsque vous utilisez à la fois Warmly et RB2B, ou que vous prévoyez de remplacer l’un par l’autre. Le nœud Normalize Visitor Payload gère les deux formes de webhook ainsi qu’un repli générique, de sorte que la logique d’acheminement, de filtrage et de rédaction en aval ne se soucie pas du fournisseur qui a déclenché.

When NOT to use this

Passez votre chemin si votre outil de dé-anon n’est pas configuré pour envoyer des webhooks sortants. Warmly (Settings → Webhooks) comme RB2B (Integrations → Webhook / Zapier) prennent en charge les webhooks temps réel au niveau de la personne, mais si vous ne les avez pas activés, il n’y a rien à ingérer, et les replis par polling qui fonctionnent pour les données d’intention au niveau du compte n’existent pas pour les révélations au niveau de la personne.

Passez votre chemin si votre volume d’identification est faible et que votre taux de correspondance ICP est déjà élevé. Le palier Standard de RB2B résout environ 250 visiteurs identifiés par mois ; si la plupart sont déjà dans l’ICP parce que votre trafic est étroitement ciblé, un filtre ICP et une couche de suppression CRM ajoutent une infrastructure dont vous n’avez pas besoin — le push Slack que fournit RB2B suffit.

Ne l’utilisez pas pour inscrire automatiquement les visiteurs identifiés dans une séquence froide. Il serait trivial de câbler le brouillon directement dans Instantly ou Smartlead, et c’est exactement le geste agressif qui fait signaler les domaines d’envoi. Une visite de site web n’est un consentement à rien. La conception rédiger-sans-envoyer maintient un humain entre la révélation et l’envoi, ce qui compte davantage pour la dé-anon au niveau de la personne que pour l’intention au niveau du compte, parce que la correspondance est une identité probabiliste, non un formulaire rempli — la précision de RB2B elle-même tourne autour de 50-70 % sur le trafic ICP américain, et la résolution au niveau du compte de Warmly se situe autour de 15-25 % des visiteurs.

Enfin, ce n’est pas un contrôle de conformité. Il peut restreindre la prise de contact à une liste de pays autorisés dans le gate ICP, mais restreindre le snippet au trafic américain dans Warmly/RB2B, passer les personnes identifiées dans votre liste de suppression et examiner le traitement CA/VA/CO/CT avec un conseil juridique se font tous en dehors de n8n.

Setup

  1. Importez le bundle. Déposez apps/web/public/artifacts/visitor-deanon-to-outreach-n8n/visitor-deanon-to-outreach-n8n.json dans n8n via Workflows → Import from File. Un seul point d’entrée : un webhook à /webhook/visitor-deanon sur lequel Warmly et RB2B publient tous deux.

  2. Définissez les variables d’environnement. Le flow utilise des variables d’environnement pour les seuils ICP (ICP_MIN_EMPLOYEES, ICP_MAX_EMPLOYEES, ICP_COUNTRY_ALLOWLIST, ICP_TITLE_ALLOWLIST, ICP_TITLE_DENYLIST), l’instance et le token Salesforce, ainsi que les trois emails de pool SDR et handles Slack. La liste complète et l’emplacement de chaque valeur figurent dans _README.md. Chaque variable possède un repli intégré au code afin que le flow ne lève jamais d’erreur sur une valeur manquante — mais les valeurs par défaut sont volontairement génériques, définissez-les donc avant la mise en production.

  3. Câblez les identifiants. Trois identifiants sont requis :

    • PLACEHOLDER_ANTHROPIC_CRED_ID — HTTP Header Auth avec x-api-key réglé sur votre clé Anthropic
    • PLACEHOLDER_SLACK_CRED_ID — HTTP Header Auth avec Authorization: Bearer xoxb-…
    • PLACEHOLDER_SALESFORCE_CRED_ID — HTTP Header Auth avec Authorization: Bearer <sfdc_token> (ou un identifiant OAuth Connected App pour la production)
  4. Pointez les webhooks vers n8n. Dans Warmly, ajoutez votre URL https://<your-n8n-host>/webhook/visitor-deanon sous Settings → Webhooks. Dans RB2B, utilisez l’intégration Webhook (ou un « Catch Hook » Zapier redirigeant vers la même URL). Aucun identifiant n’est stocké dans n8n pour l’un ou l’autre fournisseur — ils poussent vers vous.

  5. Ajustez le barème ICP. Ouvrez ICP Fit Gate et lisez le bloc de notation. Il attribue des points pour la fonction du poste, le niveau de séniorité, la tranche de taille d’entreprise, le pays et l’intention de page, et laisse passer toute personne au niveau ou au-dessus de ICP_FIT_THRESHOLD (par défaut 3). Ajustez les pondérations de points et le seuil à votre définition de la correspondance avant l’activation.

  6. Vérifiez chaque chemin. Suivez la vérification dans _README.md : publiez un payload clairement dans l’ICP (doit passer et rédiger), un payload clairement hors ICP (doit être écarté au gate), et le même payload dans l’ICP deux fois (le second doit être écarté à la dédup). Exécutez le test de dédup contre le webhook en direct, non contre le bouton Execute Workflow — les données statiques ne persistent que lors des exécutions en production.

What the flow does

Webhook — Visitor Deanon Ingest accepte les requêtes POST et renvoie immédiatement un 202 via Respond 202 Accepted afin que l’appelant du webhook du fournisseur ne soit pas bloqué sur l’appel au LLM. Normalize Visitor Payload est un nœud Code qui détecte la source par la forme du payload — RB2B (identifié par ses champs Business Email / Captured URL), Warmly (identifié par son imbrication contact-plus-entreprise) et un repli générique — et associe chacun à un enregistrement interne unique avec des champs cohérents : firstName, lastName, title, company, domain, email, linkedinUrl, employeeCount, industry, country, pageViewed et referrer. Le champ pageViewed provient du Captured URL de RB2B et du referrer de signal de Warmly — c’est ce qui rend le brouillon chaleureux plutôt que froid.

ICP Fit Gate est le nœud qui distingue ce flow d’un simple routeur d’intention. Il note la personne selon un barème : la fonction du poste par rapport à une allowlist (revops, sales, marketing, growth, founder, product) et une denylist (student, intern, seeking, agency recruiter) ; la séniorité (C-level, VP, Head, Director marquent plus de points) ; la tranche de taille d’entreprise entre ICP_MIN_EMPLOYEES et ICP_MAX_EMPLOYEES ; le pays par rapport à ICP_COUNTRY_ALLOWLIST ; et l’intention de page (une vue de /pricing, /demo ou /product ajoute des points). Si le total est inférieur à ICP_FIT_THRESHOLD, le nœud renvoie un tableau vide et l’exécution s’arrête silencieusement — la personne n’atteint jamais un représentant. Le fitScore et les raisons sont attachés à l’enregistrement afin que la carte Slack d’un visiteur qui passe montre pourquoi il s’est qualifié, et afin qu’un barème mal configuré soit auditable.

Dedup Gate (Static Data) utilise les données statiques de workflow de n8n — $getWorkflowStaticData('global') — pour conserver une clé par personne et par semaine (dedup_<email-or-linkedin>_<ISO-week>). L’échelle hebdomadaire est la bonne fenêtre pour une prise de contact chaleureuse : quelqu’un qui visite votre site trois fois en cinq jours doit générer une seule prise de contact représentant, non trois. Cet objet est la seule façon correcte de persister un état inter-exécutions depuis un nœud Code — l’API REST publique de n8n n’a pas de ressource de données statiques — et le nœud estampille la clé avant tout appel en aval afin que deux révélations concurrentes pour la même personne ne puissent pas passer toutes deux, et élague les clés des semaines antérieures pour que le stockage reste petit.

Salesforce — Contact Lookup interroge un Contact correspondant à l’email de la personne, renvoyant le Contact Id, l’Account Id, le Owner (Id, Name, Email, Slack_Handle__c) et deux signaux de suppression : si le compte a une Opportunity ouverte et si le contact est déjà dans une séquence active (via un champ Current_Sequence__c). Routing & Suppression Logic décide alors. Si le contact existe et qu’un signal de suppression quelconque est positionné — opportunité ouverte, séquence active ou un type de compte client existant — le nœud renvoie un tableau vide : une prise de contact chaleureuse de dé-anon perturberait une action en cours, elle est donc écartée et journalisée. Sinon, si le contact existe, le pic est acheminé vers le propriétaire du compte et le flow créera une Task sur le contact existant. Si aucun contact n’existe — le cas de dé-anon courant, puisque tout l’intérêt est de faire remonter des personnes pas encore dans votre CRM — il est acheminé vers un pool de SDR de territoire (AMER/EMEA/ROW selon le pays) et le flow créera un Lead. Le nœud règle createSObject sur Task ou Lead en conséquence.

Claude — Draft Warm First Touch publie vers l’API Anthropic avec claude-haiku-4-5, un timeout de 8 secondes et neverError: true. Le system prompt bannit le remplissage (« I noticed », « reach out », « touch base », « circle back ») et demande à Claude d’ancrer l’accroche sur la page précise consultée et le rôle de la personne — parce que « saw you were on the pricing page » est actionnable et « I’d love to connect » ne l’est pas. Parse Draft (with fallback) gère un timeout ou un JSON malformé en produisant un brouillon basé sur un modèle marqué draftSource: template-fallback ; les deux chemins produisent draftSubject, draftBody et draftTalkingPoint. Slack — Notify Assignee publie une carte Block Kit dans #visitor-deanon avec le nom de la personne, son titre, son entreprise, son URL LinkedIn, la page qu’elle a consultée, le fitScore et les raisons, ainsi que le brouillon étiqueté « edit before sending ». Salesforce — Create Record POST vers /sobjects/{{ createSObject }} — un Lead pour les personnes inédites, une Task liée au contact existant via WhatId sinon — avec OwnerId réglé uniquement sur un vrai Salesforce User Id (jamais un email, qui renvoie MALFORMED_ID) et omis lors de l’acheminement vers un pool.

Cost reality

Par visiteur identifié qui franchit le gate ICP, claude-haiku-4-5 reçoit environ 500 tokens d’entrée et produit autour de 150 tokens de sortie pour le brouillon à trois champs. Au tarif Haiku 4.5 (~0,80 $/M en entrée, ~4 $/M en sortie), cela représente environ 0,0007 $ par brouillon. Le gate ICP fait le confinement des coûts : si le palier Pro de RB2B fait remonter ~1 000 visiteurs identifiés par mois et que votre barème en laisse passer 30 %, vous rédigez ~300 fois par mois — moins de 0,25 $/mois de dépense Claude. La fenêtre de dédup signifie qu’un visiteur récurrent est facturé une fois par semaine, non par visite.

L’outil de dé-anon est le vrai poste de dépense, non l’automatisation. RB2B va de 159 $/mois (~250 visiteurs identifiés) à 499 $/mois (~1 000) ; les plans payants de Warmly commencent à 15 000 $/an et sa suite Autopilot complète est à 30 000 $/an. n8n auto-hébergé est gratuit ; n8n Cloud Starter à 20 $/mois couvre 5 000 exécutions, gérant confortablement ~300 visiteurs rédigés à ~9 nœuds chacun. L’usage de l’API Salesforce est d’une requête plus une création par visiteur qui passe — quelques centaines d’appels par mois contre une limite Enterprise de 15 000+/jour. Le bot Slack et le point de terminaison webhook n8n sont gratuits.

Failure modes

  • Le barème ICP écarte silencieusement tout le monde. Un seuil trop strict ou une allowlist de titres qui passe à côté de la façon dont vos acheteurs écrivent réellement leurs titres (p. ex. « RevOps » en sous-chaîne de denylist attrapant accidentellement « Revenue Operations ») signifie que chaque visiteur échoue au gate et que le canal #visitor-deanon reste silencieux — ce qui se lit comme « pas de trafic » alors que c’est en réalité « filtre mal configuré ». Garde-fou : ICP Fit Gate attache le fitScore et les raisons par règle à chaque enregistrement, et la vérification du _README.md inclut la publication d’un payload connu dans l’ICP et la confirmation qu’il passe. Surveillez le taux de passage la première semaine ; s’il est proche de zéro sur du trafic réel, assouplissez le barème.

  • Les données statiques de dédup ne persistent que lors des exécutions en production. Dedup Gate (Static Data) lit et écrit $getWorkflowStaticData('global'), que n8n ne sauvegarde que lorsque l’exécution est déclenchée en production — jamais lors d’une exécution manuelle Execute Workflow. Tester la dédup en cliquant deux fois sur Execute Workflow fait paraître le gate cassé alors qu’il fonctionne. Garde-fou : activez le workflow et faites un POST vers l’URL du webhook en direct deux fois ; le second POST doit être écarté à la dédup. Le nœud élague les clés de la semaine précédente à chaque exécution, de sorte que le stockage se nettoie de lui-même.

  • Le brouillon s’adresse à la mauvaise personne. La dé-anon au niveau de la personne est probabiliste — l’identification de RB2B est précise à ~50-70 % sur le trafic ICP américain — de sorte qu’un brouillon peut saluer un nom qui n’est pas réellement celui qui a visité. Garde-fou : le flow n’envoie jamais. La carte Slack commence par l’URL LinkedIn afin que le SDR vérifie l’identité en un clic avant d’éditer et d’envoyer, et le brouillon est étiqueté comme un point de départ dans le system prompt comme dans le message Slack.

  • La rotation du token Bearer Salesforce bloque les lookups. Un token Bearer brut dans SFDC_ACCESS_TOKEN tourne (toutes les ~2 heures sur les orgs sans politique de session persistante). À son expiration, Salesforce — Contact Lookup renvoie 401 silencieusement (à cause de neverError: true), si bien que chaque visiteur paraît inédit et est acheminé vers un pool en tant que Lead — contournant discrètement la suppression. Garde-fou : surveillez une série de créations de Lead sans aucune création de Task alors même que vous savez que des contacts existants visitent ; pour la production, remplacez le token brut par une Connected App utilisant le flux OAuth 2.0 client-credentials. Le _README.md couvre cela.

vs alternatives

vs Warmly Autopilot. L’agent propre de Warmly peut qualifier et prendre rendez-vous à partir d’une visite, et si vous payez déjà le palier à 30 000 $/an et que vous n’utilisez pas Salesforce comme source de vérité pour la suppression, cela peut suffire. Ce n’est pas le bon outil si vous voulez que la logique ICP et les règles de suppression soient lisibles et auditables par votre équipe ops, si vous utilisez RB2B en parallèle ou à la place de Warmly, ou si vous voulez que la prise de contact soit un brouillon édité par un représentant plutôt qu’un envoi autonome. Ce flow vous donne les trois au coût de n8n et fonctionne pour les deux fournisseurs.

vs RB2B → Slack → triage manuel. Le push Slack natif de RB2B est le statu quo : chaque personne identifiée, aucun filtre ICP, aucune conscience du CRM. Il convient au palier gratuit et fonctionne à faible volume, mais à 1 000 identifications par mois le canal devient un bruit que les représentants ignorent, et il n’y a aucun garde-fou contre le fait de solliciter un contact en plein deal. Ce flow filtre d’abord vers l’ICP et supprime les actions en cours, de sorte que ce qui arrive dans Slack vaut la peine d’être lu.

vs un auto-enroll Zapier dans Instantly/Smartlead. Le geste en un clic est RB2B/Warmly → Zapier → séquenceur froid. Il envoie le plus vite et c’est le plus risqué : aucun contrôle humain sur une identité probabiliste, aucune suppression contre les opportunités ouvertes, et les envois froids vers des personnes fraîchement dé-anonymisées sont le moyen le plus rapide de cramer un domaine d’envoi. Ce flow échange cette vitesse contre un brouillon avec un représentant dans la boucle et une suppression consciente du CRM.

vs une table Clay sur un flux de dé-anon. Clay peut tirer un flux de dé-anon, l’enrichir, appliquer un barème ICP avec des colonnes de formule et pousser vers un séquenceur — et c’est un très bon choix pour les campagnes de prospection par lot. Ce n’est pas piloté par les événements, il y a donc toujours un délai de lot entre la visite et la prise de contact. Utilisez Clay pour la couche hebdomadaire d’enrichissement et de prospection ; utilisez ce flow pour la réponse temps réel, tant que la visite est encore chaude.

Files in this artifact

Download all (.zip)