Plateforme
Alertes et webhooks
Les règles d’alerte, où elles sont envoyées, le contenu du webhook et comment vérifier sa signature.
Les alertes surveillent votre trafic à votre place. Chaque nouveau site démarre avec trois règles activées : un pic de trafic, la première conversion de la journée et un pic d’erreurs. Le nombre de règles par site dépend de l’offre (de 5 sur Starter à un nombre illimité sur Pro et pendant l’essai), et l’envoi par webhook commence avec Pro : voir Offres et limites.
Règles d’alerte
| Type | Se déclenche quand | Options |
|---|---|---|
traffic_spike | Les visiteurs sont nettement au-dessus du niveau habituel pour cette heure | percent, minVolume |
traffic_drop | Les visiteurs sont nettement en dessous du niveau habituel | percent, minVolume |
goal_conversion | Un objectif est atteint (éventuellement seulement la première fois de la journée) | goalId, firstOfDay |
event | Un événement correspondant arrive : « un visiteur venu de news.ycombinator.com sur /pricing », « un achat de plus de 500 € » | event, path, referrer, channel, country, minRevenue |
error_spike | Les erreurs JavaScript sont nettement au-dessus de la normale | percent, minVolume |
online_threshold | Le nombre de visiteurs en ligne franchit un seuil | threshold |
Les règles d’objectif se déclenchent sur les objectifs définis dans Objectifs et entonnoirs ; les règles d’événement portent sur les événements personnalisés que vous envoyez, revenu compris.
Chaque règle a un délai de carence (30 minutes par défaut, cooldownMinutes) pour qu’une journée chargée ne vous submerge pas, et un bouton Send test pour l’essayer.
Envoi
- Toujours : le centre de notifications du tableau de bord, ainsi que les notifications du navigateur si vous les autorisez.
- En option : une URL de webhook par règle. Les URL de webhook Slack et Discord sont reconnues et reçoivent un message mis en forme ; toute autre URL reçoit le JSON ci-dessous.
- Les URL de webhook doivent pointer vers une adresse publique ; les adresses privées et de bouclage sont refusées.
Contenu du webhook
{
"type": "alert.triggered", // ou "alert.test"
"alert": { "id": "alr_…", "name": "Traffic spike", "kind": "traffic_spike" },
"site": { "id": "SITE_ID", "name": "Acme", "domain": "acme.com" },
"title": "Traffic spike on acme.com",
"message": "412 visitors in the last hour, 3.1× the usual.",
"data": { … }, // chiffres propres au type d’alerte
"url": "https://your-globatics/app/SITE_ID", // si GLOBATICS_PUBLIC_URL est défini
"ts": 1792631000000,
"triggeredAt": "2026-10-21T14:23:20.000Z"
}| En-tête | Valeur |
|---|---|
X-Globatics-Signature | hex(HMAC-SHA256(corps brut, secret de signature)) |
X-Globatics-Event | alert.triggered ou alert.test |
X-Globatics-Delivery | Identifiant unique de l’envoi (identique lors des nouvelles tentatives) |
Vérifier la signature
Chaque site a son propre secret de signature (il commence par whsec_), affiché dans les réglages des alertes et renvoyé par GET /api/sites/:siteId/alerts. Calculez le HMAC sur le corps brut de la requête, avant de l’analyser, et comparez en temps constant.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyGlobatics(rawBody: string, signature: string | null, secret: string): boolean {
if (!signature) return false;
const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(expected, "hex");
const b = Buffer.from(signature, "hex");
return a.length === b.length && timingSafeEqual(a, b);
}
// gestionnaire de route Next.js
export async function POST(req: Request) {
const raw = await req.text();
if (!verifyGlobatics(raw, req.headers.get("x-globatics-signature"), process.env.GLOBATICS_WHSEC!)) {
return new Response("Bad signature", { status: 401 });
}
const event = JSON.parse(raw);
// …
return new Response(null, { status: 204 });
}Auto-hébergement
Les secrets de signature sont dérivés du secret du serveur : GLOBATICS_SECRET s’il est défini, sinon un secret aléatoire généré au premier démarrage et enregistré dans la base de données. Le modifier change le secret de signature de chaque site.
Nouvelles tentatives et journal
- Un envoi réussit sur toute réponse 2xx. Les délais dépassés, les erreurs réseau et les réponses 408, 429 et 5xx donnent lieu à 3 nouvelles tentatives espacées progressivement (4 essais au total).
- Les redirections ne sont pas suivies. Répondez rapidement et effectuez le traitement en arrière-plan.
- Chaque envoi est journalisé avec son contenu, son statut, le code de réponse et les tentatives :
GET /api/sites/:siteId/alerts/deliveries.