Skip to content

Type de ressource : Configuration Webhook Sanity
Emplacement : Sanity Studio → Settings → Webhooks
Statut : [Actif / Déprécié / En développement]
Slice : [Numéro de la tranche verticale]
Version : 1.0


[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]
ÉvĂ©nement Statut
CrĂ©ation de document [✅/❌]
Modification de document [✅/❌]
Publication de document [✅/❌]
Suppression de document [✅/❌]
Type de document Statut
post [✅/❌]
project [✅/❌]
page [✅/❌]
author [✅/❌]
category [✅/❌]

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
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 /ObjectData/cloudflare-workers-objectData.md
Pipeline CI/CD Build et déploiement Infrastructure [Lien vers docs CI/CD]

Champ Type Description
transition string Type de transition (publish, create, update, delete)
document object Document modifié
timestamp string Timestamp de l’évĂ©nement
Code HTTP Condition Description
200 Webhook traité avec succÚs Build déclenché ou ignoré (debounce)
401 Signature invalide Secret incorrect
403 Signature manquante En-tĂȘte manquant
500 Erreur serveur Erreur interne du Worker
Effet Description Fréquence
DĂ©clenchement build Appel du deploy hook CI/CD À chaque publication (debounce 2 min)
Lock KV Pose d’un lock de 2 minutes À chaque webhook reçu

Scénario Description Résultat attendu
Validation HMAC-SHA256 Signature correcte vs incorrecte Validation réussie vs échec
Debouncing KV Webhooks multiples en 2 min Premier traité, autres ignorés
Scénario Dépendances Description Résultat attendu
Flux complet Sanity → Worker → CI/CD Publication → Webhook → Build Site mis à jour
Débouncing KV + Worker Publications rapides successives Un seul build déclenché
Scénario Parcours utilisateur Description Résultat attendu
Publication → Rebuild Sanity Studio → Webhook → Build Publication d’un article Nouveau contenu visible aprùs rebuild

Composant Type RĂŽle MĂ©thode d’intĂ©gration
Sanity Studio L1 Envoi du webhook Configuration dans Studio
cms-webhook-receiver L3 Réception et traitement HTTP POST endpoint
Pipeline CI/CD Infrastructure Build et déploiement Deploy hook
  • Le secret doit ĂȘtre identique dans Sanity et le Worker
  • Le debounce KV protĂšge les quotas CI/CD
  • Les webhooks ne sont dĂ©clenchĂ©s que sur publish (pas sur les drafts)
  • Le webhook est configurĂ© dans Sanity Studio
  • Le Worker reçoit et valide les webhooks
  • Le build est dĂ©clenchĂ© correctement
  • Le debounce fonctionne
  • Les tests E2E passent

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.

  • ✅ Utiliser un secret fort et unique par environnement
  • ✅ Ne jamais logger le secret ou le payload en clair
  • ✅ Rotation rĂ©guliĂšre du secret (tous les 90 jours)

Aspect Valeur Stratégie
Debounce 2 minutes Protection CI/CD
Timeout webhook 30 secondes Limite Sanity
Retry automatique 3 tentatives Sanity native
  • ❌ 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
  • ❌ Le debouncing de 2 minutes peut masquer des publications rapides

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

CÎté Sanity :

  • Sanity Studio → Settings → Webhooks → Delivery logs

CÎté Worker L3 :

  • Cloudflare Worker Logs
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
  • ✅ DĂ©sactiver “Include drafts” pour Ă©viter les webhooks inutiles
  • ✅ Utiliser un secret fort et unique par environnement
  • ✅ Publier les modifications par lots plutĂŽt qu’une par une
  • ✅ VĂ©rifier que le build a bien Ă©tĂ© dĂ©clenchĂ© aprĂšs publication
  • ✅ Signaler immĂ©diatement tout Ă©chec de build

  • [Évolution 1 : ex. Filtrage avancĂ© par type de document]
  • [Évolution 2 : ex. Notification Slack/Teams en cas d’échec]
  • ❌ Les webhooks ne sont pas rĂ©troactifs
  • ❌ Le payload Sanity ne contient pas toutes les mĂ©tadonnĂ©es

  • Documentation Sanity : Webhooks
  • Worker L3 : /ObjectData/cloudflare-workers-objectData.md
  • DAT L1 : §4.9.3 - Alerting Webhook & OpĂ©rations
  • DAT L2 : §7 - Pipeline de DĂ©ploiement et d’Invalidation

Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
Edit page

Last updated: