{"id":261,"date":"2026-10-22T13:57:14","date_gmt":"2026-10-22T11:57:14","guid":{"rendered":"https:\/\/n8nfacil.com\/?p=261"},"modified":"2026-11-02T18:50:06","modified_gmt":"2026-11-02T17:50:06","slug":"webhook-n8n-formulario","status":"publish","type":"post","link":"https:\/\/n8nfacil.com\/en\/webhook-n8n-formulario\/","title":{"rendered":"Webhook en n8n: recibe un formulario y responde con \u00e9xito o error"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Probado:<\/strong> n8n 2.44.5, 22 de octubre de 2026. Proyectos con datos ficticios.<\/p><p class=\"wp-block-paragraph\">Un webhook permite que una petici\u00f3n entrante inicie un workflow. En este proyecto recibiremos nombre y email, quitaremos los espacios y responderemos con un JSON. Si falta un campo, devolveremos un error 400 en lugar de aceptar silenciosamente datos incompletos.<\/p><h2 class=\"wp-block-heading\">Qu\u00e9 necesitas y qu\u00e9 vamos a probar<\/h2><p class=\"wp-block-paragraph\">Necesitas n8n local y el proyecto 06-webhook-formulario.json. Trabajaremos con una petici\u00f3n de prueba, sin conectar un formulario p\u00fablico ni guardar datos de personas reales. El nombre y el correo del ejemplo son ficticios.<\/p><p class=\"wp-block-paragraph\">El recorrido es Recibir formulario \u2192 Preparar campos \u2192 Campos completos. La condici\u00f3n conduce a Responder aceptado o Responder incompleto. Los dos \u00faltimos nodos controlan tanto el cuerpo de la respuesta como el c\u00f3digo HTTP.<\/p><h2 class=\"wp-block-heading\">1. Importa y revisa el Webhook<\/h2><p class=\"wp-block-paragraph\">Descomprime el ZIP e importa el JSON en un workflow nuevo. En Recibir formulario el m\u00e9todo es POST y la ruta es n8nfacil-formulario-demo. El modo de respuesta utiliza un nodo Respond to Webhook. Eso permite tomar una decisi\u00f3n antes de contestar.<\/p><p class=\"wp-block-paragraph\">n8n distingue URL de prueba y URL de producci\u00f3n. Para esta gu\u00eda utiliza Test URL y pulsa Execute workflow en el lienzo para ejecutar el recorrido completo. Listen for test event dentro del nodo permite recoger solo la entrada del disparador; no equivale a probar las respuestas de los nodos finales. La URL de prueba solo funciona mientras n8n espera ese evento. No publiques el workflow para hacer este ensayo.<\/p><h2 class=\"wp-block-heading\">2. Env\u00eda datos ficticios<\/h2><p class=\"wp-block-paragraph\">Con n8n esperando, env\u00eda un POST a http:\/\/localhost:5678\/webhook-test\/n8nfacil-formulario-demo con Content-Type application\/json y este cuerpo: <code>{\"nombre\":\"  Ana  \",\"email\":\"  ANA@EXAMPLE.COM  \"}<\/code>.<\/p><p class=\"wp-block-paragraph\">En Windows puedes abrir PowerShell y ejecutar el comando incluido m\u00e1s abajo. Guarda el resultado para compararlo con la salida del workflow. Cada nueva prueba puede requerir volver a activar la escucha del webhook de prueba.<\/p><pre class=\"wp-block-code\"><code>$datos = @{ nombre = '  Ana  '; email = '  ANA@EXAMPLE.COM  ' } | ConvertTo-Json\nInvoke-RestMethod -Method Post -Uri 'http:\/\/localhost:5678\/webhook-test\/n8nfacil-formulario-demo' -ContentType 'application\/json' -Body $datos<\/code><\/pre><p class=\"wp-block-paragraph\">Esto es una simulaci\u00f3n del env\u00edo de un formulario. Si conectas despu\u00e9s un formulario HTML con otro formato de contenido, comprueba c\u00f3mo llega su cuerpo: no des por hecho que tendr\u00e1 exactamente la misma estructura.<\/p><h2 class=\"wp-block-heading\">3. Normaliza sin asumir el tipo de entrada<\/h2><p class=\"wp-block-paragraph\">El nodo Preparar campos lee $json.body.nombre y $json.body.email. Solo aplica trim a valores de tipo texto; si falta el campo o llega otro tipo, produce un texto vac\u00edo. El email adem\u00e1s pasa a min\u00fasculas.<\/p><p class=\"wp-block-paragraph\">Esta comprobaci\u00f3n evita llamar a trim sobre un dato inexistente. No valida que la direcci\u00f3n de correo exista ni que su formato sea correcto. La condici\u00f3n de este proyecto \u00fanicamente exige dos textos no vac\u00edos despu\u00e9s de limpiarlos.<\/p><h2 class=\"wp-block-heading\">4. Devuelve una respuesta coherente<\/h2><p class=\"wp-block-paragraph\">Campos completos comprueba que nombre y email tienen longitud mayor que cero. La rama verdadera llega a Responder aceptado, que devuelve HTTP 200 y <code>{\"ok\":true,\"nombre\":\"Ana\",\"email\":\"ana@example.com\"}<\/code> para la entrada inicial.<\/p><p class=\"wp-block-paragraph\">La rama falsa usa Responder incompleto y devuelve HTTP 400 con <code>{\"ok\":false,\"error\":\"nombre y email son obligatorios\"}<\/code>. El c\u00f3digo permite que quien env\u00eda el formulario distinga un dato incompleto de una respuesta correcta sin interpretar un texto ambiguo.<\/p><h2 class=\"wp-block-heading\">5. Prueba tambi\u00e9n el caso incompleto<\/h2><p class=\"wp-block-paragraph\">Vuelve a activar la escucha y env\u00eda solo <code>{\"nombre\":\"Ana\"}<\/code>. Esperamos la rama falsa y el c\u00f3digo 400. PowerShell puede presentar ese estado como un error de la petici\u00f3n: es el comportamiento esperado de esta prueba, no significa necesariamente que n8n haya fallado.<\/p><p class=\"wp-block-paragraph\">Repite con nombre vac\u00edo o espacios si quieres ampliar el ensayo. Revisa siempre la \u00faltima ejecuci\u00f3n. Una captura verde de la prueba anterior no demuestra que la petici\u00f3n actual haya recorrido el mismo camino.<\/p><h2 class=\"wp-block-heading\">Localhost y producci\u00f3n no son lo mismo<\/h2><p class=\"wp-block-paragraph\">Localhost significa el propio equipo desde el que se hace la petici\u00f3n. Una web alojada en Internet no llega a tu n8n local usando esa direcci\u00f3n. Para una integraci\u00f3n real necesitar\u00e1s una URL accesible y una configuraci\u00f3n adecuada de HTTPS, autenticaci\u00f3n, validaci\u00f3n y l\u00edmites. Este tutorial no expone tu contenedor a Internet.<\/p><h2 class=\"wp-block-heading\">Errores frecuentes y siguiente paso<\/h2><p class=\"wp-block-paragraph\">Un 404 en la URL de prueba suele requerir revisar la ruta, el m\u00e9todo POST y si la escucha est\u00e1 activa. Si no llega una respuesta, comprueba el modo de respuesta del Webhook y las conexiones hacia los nodos Respond to Webhook. Una integraci\u00f3n posterior con Google Sheets debe a\u00f1adir sus propias reglas de validaci\u00f3n y tratamiento de duplicados.<\/p><p class=\"wp-block-paragraph\">Fuentes de referencia: <a href=\"https:\/\/docs.n8n.io\/integrations\/builtin\/core-nodes\/n8n-nodes-base.webhook\/\">https:\/\/docs.n8n.io\/integrations\/builtin\/core-nodes\/n8n-nodes-base.webhook\/<\/a> y <a href=\"https:\/\/docs.n8n.io\/integrations\/builtin\/core-nodes\/n8n-nodes-base.respondtowebhook\/\">https:\/\/docs.n8n.io\/integrations\/builtin\/core-nodes\/n8n-nodes-base.respondtowebhook\/<\/a><\/p><h2 class=\"wp-block-heading\">Capturas de las pruebas reales<\/h2><!-- wp:image <code>{\"id\":250,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"}<\/code> --><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1101\" height=\"874\" src=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-entrada.jpg\" alt=\"Cuerpo JSON ficticio recibido por el Webhook de prueba.\" class=\"wp-image-250\" srcset=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-entrada.jpg 1101w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-entrada-300x238.jpg 300w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-entrada-1024x813.jpg 1024w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-entrada-768x610.jpg 768w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-entrada-15x12.jpg 15w\" sizes=\"auto, (max-width: 1101px) 100vw, 1101px\" \/><figcaption class=\"wp-element-caption\">Cuerpo JSON ficticio recibido por el Webhook de prueba.<\/figcaption><\/figure><!-- \/wp:post-content --><!-- wp:image <code>{\"id\":251,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"}<\/code> --><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1101\" height=\"874\" src=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-valido.jpg\" alt=\"Recorrido del formulario completo hacia la respuesta aceptada.\" class=\"wp-image-251\" srcset=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-valido.jpg 1101w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-valido-300x238.jpg 300w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-valido-1024x813.jpg 1024w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-valido-768x610.jpg 768w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-valido-15x12.jpg 15w\" sizes=\"auto, (max-width: 1101px) 100vw, 1101px\" \/><figcaption class=\"wp-element-caption\">Recorrido del formulario completo hacia la respuesta aceptada.<\/figcaption><\/figure><!-- \/wp:image --><!-- wp:image <code>{\"id\":252,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"}<\/code> --><figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1101\" height=\"874\" src=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-incompleto.jpg\" alt=\"Recorrido del formulario sin email hacia la respuesta de error.\" class=\"wp-image-252\" srcset=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-incompleto.jpg 1101w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-incompleto-300x238.jpg 300w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-incompleto-1024x813.jpg 1024w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-incompleto-768x610.jpg 768w, https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-incompleto-15x12.jpg 15w\" sizes=\"auto, (max-width: 1101px) 100vw, 1101px\" \/><figcaption class=\"wp-element-caption\">Recorrido del formulario sin email hacia la respuesta de error.<\/figcaption><\/figure><!-- \/wp:image --><!-- wp:heading --><h2 class=\"wp-block-heading\">Descargar el proyecto<\/h2><!-- \/wp:heading --><!-- wp:paragraph --><p><a href=\"https:\/\/n8nfacil.com\/wp-content\/uploads\/2026\/10\/06-webhook-formulario.zip\">Descargar workflow en ZIP<\/a>. Descomprime e importa el JSON en un workflow nuevo. El archivo no contiene credenciales.<\/p><!-- \/wp:paragraph --><!-- wp:paragraph --><p><a href=\"https:\/\/n8nfacil.com\/en\/instalar-n8n-windows-docker\/\">Instalar n8n en Windows con Docker<\/a> \u00b7 <a href=\"https:\/\/n8nfacil.com\/en\/limpiar-datos-n8n-edit-fields\/\">Limpiar datos con Edit Fields<\/a> \u00b7 <a href=\"https:\/\/n8nfacil.com\/en\/nodo-if-n8n-clasificar-pedidos\/\">Practicar condiciones con IF<\/a><\/p><!-- \/wp:paragraph --><!-- wp:heading --><h2 class=\"wp-block-heading\">Contin\u00faa aprendiendo<\/h2><!-- \/wp:heading --><!-- wp:paragraph --><p><a href=\"https:\/\/n8nfacil.com\/en\/importar-exportar-workflows-n8n\/\">C\u00f3mo importar y exportar workflows en n8n sin perderte con el JSON<\/a> \u00b7 <a href=\"https:\/\/n8nfacil.com\/en\/http-request-n8n-api\/\">HTTP Request en n8n: consulta una API y selecciona los datos que necesitas<\/a><\/p><!-- \/wp:paragraph --><!-- wp:html --><section><h2>Construye este workflow desde cero<\/h2><p>Puedes crear los nodos manualmente en lugar de importar el ZIP. Los ajustes siguientes corresponden al archivo del proyecto y a la versi\u00f3n indicada al comienzo de la gu\u00eda; los nombres de los controles pueden variar en otras versiones.<\/p><h3>Recibir formulario \u00b7 Webhook<\/h3><p>M\u00e9todo POST, Path n8nfacil-formulario-demo y respuesta mediante Respond to Webhook. Usa la Test URL y pulsa Listen for test event antes de enviar la petici\u00f3n.<\/p><h3>Preparar campos \u00b7 Edit Fields (Set)<\/h3><p>A\u00f1ade Edit Fields (Set) y selecciona Manual Mapping. Crea los siguientes campos; utiliza Fixed para valores literales y Expression para f\u00f3rmulas. Conserva solo los campos configurados para reproducir la salida del proyecto.<\/p><figure class=\"wp-block-table\"><table><thead><tr><th>Campo<\/th><th>Tipo<\/th><th>Modo<\/th><th>Valor<\/th><\/tr><\/thead><tbody><tr><td>nombre<\/td><td>string<\/td><td>Expression<\/td><td><code>{{ typeof $json.body?.nombre === &quot;string&quot; ? $json.body.nombre.trim() : &quot;&quot; }}<\/code><\/td><\/tr><tr><td>email<\/td><td>string<\/td><td>Expression<\/td><td><code>{{ typeof $json.body?.email === &quot;string&quot; ? $json.body.email.trim().toLowerCase() : &quot;&quot; }}<\/code><\/td><\/tr><\/tbody><\/table><\/figure><p>Las comillas de los valores de texto de la tabla indican que son cadenas: no las escribas en el campo Fixed. Conserva los espacios cuando formen parte de los datos de prueba.<\/p><h3>Campos completos \u00b7 IF<\/h3><p>Configura las condiciones de la tabla del tutorial. Mant\u00e9n el tipo correcto del valor y conecta las salidas true y false a sus nodos de resultado.<\/p><h3>Responder aceptado \u00b7 Respond to Webhook<\/h3><p>Selecciona Respond With: JSON. Introduce el cuerpo como expresi\u00f3n y configura el c\u00f3digo HTTP en Options \u2192 Response Code.<\/p><pre><code>{{ { ok: true, nombre: $json.nombre, email: $json.email } }}<\/code><\/pre><p>C\u00f3digo HTTP: 200.<\/p><h3>Responder incompleto \u00b7 Respond to Webhook<\/h3><p>Selecciona Respond With: JSON. Introduce el cuerpo como expresi\u00f3n y configura el c\u00f3digo HTTP en Options \u2192 Response Code.<\/p><pre><code>{{ { ok: false, error: &quot;nombre y email son obligatorios&quot; } }}<\/code><\/pre><p>C\u00f3digo HTTP: 400.<\/p><h3>Conecta los nodos y revisa el recorrido<\/h3><ul><li>Recibir formulario \u2192 Preparar campos.<\/li><li>Preparar campos \u2192 Campos completos.<\/li><li>Campos completos \u2192 Responder aceptado (salida 0, contando desde 0).<\/li><li>Campos completos \u2192 Responder incompleto (salida 1, contando desde 0).<\/li><\/ul><p>Ejecuta desde el inicio y abre la salida de cada nodo. Comprueba los valores y el n\u00famero de elementos antes de seguir. Un nodo verde indica ejecuci\u00f3n completada, pero debes comparar su salida con los resultados esperados de esta gu\u00eda.<\/p><\/section><!-- \/wp:html --><!-- wp:paragraph --><p><strong>Autor:<\/strong> Javier Fern\u00e1ndez, estudiante. <a href=\"https:\/\/n8nfacil.com\/en\/sobre\/\">C\u00f3mo documento mis pr\u00e1cticas<\/a> \u00b7 <a href=\"https:\/\/n8nfacil.com\/en\/contacto\/\">Comunicar un error<\/a>.<\/p><!-- \/wp:paragraph -->","protected":false},"excerpt":{"rendered":"<p>Recibe datos con Webhook en n8n, comprueba campos y responde con JSON. Proyecto local probado con casos correctos e incompletos.<\/p>","protected":false},"author":1,"featured_media":251,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-261","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apis-webhooks"],"_links":{"self":[{"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/posts\/261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/comments?post=261"}],"version-history":[{"count":5,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/posts\/261\/revisions"}],"predecessor-version":[{"id":313,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/posts\/261\/revisions\/313"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/media\/251"}],"wp:attachment":[{"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/media?parent=261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/categories?post=261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/n8nfacil.com\/en\/wp-json\/wp\/v2\/tags?post=261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}