Qué necesitas
- Una cuenta de Make.com con una conexión a Google Sheets
- Una hoja de Google Sheets con fila de encabezados, por ejemplo: Recibido el, Nombre, Email, Mensaje
- La herramienta que enviará el webhook, o una forma de enviar una petición de prueba (curl, Postman o el cliente HTTP que prefieras)
- Una idea aproximada de los campos que incluirá el remitente
Montaje paso a paso
1. Crea el webhook
Crea un escenario nuevo y añade Webhooks – Custom webhook como trigger. Haz clic en Add, ponle un nombre como «Formulario de contacto de la web» y guarda. Make muestra una URL con un aspecto parecido a https://hook.<region>.make.com/<long-random-string>. Cópiala. Trátala como una contraseña: cualquiera que la tenga puede enviar datos a tu escenario.
2. Ponlo a escuchar
Haz clic en Run once. El módulo se queda esperando datos y lo indica. Solo aprende la estructura mientras está escuchando, así que no te saltes este paso.
3. Envía una petición de ejemplo
Desde un terminal, envía un ejemplo realista. Con curl:
curl -X POST "https://hook.<region>.make.com/<your-id>" \
-H "Content-Type: application/json" \
-d '{"name": "Anna Berg", "email": "[email protected]", "message": "Hello"}'
En Windows, usa explícitamente curl.exe en PowerShell, porque allí curl es un alias de otro comando. Postman también sirve. Make responde con un breve mensaje «Accepted» y el módulo se pone en verde.
4. Comprueba que se ha determinado la estructura de datos
Abre la burbuja de salida. Deberías ver name, email y message como campos. Esta es la estructura que Make usará en el panel de mapeo. Si más adelante el remitente puede incluir más campos, o si algunos son opcionales, envía un segundo ejemplo con todos ellos. Para cambiar la estructura más tarde, haz clic en Detect new values en el módulo Custom webhook y envía una petición nueva. Si conoces los campos de antemano, puedes elegir una estructura de datos en los ajustes avanzados del webhook; en ese caso, Make rechaza con el estado 400 las peticiones que no coincidan.
5. Añade un filtro para los campos obligatorios
Haz clic en el enlace que sigue al webhook y añade un filtro: email, exists, y message, exists. Así, las peticiones incompletas o accidentales se detienen aquí en lugar de crear filas vacías.
6. Añade Google Sheets – Add a Row
Selecciona la hoja de cálculo y la pestaña. Mapea:
- Recibido el:
{{formatDate(now; "YYYY-MM-DD HH:mm")}} - Nombre:
{{1.name}} - Email:
{{trim(1.email)}} - Mensaje:
{{1.message}}
El 1. es el número del módulo de webhook en este ejemplo, así que usa el panel de mapeo para ver el tuyo.
7. Gestiona los datos anidados
Los payloads reales suelen contener objetos o arrays anidados, como customer.address.city o una lista de items. Los objetos anidados se pueden mapear haciendo clic por el árbol en el panel de mapeo. Los arrays necesitan un iterador si cada elemento debe convertirse en su propia fila. Si quieres una sola fila, usa join(map(...)) para convertir el array en texto.
8. Devuelve una respuesta si el remitente la necesita
Algunas herramientas esperan una respuesta concreta, como {"status": "ok"}. Añade Webhooks – Webhook response, pon el estado en 200 y el body con lo que espera el remitente. Sin este módulo, Make responde con un mensaje «Accepted» por defecto. Make espera hasta 180 segundos la respuesta; pasado ese tiempo, devuelve 200 Accepted de todos modos.
9. Protege la URL
Estas son las opciones prácticas, de la más sencilla en adelante:
- Mantén la URL en secreto. No la pegues en repositorios públicos, capturas de pantalla ni en JavaScript del lado del cliente que los visitantes puedan leer.
- Usa la autenticación con API Key. Al crear o editar el webhook, añade una o varias API keys. El remitente incluye entonces la key en una cabecera
x-make-apikey, y Make rechaza en el propio webhook las peticiones sin una key válida. - Restringe por IP. Si el remitente publica direcciones IP fijas, introdúcelas separadas por comas en el ajuste IP restrictions del webhook (también funcionan rangos CIDR). Las peticiones desde otras direcciones no se procesan.
- Si el remitente no puede enviar esa cabecera, comprueba en su lugar un secreto compartido. Pídele que añada una cabecera como
x-webhook-secretcon un valor aleatorio largo. En los ajustes avanzados del webhook, pon Get request headers en Yes y luego añade un filtro: la cabecera es igual a tu secreto. Las peticiones sin ella se detienen en el filtro. - Si la URL se filtra, crea un webhook nuevo y actualiza el remitente. La URL antigua ya no llegará a tu escenario.
Un secreto comprobado en un filtro no impide que las peticiones lleguen a Make: cada una sigue iniciando una ejecución y el trigger del webhook consume créditos. Solo evita que lleguen a tu hoja. La autenticación con API Key y las IP restrictions actúan en el propio webhook, pero, en cualquier caso, trata la URL como un secreto.
10. Activa y prueba en real
Activa el escenario, dispara un evento real en la herramienta remitente y revisa la pestaña History y la hoja. Por defecto, un escenario con webhook se ejecuta en cuanto llegan datos; déjalo así salvo que quieras procesar la cola por lotes según una programación. Ten en cuenta que un escenario configurado para ejecutarse de inmediato se desactiva tras su primer error, así que plantéate añadir una ruta de gestión de errores, como en nuestra guía de error handlers en Make.
Errores frecuentes y cómo solucionarlos
El módulo se queda esperando sin más. La petición se envió a una URL o región equivocada, o al remitente lo bloqueó un firewall o una errata. Compara la URL carácter por carácter y asegúrate de que Run once está activo antes de enviar.
Los campos no aparecen en el panel de mapeo. La estructura se determinó a partir de una petición vacía o distinta. Vuelve a determinar la estructura de datos (Redetermine data structure), envía un ejemplo completo y revisa la burbuja.
El body llega como un único valor de texto en vez de como campos. El remitente usó un content type incorrecto. Para JSON, la cabecera debe ser Content-Type: application/json. Los datos codificados como formulario también funcionan, pero el remitente tiene que indicar de cuál se trata.
Llegan datos, pero no se escribe nada en la hoja. El escenario está desactivado, así que las peticiones esperan en la cola del webhook, o el filtro del paso 5 las bloqueó. Abre Webhooks en la barra lateral izquierda, selecciona el webhook y revisa su pestaña Queue; después revisa la condición del filtro. En cuanto el escenario esté activo, se procesarán los elementos en cola.
Filas duplicadas. Algunos remitentes reintentan el envío si no reciben rápido una respuesta de éxito, y otros envían el mismo evento dos veces. Incluye un ID de evento en el payload siempre que puedas y compruébalo con la hoja antes de añadir una fila, como en nuestra guía de Typeform a Google Sheets.
Un campo que ayer estaba ahora llega vacío. El remitente cambió su payload. Revisa una petición nueva en la burbuja, vuelve a determinar la estructura y actualiza tu mapeo. Usa ifempty() para los campos que a veces faltan.