Sanity Webhooks y Content Pipelines: La Arquitectura que Nadie Te Explica

Sanity Webhooks y Content Pipelines: La Arquitectura que Nadie Te Explica

Programming· 4 min read

La Mayoría Usa Sanity como Almacén. Los Mejores lo Usan como Orquestador

Publicas un post. Esperas que Next.js lo pille. Rezas para que el cache se invalide.

Eso no es un content pipeline. Es contenido por fe.

El problema real no es Sanity. Es que no entiendes lo que sus webhooks pueden hacer.

No son simples notificaciones de "algo cambió". Son eventos tipados, filtrables y enrutables que pueden desencadenar revalidación granular, disparar agentes de contenido, sincronizar múltiples destinos, y mantener coherencia entre sistemas completamente distintos.

Este artículo te muestra la arquitectura que separa los proyectos que escalan de los que se rompen en producción.

---

Lo que la Mayoría Configura Mal desde el Primer Día

El setup típico de un developer que integra Sanity con Next.js:

El enfoque equivocado:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Esto invalida toda la ruta /blog cada vez que cambias cualquier documento. Un cambio en un post de 2021 invalida el cache de 500 artículos. Brutal.

El enfoque correcto — revalidación granular:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

La diferencia es revalidación quirúrgica. Solo invalidas lo que cambió. No el universo entero.

---

Sanity Webhooks: Configuración Real para Múltiples Entornos

Esta es la parte que los tutoriales básicos ignoran completamente.

Cuando tienes un proyecto real, necesitas al menos tres webhooks distintos:

Producción: https://tudominio.com/api/sanity/webhook — solo documentos publicados

Preview/Staging: https://staging.tudominio.com/api/sanity/webhook — borradores incluidos

Pipeline de contenido: tu sistema de agentes o worker externo

En el dashboard de Sanity, cada webhook acepta un filtro GROQ. Aquí está la clave que nadie usa:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Filtra en el origen. No en tu handler. Cada webhook innecesario que llega a tu server es latencia y coste que evitas con dos líneas de GROQ.

Verificación de Firma — No Es Opcional

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Sin verificación de firma, cualquiera puede invalidar tu cache. O peor: disparar tu pipeline de contenido con datos fabricados.

---

El Pattern Avanzado: Webhook como Disparador de Pipeline Autónomo

El real potencial de los webhooks de Sanity no es revalidar Next.js. Es orquestar sistemas completos.

En FindEmergencyPlumber.com — un directorio con más de 1.000 piezas de contenido publicado y un pipeline de agentes autónomo — Sanity actúa como el punto de entrada del sistema. Un webhook dispara una cadena de procesos que no requiere intervención humana.

Así se estructura:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

La clave de este pattern: el webhook responde en menos de 200ms y delega el trabajo pesado a un sistema asíncrono.

Nunca hagas trabajo blocking en un webhook handler. Sanity espera respuesta. Si tardas, el webhook falla.

---

GROQ dentro del Webhook: Enriquecer el Payload al Vuelo

El payload que Sanity envía en el webhook es minimalista. Solo el _id, _type, y los campos que configures en el dashboard.

Pero a veces necesitas más contexto. Este es el pattern correcto:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

No uses fetch genérico contra la Content API aquí. Usa el cliente de Sanity con tu token de servidor. Más rápido, más seguro, con acceso a borradores si los necesitas.

---

Monitorización: Lo que Falla Silenciosamente en Producción

El problema más común que nadie menciona: los webhooks fallan sin que te enteres.

Sanity reintenta los webhooks fallidos, pero solo hasta cierto punto. Si tu handler devuelve un 500 consistentemente, eventualmente Sanity deja de intentarlo. Tu contenido se publica pero nada se revalida.

Implementa logging mínimo desde el día uno:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

El detalle del status code es crítico: si devuelves 500, Sanity reintenta. A veces eso es lo que quieres. A veces genera bucles infinitos. Decide conscientemente.

---

Takeaways Finales

Revalidación granular siempre. Usa revalidateTag y revalidatePath con identificadores específicos, nunca invalides rutas completas por defecto.

Filtra en GROQ, no en tu handler. Configura los filtros del webhook en el dashboard de Sanity para que solo lleguen los eventos que te interesan.

Verifica firmas sin excepciones. timingSafeEqual en criptografía, no comparación directa de strings.

Responde rápido, procesa asíncrono. Tu webhook handler debe responder en menos de 200ms. El trabajo pesado va a una cola.

Loguea desde el primer deploy. Los webhooks fallan silenciosamente. Sin logs, no sabes qué está pasando hasta que un usuario reporta contenido desactualizado.

Sanity no es un CMS con webhooks. Es un sistema de eventos con una interfaz de edición de contenido. Cuando lo entiendes así, construyes arquitecturas que funcionan de verdad en producción.

Artículos relacionados

---

¿Quieres recibir contenido como este cada semana? Suscríbete a mi newsletter

Brian Mena

Brian Mena

Software engineer building profitable digital products: SaaS, directories and AI agents. All from scratch, all in production.

LinkedIn