Skip to content

Type de ressource : Configuration Webhook Sanity
Emplacement : Sanity Studio → Settings → Webhooks
Statut : [Actif / Déprécié / En développement]

[Description concise de ce que ce webhook dĂ©clenche dans l’écosystĂšme]

  • [Objectif principal : ex. dĂ©clencher un rebuild du site lors de la publication]
  • [BĂ©nĂ©fice pour le workflow Ă©ditorial]
  • CrĂ©ation de document : [✅/❌]
  • Modification de document : [✅/❌]
  • Publication de document : [✅/❌]
  • Suppression de document : [✅/❌]
  • Types de documents concernĂ©s : [Liste : post, project, page, author, category, etc.]
Champ Valeur Description
Name [Nom du webhook] Nom lisible pour l’identification
URL https://[worker-name].[subdomain].workers.dev URL du Worker L3 qui reçoit le webhook
HTTP Method POST Méthode HTTP utilisée
Content Type application/json Format du payload
Secret [Valeur du secret] Secret pour validation HMAC-SHA256 (stocké en env)
Events [Liste des événements] Ex: publish.create, publish.update, publish.delete
Include drafts [✅/❌] Inclure ou non les sauvegardes de brouillons
Filter [Expression GROQ] Filtre pour limiter les documents déclencheurs
_type in ["post", "project", "page", "author", "category"]

Rationale : [Expliquer pourquoi ce filtre est nécessaire]

{
"transactionId": "abc123",
"transition": "publish",
"documentId": "post-123",
"document": {
"_id": "post-123",
"_type": "post",
"title": "Mon article",
"slug": { "current": "mon-article" },
"status": "published",
"publishedAt": "2026-09-03T10:00:00Z"
},
"previousRevision": "rev-456",
"currentRevision": "rev-789",
"timestamp": "2026-09-03T10:00:00Z"
}
En-tĂȘte Description
Content-Type application/json
x-sanity-signature t=1693735200,v1=abc123... (timestamp + signature HMAC-SHA256)
x-sanity-webhook-id ID unique du webhook
User-Agent Sanity-webhook/1.0
[Sanity Content Lake]
│ (Ă©vĂ©nement : publish, create, update, delete)
▌
[HTTP POST vers URL du webhook]
│
▌
[Worker L3 : cms-webhook-receiver]
│ ‱ Validation HMAC-SHA256
│ ‱ Debouncing KV
│ ‱ DĂ©clenchement du build
▌
[Hébergeur / CI/CD]
│ ‱ Build SSG Astro
│ ‱ RĂ©gĂ©nĂ©ration index Pagefind
│ ‱ DĂ©ploiement Cloudflare Pages
▌
[Site mis Ă  jour]
Composant RĂŽle Couche Documentation
Webhook Sanity Envoi des notifications d’évĂ©nements L1 Ce document
cms-webhook-receiver Réception, validation et traitement L3 /L3_Backend/cloudflare/workers/cms-webhook-receiver.md
Pipeline CI/CD Build et déploiement Infrastructure [Lien vers docs CI/CD]
Mécanisme Implémentation Rationale
Validation HMAC-SHA256 Signature cryptographique du payload Garantit l’authenticitĂ© et l’intĂ©gritĂ©
Secret stocké en env wrangler secret put cÎté Worker L3 Jamais dans le code source
HTTPS obligatoire Cloudflare force TLS Chiffrement en transit
Filtre GROQ Limitation des documents dĂ©clencheurs Évite les webhooks inutiles

CĂŽtĂ© Sanity : Le secret est configurĂ© dans l’interface Studio lors de la crĂ©ation du webhook.

CÎté Worker L3 : Le secret est injecté via wrangler secret put :

Terminal window
wrangler secret put SANITY_WEBHOOK_SECRET --env production
wrangler secret put SANITY_WEBHOOK_SECRET --env staging

RĂšgle : Le secret doit ĂȘtre identique des deux cĂŽtĂ©s.

SymptĂŽme Cause probable Solution
Webhook non reçu URL incorrecte ou firewall VĂ©rifier l’URL dans Sanity et les logs du Worker L3
“Signature invalide” (cĂŽtĂ© Worker) Secret incorrect ou payload modifiĂ© VĂ©rifier que le secret est identique dans Sanity et le Worker
Build non déclenché Filtre Sanity trop restrictif Vérifier le filtre GROQ dans la configuration
Webhooks en cascade Pas de debouncing cÎté Worker Vérifier la configuration KV dans le Worker L3

CÎté Sanity :

  • Sanity Studio → Settings → Webhooks → Delivery logs
  • VĂ©rifier les tentatives de livraison et les rĂ©ponses HTTP

CÎté Worker L3 :

  • Cloudflare Worker Logs (voir /L3_Backend/cloudflare/workers/cms-webhook-receiver.md)
Terminal window
# Test de validation de signature (avec payload factice)
PAYLOAD='{"test": "data"}'
TIMESTAMP=$(date +%s)
SECRET="your-secret"
SIGNATURE=$(echo -n "${TIMESTAMP}.${PAYLOAD}" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
curl -X POST "https://[worker-url]" \
-H "Content-Type: application/json" \
-H "x-sanity-signature: t=${TIMESTAMP},v1=${SIGNATURE}" \
-d "$PAYLOAD"
  • ✅ Utiliser un filtre GROQ pour limiter les webhooks aux documents pertinents
  • ✅ DĂ©sactiver “Include drafts” pour Ă©viter les webhooks inutiles
  • ✅ Utiliser un secret fort et unique par environnement (production/staging)
  • ✅ Documenter les changements de configuration dans ce fichier
  • ✅ Publier les modifications par lots plutĂŽt qu’une par une
  • ✅ VĂ©rifier que le build a bien Ă©tĂ© dĂ©clenchĂ© aprĂšs publication
  • ✅ Ne pas modifier la configuration du webhook sans validation technique
  • ✅ Signaler immĂ©diatement tout Ă©chec de build aprĂšs publication
  • ⚠ Les webhooks ne sont dĂ©clenchĂ©s que sur publish (pas sur les sauvegardes de draft)
  • ⚠ Le Worker L3 implĂ©mente un debouncing de 2 minutes pour protĂ©ger les quotas CI/CD
  • ✅ Les builds SSG peuvent prendre plusieurs minutes selon le volume de contenu
  • [Évolution 1 : ex. Filtrage avancĂ© par type de document]
  • [Évolution 2 : ex. Notification Slack/Teams en cas d’échec]
  • [Évolution 3 : ex. Rejeu manuel des webhooks Ă©chouĂ©s]
  • ❌ Les webhooks ne sont pas rĂ©troactifs (pas de rejeu automatique en cas d’échec)
  • ❌ Le payload Sanity ne contient pas toutes les mĂ©tadonnĂ©es (seulement le document modifiĂ©)
  • ❌ Le debouncing de 2 minutes peut masquer des publications rapides successives
  • Documentation Sanity : Webhooks
  • Worker L3 : /L3_Backend/cloudflare/workers/cms-webhook-receiver.md
  • DAT L1 : §4.9.3 - Alerting Webhook & OpĂ©rations
  • DAT L2 : §7 - Pipeline de DĂ©ploiement et d’Invalidation
  • DAT L3 : §5.2 - Worker cms-webhook-receiver
Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
YYYY-MM-DD 1.1 [Modification] [Nom]
Edit page

Last updated: