# Comment envoyer les levées de fonds détectées par Rodz dans un workflow n8n ?

> Source: https://www.rodz.io/fr/guides/cas-usage/levees-de-fonds-vers-n8n/
> Mis à jour le 2026-10-12 · Peter Cools · Recette · Levées de fonds · n8n

## En bref

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é)

## 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

### 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).

### 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)`

```bash
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
    }
  }'
```

### 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`

```javascript
const crypto = require('crypto');

const SECRET = $env.RODZ_WEBHOOK_SECRET; // Intégrations → API dans Rodz
const 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 } }];
```

### 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).

### 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`

```bash
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 `""`).

```json
{
  "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

1. **Webhook** (POST, Raw Body, réponse immédiate).
2. **Code** : vérification de la signature, puis JSON du lead.
3. **IF** : `signal.is_test` vrai → fin ; `funding_amount_usd` sous le seuil → simple ligne de tableur.
4. **Remove Duplicates** sur `webhookId`.
5. **CRM** : recherche du compte par domaine, création ou mise à jour, puis du contact.
6. **Slack** : un message au commercial du secteur avec le résumé et l'usage des fonds.

Si vous n'avez pas besoin de logique sur mesure, HubSpot et lemlist sont des destinations natives de Rodz : voyez [levées de fonds vers HubSpot](/fr/guides/cas-usage/levees-de-fonds-vers-hubspot/) et [levées de fonds vers lemlist](/fr/guides/cas-usage/levees-de-fonds-vers-lemlist/).

## Dépannage

- **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.

## Sources

- [Référence de l'API Rodz : signal Levées de fonds, webhooks, signature et retentatives](https://api.rodz.io/docs)
- [n8n : nœud Webhook (option Raw Body)](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/)
- [n8n : nœud Code](https://docs.n8n.io/code/code-node/)
- [RFC 2104 : HMAC](https://www.rfc-editor.org/rfc/rfc2104)

## Guides associés

- https://www.rodz.io/fr/guides/api/recepteur-webhook-hmac/
- https://www.rodz.io/fr/guides/cas-usage/levees-de-fonds-vers-hubspot/
- https://www.rodz.io/fr/guides/cas-usage/levees-de-fonds-vers-lemlist/
