Documentation›Intégrations
Webhooks : vos joueurs dans Brevo, Zapier ou votre CRM
À chaque partie d'un de vos jeux, jenvoie envoie le joueur (son contact, ses réponses, son lot) vers vos outils : directement dans Brevo, ou vers n'importe quelle URL (votre CRM, Zapier, Make, n8n…).
Les webhooks sont inclus dans les offres payantes, dès 2 000 emails par mois (3 €). Si vous repassez en gratuit, vos webhooks sont conservés mais plus rien n'est envoyé.
Mise en place
- Ouvrez Réglages › Webhooks (réservé aux admins de l'équipe).
- Cliquez sur Connecter Brevo ou Ajouter une URL.
- Choisissez tous vos jeux ou un seul jeu.
- Cliquez sur Envoyer un test : une partie fictive part vers votre outil. Le journal montre ensuite chaque envoi, sa réponse, et permet de le renvoyer.
Brevo
Collez votre clé API Brevo (dans Brevo : votre nom › SMTP & API › Clés API) et, si vous voulez, l<strong>ID de la liste</strong> où ranger les joueurs. Chaque joueur est créé ou mis à jour dans vos contacts Brevo, avec prénom, nom et téléphone (attributs <code>FIRSTNAME</code>, <code>LASTNAME</code>, <code>SMS</code>, modifiables pour les comptes qui utilisent <code>PRENOM</code> / <code>NOM</code>).
Seuls les joueurs qui ont coché l'accord marketing de votre jeu sont envoyés dans Brevo. Sans bloc « Accord marketing » dans le jeu, personne n'est envoyé.
Ce que reçoit votre URL
Un POST en application/json par partie, avec les en-têtes X-Jenvoie-Event, X-Jenvoie-Delivery (identifiant unique de l'envoi, pour ignorer un doublon) et X-Jenvoie-Signature :
{
"event": "game.play",
"test": false,
"createdAt": "2026-11-10T14:03:12.000Z",
"game": { "id": 24, "name": "Roue de Noël", "type": "wheel" },
"play": {
"id": 1532,
"outcome": "won",
"language": "fr",
"prize": { "name": "-10 %", "code": "AB12CD34", "discountCode": null, "qrUrl": "https://…" },
"quizResult": null
},
"contact": {
"email": "marie.dupont@example.com",
"firstName": "Marie",
"lastName": "Dupont",
"phone": "+33612345678",
"marketingConsent": true,
"trackingConsent": null
},
"answers": [
{ "key": "email", "label": "Email", "type": "email", "value": "marie.dupont@example.com" }
]
}play.outcome vaut won, lost, entered (tirage au sort ou pronostic : le résultat vient plus tard) ou quiz (avec play.quizResult). contact.marketingConsent est null quand le jeu ne pose pas la question. Un envoi de test porte "test": true.
Sécurité
Votre clé API
Choisissez un en-tête et sa valeur, par exemple Authorization: Bearer votre_clé ou X-API-Key: votre_clé. jenvoie l'envoie à chaque appel : refusez tout appel qui ne le porte pas.
La signature
Chaque appel est signé avec le secret de signature du webhook (affiché dans Réglages, régénérable) : t= l'heure d'envoi, v1= le HMAC-SHA256 de t.corps_brut. Elle prouve que le contenu n'a pas été modifié et que l'appel n'est pas rejoué.
Pour vérifier la signature, recalculez-la sur le corps brut (avant tout parsing JSON) et refusez un appel de plus de 5 minutes :
import { createHmac, timingSafeEqual } from "node:crypto";
// header = req.headers["x-jenvoie-signature"] → "t=1731247392,v1=5f2b…"
function isFromJenvoie(header, rawBody, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return Math.abs(Date.now() / 1000 - Number(t)) < 300
&& typeof v1 === "string" && v1.length === expected.length
&& timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}- Votre clé et votre clé Brevo sont chiffrées chez nous et ne sont plus jamais affichées (seulement leurs 4 derniers caractères).
- Seules les URL en https sont acceptées : la clé ne circule jamais en clair.
- Les redirections ne sont pas suivies, pour que la clé ne parte jamais vers un autre site ; les adresses internes (localhost, réseau privé) sont refusées.
- Pour Brevo, créez une clé dédiée à jenvoie : vous pourrez la révoquer seule, sans toucher à vos autres intégrations.
Réponse et nouvelles tentatives
Répondez 2xx en moins de 10 secondes. En cas d'erreur réseau, de 408, 429 ou 5xx, jenvoie réessaie 2 fois (après 3 s puis 15 s). Après 50 échecs d'affilée, le webhook est mis en pause ; relancez-le depuis Réglages une fois votre URL réparée. Chaque envoi en échec peut être renvoyé depuis le journal.