Cómo automatizar un formulario web y guardar leads en Notion con n8n
Muchos equipos siguen gestionando leads o consultas desde un formulario web con un proceso torpe:
- llega el mensaje
- alguien revisa el correo
- copia datos manualmente
- los pega en Notion, un CRM o una planilla
- y recién después empieza el seguimiento
Ese flujo no escala bien. Consume tiempo, introduce errores y vuelve opaco algo tan básico como saber cuántos contactos entraron realmente.
En este tutorial vas a construir una automatización simple y útil:
un formulario web envía datos a n8n y n8n crea automáticamente un registro en Notion
Es un caso pequeño, pero representa muy bien el tipo de automatización que después puede crecer hacia procesos de ventas, soporte u operaciones.
Qué vas a construir
El flujo final será este:
Formulario web
↓
Webhook de n8n
↓
Validación de campos
↓
Creación de registro en Notion
↓
Respuesta al frontend
Cuándo conviene esta solución
Este enfoque tiene sentido cuando:
- recibes leads o consultas desde una landing
- quieres registrar todo en Notion sin trabajo manual
- necesitas una solución rápida antes de integrar un CRM más complejo
- quieres una base automatizada para luego sumar alertas, scoring o seguimiento
No es la mejor opción cuando:
- ya tienes un CRM bien integrado
- necesitas lógica comercial compleja desde el primer día
- el formulario maneja datos altamente sensibles y requiere controles adicionales
Requisitos previos
Antes de empezar, asegúrate de tener:
- una instancia de n8n funcionando
- una cuenta de Notion
- una base de datos creada en Notion
- una integration de Notion con acceso a esa base
Si todavía no tienes n8n levantado, puedes empezar por este tutorial:
Qué estructura usar en Notion
Para este ejemplo, crea una base de datos con estas propiedades:
| Propiedad | Tipo sugerido |
|---|---|
Nombre | Title |
Email | |
Mensaje | Text |
Fecha | Date |
Estado | Select |
Puedes añadir otras columnas después, por ejemplo:
OrigenCampañaAsignado aPrioridad
Paso 1: Crear la integration en Notion
- Ve a
Settings->Integrations - Crea una nueva integration
- Copia el Internal Integration Token
- En la base de datos que usarás, haz click en
...->Connect to - Selecciona la integration recién creada
Sin ese paso, n8n no podrá escribir en la base.
Paso 2: Obtener el Database ID
Abre la base de datos en Notion y mira la URL.
Tendrá una forma similar a esta:
https://www.notion.so/workspace/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?v=...
El bloque largo del medio es el database_id.
Guárdalo porque lo necesitarás en el nodo de Notion.
Paso 3: Crear el workflow en n8n
El flujo mínimo necesita estos nodos:
- Webhook
- Validación
- Notion
- Respond to Webhook
Si quieres acelerar el proceso, ya tienes un blueprint base disponible aquí:
Pero en este tutorial vamos a montarlo conceptualmente paso a paso.
Paso 4: Configurar el Webhook
Crea un nodo Webhook con:
HTTP Method:POSTPath:form-notion
El endpoint resultante será algo como:
https://tu-n8n.com/webhook/form-notion
El frontend enviará un JSON así:
{
"nombre": "María García",
"email": "maria@ejemplo.com",
"mensaje": "Me interesa recibir más información"
}
Paso 5: Validar los campos de entrada
No conviene mandar directo a Notion cualquier payload que llegue.
Como mínimo, valida:
- que
nombreexista - que
emailexista - que el email tenga formato razonable
En n8n puedes hacerlo con un nodo IF, Code o Set según prefieras.
Una lógica simple sería:
const nombre = $json.nombre?.trim();
const email = $json.email?.trim();
const mensaje = $json.mensaje?.trim() || '';
if (!nombre) {
throw new Error('El campo nombre es obligatorio');
}
if (!email) {
throw new Error('El campo email es obligatorio');
}
if (!email.includes('@')) {
throw new Error('El email no tiene un formato válido');
}
return [{
nombre,
email,
mensaje
}];
La idea no es hacer validación perfecta. La idea es evitar basura operativa desde el primer paso.
Paso 6: Crear el registro en Notion
Agrega un nodo de Notion configurado para crear una página dentro de la base de datos.
Mapea los campos así:
database_id: TU_DATABASE_ID
Nombre: "{{ $json.nombre }}"
Email: "{{ $json.email }}"
Mensaje: "{{ $json.mensaje }}"
Fecha: "{{ $now.toISO() }}"
Estado: "Nuevo"
Si tu base tiene otros nombres de propiedades, ajústalos exactamente. Notion es sensible a la estructura esperada.
Paso 7: Devolver una respuesta al frontend
Después de guardar el lead, añade un nodo Respond to Webhook para devolver una respuesta consistente al frontend.
Por ejemplo:
{
"ok": true,
"message": "Lead registrado correctamente"
}
Si la validación falla, puedes responder con 400.
Si falla la escritura en Notion, conviene responder con 500 o un error controlado según el caso.
Paso 8: Conectar el formulario web
Desde el frontend, el envío puede hacerse con fetch:
fetch('https://tu-n8n.com/webhook/form-notion', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
nombre: form.nombre.value,
email: form.email.value,
mensaje: form.mensaje.value
})
});
Si quieres mejorar la UX, añade:
- loader mientras envía
- mensaje de éxito
- mensaje claro de error
- deshabilitar el botón durante el envío
Arquitectura mínima del flujo
Una versión razonable para empezar sería:
Webhook
↓
Validar campos
↓
Crear en Notion
↓
Responder OK
Y una versión un poco más seria:
Webhook
↓
Validar campos
↓
Normalizar datos
↓
Crear en Notion
↓
Notificar por Slack / email
↓
Responder OK
Errores comunes
1) No conectar la integration a la base
Es probablemente el error más común. Tener el token no alcanza: la base debe estar compartida con la integration.
2) Mapeo incorrecto de propiedades
Si en Notion la propiedad se llama Nombre completo y en n8n usas Nombre, fallará.
3) No validar el payload
Si aceptas cualquier cosa, en pocos días la base se llena de ruido, pruebas rotas o spam.
4) Exponer el webhook sin control
Si el endpoint queda completamente abierto, puedes recibir spam o abuso. Como mínimo, conviene:
- usar rate limiting si el entorno lo permite
- añadir validación adicional
- ocultar endpoints públicos cuando no sean necesarios
5) No distinguir error funcional de error técnico
No es lo mismo:
- “faltó el email”
- “Notion respondió 401”
Ambos son errores, pero requieren tratamiento distinto.
Cómo llevarlo a producción con más criterio
Si este flujo empieza a ser importante para el negocio, el siguiente paso no es “hacerlo más grande” sino hacerlo más confiable.
Recomendaciones:
- registrar logs de los envíos
- guardar timestamp y origen
- evitar duplicados por email si aplica
- añadir alertas si falla Notion
- separar validación de negocio y respuesta al usuario
- considerar una cola si el volumen crece
También puedes extender el flujo con:
- envío automático a Slack
- lead scoring inicial
- asignación de responsable
- sincronización con CRM
- emails de confirmación
Cuándo esta automatización deja de ser suficiente
Este patrón funciona muy bien al principio y en escenarios intermedios.
Pero puede quedarse corto cuando:
- hay múltiples formularios y campañas
- necesitas trazabilidad más compleja
- existe lógica comercial por etapas
- varias herramientas deben mantenerse sincronizadas
Ahí suele convenir diseñar un flujo más amplio o directamente una capa propia de backend.
Cierre
Automatizar un formulario web hacia Notion es una de esas mejoras pequeñas que se sienten rápido:
- menos trabajo manual
- menos errores de carga
- mejor visibilidad
- base lista para escalar
No es una solución “glamorosa”, pero sí una muy útil. Y eso suele ser mejor negocio que una demo espectacular sin impacto real.
Si quieres acelerar la implementación, puedes apoyarte en este recurso:
Y si quieres adaptar este flujo a tu proceso real, integrarlo con otras herramientas o convertirlo en algo más sólido para producción, puedes escribirme desde Sobre Mí.