Créez un signal Levées de fonds dans Rodz et collez l'URL d'un nœud Webhook n8n comme webhookUrl. Chaque levée détectée arrive en POST avec le montant, le stade, les investisseurs et l'entreprise. Un nœud Code vérifie la signature HMAC, un nœud IF filtre par montant, puis n8n route vers votre CRM ou Slack. Il n'existe pas de nœud Rodz natif : tout passe par le webhook. Un lead coûte 2 crédits.
Chiffres clés
Une levée de fonds coûte 2 crédits par lead, plus 0,5 crédit par email trouvé et 5 crédits par téléphone trouvé, facturés uniquement en cas de succès.
Chaque livraison est signée en HMAC-SHA256 (X-Webhook-Signature, X-Webhook-Timestamp) et porte un X-Webhook-Id stable entre les tentatives.
Une livraison en échec temporaire (timeout ou 5xx) est retentée avec un délai croissant : une même levée peut donc arriver deux fois.
Rodz identifie 400 000+ signaux par mois (moyenne de juillet à septembre 2026).
Coût : 2 crédits par lead (+0,5 crédit par email trouvé) Mise en place : 20 min n8n se connecte par un webhook Rodz ou par l’API (pas d’application Rodz native)
Avant de commencer
Un compte Rodz avec des crédits (le compte de test en inclut 100) et une clé API (Intégrations → API), à laquelle est rattaché le secret de webhook.
Une instance n8n joignable depuis internet (n8n Cloud ou auto-hébergée en HTTPS).
En auto-hébergé : la variable d'environnement NODE_FUNCTION_ALLOW_BUILTIN=crypto, pour que le nœud Code puisse utiliser le module crypto.
Vos critères : types de tours (seed, series_a...), montant minimum, pays du siège, secteurs.
Étapes
Étape 1.
Créez le nœud Webhook dans n8n
Dans un nouveau workflow, ajoutez un nœud Webhook : méthode POST, mode de réponse Immediately (Rodz attend un 2xx rapide). Dans les options, activez Raw Body : la signature se calcule sur les octets exacts reçus, pas sur le JSON reformaté.
Copiez l'URL de production du nœud (et non l'URL de test, qui ne répond que pendant l'écoute manuelle).
Étape 2.
Créez le signal Levées de fonds avec cette URL
Dans Rodz, ajoutez le signal Levées de fonds et collez l'URL n8n dans le champ webhook, ou créez-le par l'API. Pour recevoir un décideur de l'entreprise financée (et pas seulement l'entreprise), activez le ciblage par persona : sans lui, contact vaut "".
Laissez le signal en brouillon le temps de tester.
Création par l'API (statut draft)
curl -X POST "https://api.rodz.io/api/v1/signals/fundraising" \ -H "Authorization: Bearer $RODZ_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Séries A et plus en France", "webhookUrl": "https://n8n.example.com/webhook/rodz-levees", "dailyLeadLimit": 50, "status": "draft", "config": { "investmentTypes": ["series_a", "series_b"], "amountMin": 2000000, "announcedPeriod": "30d", "hqLocations": ["France"], "enablePersonaTargeting": true, "targetPersonas": ["CEO", "Finance Director"], "getEmails": true } }'
Étape 3.
Vérifiez la signature dans un nœud Code
Ajoutez un nœud Code (JavaScript, Run Once for All Items) après le Webhook. Il recalcule le HMAC-SHA256 de timestamp + "." + corps brut avec votre secret de webhook (Intégrations → API dans Rodz), le compare en temps constant et rejette les messages trop anciens. Stockez le secret dans une variable d'environnement n8n plutôt que dans le code.
n8n, nœud Code : verify-rodz-signature.js
const crypto = require('crypto');const SECRET = $env.RODZ_WEBHOOK_SECRET; // Intégrations → API dans Rodzconst TOLERANCE_SECONDS = 300;const item = $input.first();const headers = item.json.headers || {};const signature = headers['x-webhook-signature'] || '';const timestamp = headers['x-webhook-timestamp'] || '';// Corps brut tel que reçu (option Raw Body du nœud Webhook).const raw = await this.helpers.getBinaryDataBuffer(0, 'data');const expected = crypto .createHmac('sha256', SECRET) .update(Buffer.concat([Buffer.from(`${timestamp}.`, 'utf8'), raw])) .digest('hex');const a = Buffer.from(expected, 'utf8');const b = Buffer.from(signature, 'utf8');if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) { throw new Error('Rodz webhook: invalid signature');}if (Math.abs(Date.now() / 1000 - Number(timestamp)) > TOLERANCE_SECONDS) { throw new Error('Rodz webhook: timestamp outside tolerance');}const payload = JSON.parse(raw.toString('utf8'));return [{ json: { webhookId: headers['x-webhook-id'], ...payload } }];
Étape 4.
Filtrez et routez la levée
Ajoutez un nœud IF sur {{ $json.signal.funding_amount_usd }} (par exemple supérieur ou égal à 5 000 000) et ignorez les messages de test (signal.is_test vrai). Branchez ensuite le nœud de votre choix : votre CRM, un message Slack avec signal.article_summary et signal.article_use_of_funds, ou une ligne de tableur.
Les retentatives réutilisent le même X-Webhook-Id : avant d'écrire dans le CRM, ignorez un webhookId déjà traité (par exemple avec le nœud Remove Duplicates sur ce champ, ou une recherche dans votre base).
Étape 5.
Testez, puis activez
Activez le workflow n8n, puis envoyez un lead de test depuis Rodz : POST /api/v1/signals/{signal_id}/test-webhook. La réponse indique le code renvoyé par n8n et signed : false signifie qu'aucune clé API n'est liée au signal, les livraisons partent alors sans signature et le nœud Code les rejettera. Quand tout est vert, passez le signal en Actif.
Envoyer un payload de test
curl -X POST "https://api.rodz.io/api/v1/signals/$SIGNAL_ID/test-webhook" \ -H "Authorization: Bearer $RODZ_API_KEY"
Exemple de payload
Ce que reçoit le nœud Webhook pour une levée, avec le ciblage par persona activé (sans lui, `contact` vaut `""`).
{ "signal": { "id": "d4f5a6b7-c8d9-4e0f-a1b2-c3d4e5f6a7b8", "name": "Séries A et plus en France", "type": "fundraising", "last_signal": "Fundraising", "last_signal_date": "2026-10-09", "funding_type": "venture", "funding_stage": "Series A", "funding_amount": 6000000, "funding_amount_usd": 6500000, "funding_currency": "EUR", "investors": ["Fonds Exemple Ventures", "Business Angel"], "num_investors": 2, "funding_total_usd": 8200000, "announcement_date": "2026-10-08", "article_summary": "Northwind Robotics lève 6 M€ en série A pour accélérer en Europe.", "article_use_of_funds": "Recrutement de 20 ingénieurs et ouverture de l'Allemagne.", "article_source_url": "https://news.example.com/northwind-robotics-serie-a" }, "contact": { "lead_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "created_at": "2026-10-09T08:05:00+00:00", "first_name": "Claire", "last_name": "Martin", "email": "claire.martin@northwind-robotics.example", "phone": "", "title": "CEO", "location": "Nantes, Pays de la Loire, France", "country_code": "FR", "city": "Nantes", "linkedin_profile_url": "https://www.linkedin.com/in/claire-martin-example", "sales_navigator_profile_url": "", "matched_persona": "CEO" }, "company": { "name": "Northwind Robotics", "website": "https://northwind-robotics.example", "linkedin_url": "https://www.linkedin.com/company/northwind-robotics-example", "industry": "Automation Machinery Manufacturing", "hq_country_code": "FR", "hq_city": "Nantes", "employee_range": "51-200" }}
Les champs utiles pour router une levée
Champ
Contenu
Usage dans n8n
signal.funding_stage
Stade du tour (Seed, Series A…)
Branches IF par stade
signal.funding_amount_usd
Montant en dollars
Seuil de priorité
signal.investors
Liste des investisseurs
Mention dans le message Slack
signal.announcement_date
Date d’annonce
Fraîcheur de la levée
signal.article_summary
Résumé de l’annonce
Texte du message ou de la note CRM
signal.article_use_of_funds
Usage prévu des fonds
Angle d’approche (recrutement, international…)
contact.*
Décideur ciblé (si personas activés)
Création du contact
company.website
Site de l’entreprise
Clé de dédoublonnage du compte
Un workflow type
Webhook (POST, Raw Body, réponse immédiate).
Code : vérification de la signature, puis JSON du lead.
IF : signal.is_test vrai → fin ; funding_amount_usd sous le seuil → simple ligne de tableur.
Remove Duplicates sur webhookId.
CRM : recherche du compte par domaine, création ou mise à jour, puis du contact.
Slack : un message au commercial du secteur avec le résumé et l’usage des fonds.
Le nœud Code rejette tout : vérifiez que Raw Body est activé, que le secret est celui de la clé API liée au signal, et que le test indique signed: true.
require('crypto') est refusé : en auto-hébergé, ajoutez NODE_FUNCTION_ALLOW_BUILTIN=crypto à l’environnement de n8n.
Rien n’arrive : le workflow doit être actif et l’URL doit être l’URL de production du nœud Webhook.
Questions fréquentes
Existe-t-il un nœud Rodz natif dans n8n ?
Non. L'intégration passe par le webhook du signal : Rodz envoie chaque lead en POST à l'URL de votre nœud Webhook. Pour lire ou créer des signaux depuis n8n, utilisez le nœud HTTP Request avec l'API Rodz et votre clé en en-tête Authorization: Bearer.
Pourquoi activer Raw Body dans le nœud Webhook ?
La signature HMAC porte sur les octets exacts du corps reçu. Si vous la recalculez sur un JSON relu puis réécrit, l'ordre ou les espaces changent et la vérification échoue.
Que se passe-t-il si n8n est indisponible ?
Un timeout ou une réponse 5xx déclenche des retentatives avec un délai croissant. Une réponse 4xx est considérée comme définitive et n'est pas retentée. Après une panne longue, POST /api/v1/signals/{signal_id}/replay-webhook renvoie tous les leads du signal (signal.is_replay vrai).
Comment éviter les doublons dans mon CRM ?
Dédoublonnez sur l'en-tête X-Webhook-Id, identique à chaque tentative d'une même livraison. Côté Rodz, l'option de gestion des doublons du signal évite aussi de livrer deux fois la même entreprise.
Les montants sont-ils dans quelle devise ?
funding_amount est dans la devise annoncée (funding_currency) et funding_amount_usd en dollars. Filtrez sur funding_amount_usd pour comparer des levées de pays différents ; le filtre amountMin du signal est aussi en USD.