Webhooks. Real-time events, delivered reliably.
Des endpoints webhook par workspace reçoivent les événements de clics, conversions et gestion de liens avec des signatures HMAC-SHA256. Nouvelles tentatives automatiques avec backoff exponentiel. Le mode SIEM diffuse les événements vers votre plateforme de sécurité.
- 10+ event types — clicks, conversions, domain changes
- HMAC-SHA256 signature on every delivery
- 72-hour exponential-backoff retry
- Delivery log with one-click replay
Event types
10+ event types out of the box
Subscribe per endpoint — receive only the events you care about. High-volume click events ship in a 5-second batched window by default; raw-click mode delivers per-click for stream processors.
- link.clicked
Every redirect click. Batched (5s window) or raw-click mode.
- link.created
A new short link was created in the workspace.
- link.updated
Link metadata, target URL, or rules changed.
- link.deleted
Link removed — update any downstream references.
- domain.verified
Custom domain passed DNS verification.
- conversion.attributed
Revenue event matched to a click via Stripe or Shopify.
- campaign.completed
Campaign reached its end date or click cap.
- member.invited
Workspace member added or SCIM-provisioned.
Plus link.expired, link.click_cap_reached, domain.ssl_issued, and more — see the full event catalog.
Delivery guarantees
Exponential backoff. 72-hour window.
A non-2xx response or a 30-second timeout triggers automatic retries: 30 s → 2 min → 10 min → 30 min → 2 h → 8 h → 24 h → 48 h. After 72 hours the delivery is permanently failed and removed from the queue — but still in the delivery log for manual replay.
- 30-second response timeoutReturn 200 immediately; process async if your handler is slow.
- 8 retry attempts over 72 hoursExponential backoff — no avalanche effect on restart.
- Auto-pause after 30 consecutive failuresWorkspace admin notified by email. Resume from dashboard.
- One-click replay from logOriginal payload, same event_id — receiver must be idempotent.
| Event | Endpoint | Status | Latency | Time | |
|---|---|---|---|---|---|
link.clicked | api.acme.com/wh | 200 | 142ms | 14:04:31 | |
link.created | api.acme.com/wh | 200 | 88ms | 14:03:19 | |
conversion.attributed | logs.acme.com | 500 | 30001ms | 14:02:01 | |
domain.verified | api.acme.com/wh | 200 | 67ms | 13:58:44 | |
link.deleted | logs.acme.com | timeout | 30000ms | 13:55:12 |
Delivery log
Full log. Filter, inspect, replay.
Every attempt is logged: event ID, event type, endpoint URL, HTTP status, response body (up to 4 KB), and latency. Retention is 30 days on Pro, 90 days on Business.
- Filter by event type, endpoint, status, and date range
- Failed entries show full request body for debugging
- Replay sends original payload — same event_id
- API: POST /v1/webhooks/deliveries/:id/replay
- SIEM mode: structured JSON with 7-day retry guarantee
What you can do
- Événements de clics, conversions, liens et domaines
- Signature HMAC-SHA256 des requêtes
- Nouvelles tentatives automatiques — jusqu'à 72 heures
- Mode SIEM pour le transfert d'événements de sécurité
- Filtrage par type d'événement
- Journal de livraison webhook avec rejeu
Ce que les webhooks Elido délivrent et comment la livraison fonctionne
Les webhooks ne sont utiles que s'ils sont fiables. Les sections ci-dessous couvrent les garanties de livraison, la vérification de signature, le comportement de nouvelles tentatives et le mode SIEM.
Événements de clics, de conversions, de cycle de vie des liens et de domaines — configurables par endpoint
Chaque endpoint webhook peut s'abonner à un ou plusieurs types d'événements : click.created (chaque clic de redirection), conversion.created (événement de conversion reçu de Stripe, Shopify ou endpoint personnalisé), link.created, link.updated, link.deleted, link.expired, link.click_cap_reached, domain.verified, domain.ssl_issued, domain.ssl_error, workspace.member.added, workspace.member.removed. Les événements de clics à fort volume peuvent être bruyants — par défaut, les webhooks click.created sont envoyés avec une fenêtre d'agrégation de 5 secondes (livraison par lots, jusqu'à 100 événements par payload). Si vous avez besoin d'une livraison en temps réel par clic (par ex. alimentation d'un processeur de flux), activez le mode raw-click sur l'endpoint ; notez que cela peut produire des milliers de requêtes par minute pour les workspaces actifs et ne devrait être activé que pour les endpoints pouvant gérer le débit.
Chaque requête est signée en HMAC-SHA256 — vérifiez l'en-tête X-Elido-Signature avant traitement
Elido signe chaque corps de requête webhook en HMAC-SHA256 avec le secret partagé configuré sur l'endpoint. La signature est incluse dans l'en-tête X-Elido-Signature sous la forme 'sha256=<hex_digest>'. Pour vérifier : calculez le HMAC-SHA256 sur le corps brut de la requête avec le secret partagé, comparez le résultat à la valeur de l'en-tête en utilisant une fonction de comparaison à temps constant (pour prévenir les attaques temporelles). Ne traitez jamais un payload webhook avant d'avoir vérifié la signature. Le secret est affiché une seule fois à la création de l'endpoint ; effectuez la rotation dans le dashboard avec une fenêtre de chevauchement sans interruption (l'ancien secret reste valide 15 minutes après la génération d'un nouveau). Des exemples de code pour la vérification de signature en Node.js, Python et Go sont dans le guide webhooks à /docs/guides/webhooks.
Nouvelles tentatives automatiques avec backoff exponentiel — jusqu'à 72 heures avant qu'une livraison soit marquée en échec
Si un endpoint renvoie un code de statut non-2xx ou expire (timeout de réponse de 30 secondes), Elido réessaie la livraison avec un backoff exponentiel : 30 secondes, 2 minutes, 10 minutes, 30 minutes, 2 heures, 8 heures, 24 heures, 48 heures. Après la fenêtre de 72 heures, la livraison est marquée comme définitivement échouée et retirée de la file de nouvelles tentatives. Les livraisons échouées apparaissent dans le journal de livraison webhook avec le code de statut HTTP final (ou « timeout »). Vous pouvez rejouer toute livraison échouée depuis le dashboard ou l'API (POST /v1/webhooks/deliveries/:id/replay) — utile pour récupérer un lot d'événements après une panne en aval. Les endpoints qui renvoient 5xx pendant plus de 30 livraisons consécutives sont automatiquement mis en pause et l'admin du workspace est notifié par email. Reprenez l'endpoint depuis le dashboard une fois le problème sous-jacent résolu.
Le mode SIEM diffuse les événements d'audit du workspace vers Splunk, Datadog ou tout endpoint d'ingestion de logs HTTPS
Le mode SIEM est une configuration webhook spéciale pour le transfert d'événements de sécurité. Au lieu des événements applicatifs (clics, conversions), le mode SIEM délivre les événements d'audit du workspace : connexions SSO, échecs de connexion, création/rotation/suppression de clés API, événements de provisionnement SCIM, changements de rôles, rotations de secrets webhook et actions admin (suppression de liens, exports en masse). Le format du payload est un JSON structuré avec un schéma standard (timestamp, actor, action, target, workspace_id, ip_address, user_agent) conçu pour l'ingestion dans les plateformes SIEM courantes. Les webhooks SIEM ont une garantie de livraison avec nouvelles tentatives sur 7 jours et sont signés séparément des webhooks applicatifs. Intégrations testées : Splunk HTTP Event Collector (HEC), Datadog Logs API, Elastic Logstash HTTP input et tout endpoint HTTPS de logs générique. Le mode SIEM est une fonctionnalité réservée au plan Business.
Journal de livraison complet avec corps de requête, code de réponse et rejeu en un clic pour les livraisons échouées
Chaque tentative de livraison webhook est journalisée : ID d'événement, type d'événement, URL d'endpoint, horodatage de livraison, code de statut HTTP, corps de réponse (jusqu'à 4 Ko) et latence. Le journal est interrogeable par type d'événement, endpoint, plage de dates et statut (livré, en cours de nouvelles tentatives, échoué). Les livraisons échouées incluent le corps complet de la requête pour que vous puissiez inspecter l'événement sans rejouer. Rejeu : POST /v1/webhooks/deliveries/:id/replay envoie le payload original (pas un nouvel événement) à l'endpoint — l'idempotence de votre récepteur est requise. La rétention du journal est de 30 jours sur Pro, 90 jours sur Business. Pour un audit permanent des événements webhook, configurez un endpoint SIEM ou activez l'export planifié du journal d'audit.
Équipes d'ingénierie utilisant les webhooks Elido en production
Les noms sont des exemples fictifs — les vraies études de cas clients seront publiées ici.
“Nous consommons les webhooks click.created en mode batch pour alimenter notre propre pipeline d'analytics. La vérification de signature HMAC et le journal de livraison avec rejeu nous ont fait gagner des heures de débogage lors d'une panne partielle — nous avons rejoué les événements manqués depuis le dashboard sans reconstruire l'événement depuis la source.”
“Le mode SIEM diffusant les événements d'audit du workspace vers notre Splunk HEC était la fonctionnalité entreprise que notre équipe InfoSec exigeait. Les événements de connexion SSO et rotations de clés API dans Splunk, avec le bon schéma, nous ont permis de corréler les événements d'accès Elido avec nos règles d'alerte SIEM en un jour de mise en place.”
“Les webhooks link.expired déclenchent notre workflow interne de mise à jour de la base de matériaux imprimés — quand un lien de QR code expire, notre équipe ops reçoit automatiquement une tâche pour mettre à jour l'étiquette physique. Zéro surveillance manuelle des états d'expiration de liens.”
Webhooks Elido vs Bitly vs Short.io
Ni Bitly ni Short.io n'offrent de webhooks sortants avec signature HMAC et garanties de nouvelles tentatives. Cette comparaison est honnête sur l'écart.
| Feature | Elido | Bitly | Short.io |
|---|---|---|---|
| Webhooks sortants | Oui — endpoints par workspace, abonnement par type d'événement | Non disponible | Oui — webhook basique sur clic |
| Signature HMAC-SHA256 | Oui — chaque livraison signée, exemples de code fournis | Non applicable | Partiel — en-tête de signature présent, non documenté |
| Nouvelles tentatives automatiques | Oui — backoff exponentiel, fenêtre de 72 heures | Non applicable | Pas de nouvelles tentatives — fire and forget |
| Journal de livraison avec rejeu | Oui — 30 jours Pro, 90 jours Business, rejeu en un clic | Non applicable | Pas de journal de livraison |
| Mode SIEM pour événements d'audit | Oui — Business, JSON structuré pour ingestion SIEM | Non disponible | Non disponible |
| Pause automatique de l'endpoint en cas d'échec | Oui — mis en pause après 30 échecs consécutifs, admin notifié | Non applicable | Non disponible |
| Types d'événements | Clic, conversion, cycle de vie des liens, domaine, événements d'audit | Non applicable | Clic uniquement |
Questions sur les webhooks
Comment vérifier la signature HMAC-SHA256 ?
Lisez le corps brut de la requête en octets (avant tout parsing JSON), calculez le HMAC-SHA256 sur les octets bruts avec le secret partagé de votre endpoint, encodez en base16 (hex) le résultat, et comparez-le à la valeur de l'en-tête X-Elido-Signature après avoir retiré le préfixe 'sha256='. Utilisez une fonction de comparaison à temps constant (par ex. hmac.compare_digest en Python, crypto.timingSafeEqual en Node.js) pour prévenir les attaques temporelles. Ne comparez jamais la signature avec un opérateur d'égalité de chaîne standard. Exemples de code pour Node.js, Python et Go à /docs/guides/webhooks#verification.
Que doit renvoyer mon récepteur de webhooks ?
Renvoyez HTTP 200 (ou tout code de statut 2xx) dans les 30 secondes. Le corps de la réponse est ignoré — vous pouvez renvoyer un corps vide ou { ok: true }. Si votre traitement prend plus de 30 secondes, renvoyez 200 immédiatement et traitez l'événement de manière asynchrone (ajoutez à une file interne, renvoyez 200, traitez hors du chemin de la requête). Renvoyer 4xx est traité de la même façon que 5xx pour les nouvelles tentatives — les deux déclenchent un nouvel essai. Renvoyez 200 même si l'événement n'est pas pertinent pour votre intégration (par ex. un événement link.created dont vous n'avez pas besoin) pour éviter les nouvelles tentatives parasites.
Comment fonctionne l'idempotence pour les événements webhook ?
Chaque payload webhook inclut un champ event_id (UUID). Utilisez-le comme clé d'idempotence sur votre récepteur : si vous recevez le même event_id deux fois (suite à une nouvelle tentative après un échec partiel), ne le traitez qu'une seule fois. Stockez les event_id reçus dans une table de déduplication avec un TTL d'au moins 72 heures (la fenêtre de nouvelles tentatives). Le payload de nouvelle tentative est identique à l'original — même event_id, même corps — donc une simple vérification « ai-je déjà vu cet event_id ? » suffit.
Pourquoi mon endpoint est-il automatiquement mis en pause ?
Les endpoints sont automatiquement mis en pause après 30 échecs de livraison consécutifs (non-2xx ou timeout). Cela empêche Elido de marteler un endpoint défaillant indéfiniment. Corrigez le problème sous-jacent (généralement : l'URL de l'endpoint a changé, le serveur est hors service, ou le timeout de 30 secondes est dépassé à cause d'un traitement lent), puis reprenez l'endpoint dans le dashboard. Une fois repris, Elido ne rejoue pas automatiquement les événements ignorés pendant la pause — rejouez-les manuellement depuis le journal de livraison si vous devez récupérer ces événements.
Puis-je recevoir les événements de clics en temps réel pour chaque clic individuel ?
Oui — activez le mode raw-click sur l'endpoint. En mode raw-click, Elido délivre les événements click.created individuellement sans fenêtre d'agrégation, dans les 2 secondes du clic. Sachez qu'un workspace actif peut produire des milliers d'événements par minute en mode raw-click ; assurez-vous que votre récepteur peut gérer le débit. Pour la plupart des cas d'analyse, l'agrégation par lots par défaut de 5 secondes (jusqu'à 100 clics par payload) est suffisante et produit beaucoup moins de requêtes HTTP.
Quelle est la taille maximale du payload pour les événements webhook ?
Les payloads d'événements individuels font moins de 10 Ko. Les payloads de clics par lots (mode par défaut) peuvent contenir jusqu'à 100 événements, avec une taille totale plafonnée à 100 Ko. Si un lot dépasse 100 Ko, il est automatiquement divisé en plusieurs livraisons. Les champs de métadonnées volumineux (par ex. de longues URL de referrer) sont tronqués à 2 Ko par champ. Si votre récepteur impose une limite stricte de taille de payload, configurez le mode raw-click (un événement par livraison) au lieu du mode par lots.
Existe-t-il un moyen de tester les webhooks localement pendant le développement ?
Utilisez un outil comme ngrok, Cloudflare Tunnel ou localtunnel pour exposer votre serveur local avec une URL HTTPS publique, puis enregistrez cette URL comme endpoint webhook dans votre workspace de test. Alternativement, utilisez le bouton de test webhook dans le dashboard pour envoyer un payload d'exemple pour tout type d'événement à un endpoint enregistré sans déclencher un événement réel. Le CLI Elido (elido webhook test --event click.created --endpoint https://...) fonctionne également pour les tests locaux scriptés.
Que se passe-t-il pour les événements webhook pendant une fenêtre de maintenance planifiée ?
Les événements générés pendant une fenêtre de maintenance sont mis en file d'attente dans Redpanda et délivrés après la fin de la maintenance. La page de statut Elido (status.elido.app) annonce les fenêtres de maintenance planifiées à l'avance. Le SLA de livraison webhook exclut les fenêtres de maintenance annoncées. Pour une fenêtre de maintenance typique de 30 à 60 minutes, la fenêtre de nouvelles tentatives de 72 heures garantit qu'aucun événement n'est définitivement perdu — ils sont délivrés dans l'ordre de génération une fois l'endpoint à nouveau accessible.
Keep reading
Le complément API synchrone aux webhooks asynchrones — créez et interrogez les liens par programmation.
Recevez les événements de conversion via webhooks depuis Stripe et Shopify — le côté webhook entrant.
Le mode SIEM délivre les événements d'audit du workspace — connexions SSO, provisionnement SCIM, changements de rôles.
Les événements de clics dans ClickHouse — l'alternative côté requête à la réception de clics via webhook.
Prêt à essayer ?
Commencez avec le forfait gratuit, passez à la version supérieure lorsque vous avez besoin d'un domaine personnalisé.