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

  1. Ouvrez Réglages › Webhooks (réservé aux admins de l'équipe).
  2. Cliquez sur Connecter Brevo ou Ajouter une URL.
  3. Choisissez tous vos jeux ou un seul jeu.
  4. 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.