Webhook Discord
Redirigez les événements Zenovay vers un salon Discord — utile pour les salles de guerre des équipes d'ingénierie ou de croissance communautaire.
Les webhooks Discord sont limités à un salon. Aucun bot Discord ni OAuth requis.
Les webhooks sortants sont une fonctionnalité Pro+. Mettez à niveau votre plan pour les activer.
1. Créer le webhook Discord
- Dans Discord, ouvrez le salon qui doit recevoir les alertes Zenovay.
- Cliquez sur l'icône d'engrenage (Modifier le salon) → Intégrations → Webhooks → Nouveau webhook.
- Donnez-lui un nom ("Alertes Zenovay") et un avatar si vous le souhaitez.
- Cliquez sur Copier l'URL du webhook — elle ressemble à
https://discord.com/api/webhooks/123456789012345678/XXXXXXXX....
2. Ajouter le webhook dans Zenovay
- Dans
app.zenovay.com, allez dans Paramètres → Webhooks. - Sélectionnez le site web pour lequel vous souhaitez recevoir des notifications.
- Cliquez sur Ajouter un webhook.
- Remplissez :
- Nom :
Discord #ops(ou tout ce qui a du sens pour vous) - URL : collez l'URL du webhook Discord de l'étape 1
- Événements : sélectionnez ceux qui vous intéressent
- Nom :
- Cliquez sur Créer le webhook.
- Cliquez sur Envoyer un événement de test (icône avion en papier) — dans les ~5 secondes, un message devrait apparaître dans votre salon Discord.
Discord accepte du JSON arbitraire, mais il affichera la charge brute sous forme de texte ordinaire. Pour des messages enrichis, consultez l'étape 3.
3. (Optionnel) Formater avec les embeds Discord
Discord prend en charge les embeds enrichis avec des couleurs, des champs et des horodatages. Zenovay envoie un événement JSON générique — pour le rendre sous forme d'embed, utilisez un petit relais :
// Cloudflare Workers / Node / Vercel — anywhere that runs JS
export default {
async fetch(req) {
const event = await req.json();
const colour = event.event_type === 'website_down' ? 0xdc2626
: event.event_type === 'traffic_spike' ? 0x10b981
: 0x3b82f6;
const discordPayload = {
embeds: [{
title: `Zenovay: ${event.event_type}`,
description: `Event for site ${event.website_id}`,
color: colour,
fields: [
{ name: 'Event type', value: event.event_type, inline: true },
{ name: 'Time', value: event.timestamp, inline: true },
],
footer: { text: 'Zenovay Analytics' },
}],
};
await fetch(DISCORD_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(discordPayload),
});
return new Response('ok');
},
};
Pointez l'URL du webhook Zenovay vers ce relais plutôt que directement vers Discord.
4. Vérifier la signature Zenovay
Pour les relais en production, vérifiez la signature HMAC-SHA256 afin que seuls les événements Zenovay authentiques atteignent Discord :
import { createHmac } from 'crypto';
const signature = req.headers.get('x-zenovay-signature'); // 'sha256=<hex>'
const provided = signature.replace(/^sha256=/, '');
const expected = createHmac('sha256', YOUR_WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
if (provided !== expected) {
return new Response('invalid signature', { status: 401 });
}
Votre secret de webhook est affiché dans Paramètres → Webhooks → cliquez sur l'icône œil sur la carte du webhook.
Dépannage
- Discord rejette avec HTTP 400 : le récepteur de webhook Discord est strict — les charges avec des clés de premier niveau inconnues peuvent renvoyer 400. Utilisez le relais de l'étape 3 pour remodeler la charge.
- Limites de débit : les webhooks Discord sont limités par salon (~30 messages par minute). Pour les types d'événements bavards comme
traffic_spike, regroupez-les dans votre relais ou filtrez côté Zenovay. - L'événement de test arrive mais les vrais événements n'arrivent pas : confirmez que les bons types d'événements sont sélectionnés dans la configuration du webhook Zenovay. L'événement de test utilise
event_type: 'test'quel que soit ce qui est sélectionné.