<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Awakate</title>
    <description>The latest articles on DEV Community by Awakate (awakate).</description>
    <link>https://dev.to/awakate</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F15682%2F4ce64d6c-f424-4c03-8885-a9df61c65ecf.png</url>
      <title>DEV Community: Awakate</title>
      <link>https://dev.to/awakate</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/awakate"/>
    <language>en</language>
    <item>
      <title>Qué registrar cuando falla una automatización antes de volver a ejecutarla</title>
      <dc:creator>Juan Carlos Carpio Cámara</dc:creator>
      <pubDate>Fri, 30 Oct 2026 18:05:55 +0000</pubDate>
      <link>https://dev.to/awakate/que-registrar-cuando-falla-una-automatizacion-antes-de-volver-a-ejecutarla-4nkc</link>
      <guid>https://dev.to/awakate/que-registrar-cuando-falla-una-automatizacion-antes-de-volver-a-ejecutarla-4nkc</guid>
      <description>&lt;p&gt;Un flujo puede fallar después de haber hecho parte del trabajo. Quizá ha creado una ficha en el CRM, pero no ha enviado la confirmación. Si solo guardas un mensaje como "ha ocurrido un error", después tendrás que adivinar qué se puede repetir.&lt;/p&gt;

&lt;p&gt;Antes de añadir más reintentos, define el registro que permitirá revisar una ejecución.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Identifica la operación, no solo el intento
&lt;/h2&gt;

&lt;p&gt;Guarda un identificador de la operación de negocio y otro de la ejecución. El primero permite reconocer que dos intentos pertenecen al mismo alta o solicitud. El segundo ayuda a investigar qué ocurrió en una ejecución concreta.&lt;/p&gt;

&lt;p&gt;Si guardas un identificador de cliente, usa el mínimo necesario. El registro de errores no necesita una copia completa de sus datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Anota el último paso confirmado
&lt;/h2&gt;

&lt;p&gt;Para una secuencia formulario, CRM y correo, distingue al menos estos estados:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paso&lt;/th&gt;
&lt;th&gt;Qué registrar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recepción&lt;/td&gt;
&lt;td&gt;Identificador de operación y fecha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM&lt;/td&gt;
&lt;td&gt;Si se ha confirmado la escritura y referencia del registro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correo&lt;/td&gt;
&lt;td&gt;Si el proveedor ha aceptado el envío y su referencia, cuando exista&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revisión&lt;/td&gt;
&lt;td&gt;Motivo, persona responsable y estado de resolución&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Que una petición haya salido no demuestra que el servicio remoto no la haya ejecutado. Si se pierde la respuesta, el resultado puede ser desconocido. Comprueba el estado remoto antes de repetir una acción con efectos externos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Un registro que permite decidir
&lt;/h3&gt;

&lt;p&gt;Ejemplo ficticio: el CRM confirmó la creación de una ficha. El proveedor de correo rechazó la autenticación antes de aceptar el mensaje de bienvenida.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;Ejemplo ficticio&lt;/th&gt;
&lt;th&gt;Para qué sirve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Operación&lt;/td&gt;
&lt;td&gt;alta_demo_1042&lt;/td&gt;
&lt;td&gt;Reconocer el alta aunque tenga varios intentos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejecución&lt;/td&gt;
&lt;td&gt;intento_demo_03&lt;/td&gt;
&lt;td&gt;Identificar este intento concreto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Último paso confirmado&lt;/td&gt;
&lt;td&gt;CRM, ficha demo_582&lt;/td&gt;
&lt;td&gt;Conservar la referencia de lo que ya existe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correo&lt;/td&gt;
&lt;td&gt;No aceptado, error de autenticación&lt;/td&gt;
&lt;td&gt;Separar un rechazo conocido de un resultado incierto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estado&lt;/td&gt;
&lt;td&gt;Revisión pendiente&lt;/td&gt;
&lt;td&gt;Hacer visible que requiere una intervención&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Siguiente acción&lt;/td&gt;
&lt;td&gt;Corregir el acceso y reanudar el envío&lt;/td&gt;
&lt;td&gt;Evitar volver a crear la ficha del CRM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No necesitas copiar el nombre, el correo o los documentos del cliente a este registro de errores. Usa una referencia interna con acceso restringido a los datos que hagan falta para resolver el caso.&lt;/p&gt;

&lt;p&gt;Si el proveedor aceptó el mensaje y después se perdió la respuesta, la decisión cambia: el envío queda incierto. Consulta la referencia que admita ese proveedor o deriva a revisión; volver a enviarlo sin comprobar puede duplicarlo.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Separa lo temporal de lo que necesita una corrección
&lt;/h2&gt;

&lt;p&gt;Un límite de peticiones puede admitir espera y reintento. Una credencial revocada o un campo obligatorio ausente requieren otra acción. No conviene usar la misma política para ambos casos.&lt;/p&gt;

&lt;p&gt;Registra la clase de error, el número de intentos y la siguiente acción. Si el resultado es desconocido, indícalo; no lo conviertas automáticamente en un fallo sin efectos.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Deja una salida para la revisión humana
&lt;/h2&gt;

&lt;p&gt;Cuando se alcance el límite de intentos, el caso debe quedar visible para una persona. Un registro útil explica qué operación está pendiente, qué se ha confirmado y qué decisión falta.&lt;/p&gt;

&lt;p&gt;Para reanudar, confirma primero que la operación no se completó por otra vía. Después recupera desde el paso seguro y conserva el resultado de la revisión.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Prueba el fallo después de cada escritura externa
&lt;/h2&gt;

&lt;p&gt;No pruebes solo el recorrido correcto. Simula una respuesta perdida después de la escritura en CRM y comprueba que la recuperación no crea otra ficha. Haz lo mismo con el envío del correo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo encaja en n8n
&lt;/h2&gt;

&lt;p&gt;n8n permite asignar un workflow de errores a otro workflow y usar Error Trigger para tratar una ejecución fallida. Ese aviso ayuda a detectar el fallo; la recuperación necesita también el estado de la operación de negocio que has definido.&lt;/p&gt;

&lt;p&gt;La información del error varía según dónde ocurra. No presupongas que siempre habrá una URL o un identificador de ejecución: la documentación indica que dependen de que la ejecución se haya guardado y pueden faltar en errores del trigger. Diseña una salida para esos casos.&lt;/p&gt;

&lt;p&gt;Referencia: &lt;a href="https://docs.n8n.io/flow-logic/error-handling/" rel="noopener noreferrer"&gt;manejo de errores en la documentación oficial de n8n&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;La herramienta concreta puede cambiar. La pregunta es la misma: ¿qué sabemos que ya ocurrió y qué podemos repetir sin producir un efecto extra?&lt;/p&gt;

&lt;p&gt;Si estás definiendo el proceso completo, esta &lt;a href="https://awakate.com/blog/automatizar-onboarding-clientes-ia" rel="noopener noreferrer"&gt;guía para automatizar el alta de clientes&lt;/a&gt; sirve como contexto para ordenar los pasos antes de conectarlos.&lt;/p&gt;

&lt;p&gt;Este contenido se ha preparado con ayuda de inteligencia artificial. Los datos del ejemplo son ficticios. Es un patrón de diseño; no incluye un workflow ejecutable ni resultados medidos de una implantación.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>n8n</category>
      <category>automation</category>
    </item>
    <item>
      <title>Webhooks en n8n: evita duplicados al conectar tu CRM</title>
      <dc:creator>Juan Carlos Carpio Cámara</dc:creator>
      <pubDate>Wed, 28 Oct 2026 21:56:44 +0000</pubDate>
      <link>https://dev.to/awakate/webhooks-en-n8n-evita-duplicados-al-conectar-tu-crm-58jo</link>
      <guid>https://dev.to/awakate/webhooks-en-n8n-evita-duplicados-al-conectar-tu-crm-58jo</guid>
      <description>&lt;p&gt;Un formulario envía una consulta. La conexión tarda. El origen repite la entrega y aparecen dos oportunidades en el CRM.&lt;/p&gt;

&lt;p&gt;Hay otro fallo menos visible: la ejecución termina sin errores, pero durante la transformación desaparece el campo que explicaba qué necesitaba esa persona.&lt;/p&gt;

&lt;p&gt;Este ejemplo es didáctico. Propone una forma de revisar esas dos situaciones antes de activar una integración. No describe una implantación medida ni una plantilla lista para importar.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Define qué entrega estás procesando
&lt;/h2&gt;

&lt;p&gt;Empieza por el identificador del evento o envío que proporciona el origen. Combínalo con el sistema y la cuenta de procedencia cuando haga falta para evitar colisiones.&lt;/p&gt;

&lt;p&gt;Por ejemplo, una clave puede identificar la cuenta, el formulario y el envío &lt;code&gt;envio_001&lt;/code&gt;. Si el proveedor vuelve a entregar ese mismo envío, la clave debe mantenerse.&lt;/p&gt;

&lt;p&gt;El correo de la persona cumple otra función. Una misma persona puede enviar una consulta hoy y otra distinta mañana. Bloquear cualquier envío que repita correo puede ocultar una petición legítima.&lt;/p&gt;

&lt;p&gt;Si el origen no ofrece un identificador estable, hay que diseñar esa identificación. Un hash del contenido o una ventana de tiempo son alternativas con compromisos: pueden confundir dos consultas iguales que sí eran independientes. Documenta esa decisión antes de automatizarla.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Conserva los campos que importan
&lt;/h2&gt;

&lt;p&gt;Escribe una tabla pequeña con tres columnas: campo recibido, campo normalizado y destino.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recibido&lt;/th&gt;
&lt;th&gt;Normalizado&lt;/th&gt;
&lt;th&gt;Destino&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identificador del envío&lt;/td&gt;
&lt;td&gt;&lt;code&gt;event_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registro de procesamiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contacto del CRM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motivo de la consulta&lt;/td&gt;
&lt;td&gt;&lt;code&gt;request_summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Oportunidad o nota&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Página del formulario&lt;/td&gt;
&lt;td&gt;&lt;code&gt;entry_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Origen de la consulta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;El campo de origen puede perderse si el paso de normalización conserva solo nombre y correo. La llamada siguiente puede ser válida aunque la información llegue incompleta.&lt;/p&gt;

&lt;p&gt;Prueba con valores ficticios que puedas reconocer después. Comprueba el resultado en el registro final, además de mirar los datos recibidos por el webhook. Define qué campos ausentes deben detener el proceso y cuáles pueden quedar vacíos.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Registra la recepción antes de darla por aceptada
&lt;/h2&gt;

&lt;p&gt;Guarda la clave y un estado de procesamiento en un registro persistente. Para evitar que dos ejecuciones simultáneas acepten la misma entrega como nueva, la exclusión debe aplicarse de forma atómica.&lt;/p&gt;

&lt;p&gt;Una base de datos con una restricción única sobre la clave es una posibilidad. En PostgreSQL, &lt;code&gt;ON CONFLICT&lt;/code&gt; permite decidir qué hacer cuando una inserción encuentra un conflicto. Consultar primero y escribir después, sin protección adicional, deja una carrera entre ambas operaciones.&lt;/p&gt;

&lt;p&gt;Después, una sola ejecución debe obtener el derecho a procesar el evento. Las demás consultan su estado y no repiten la creación. Si se interrumpe el procesamiento, debe existir una recuperación definida; un estado "procesando" no puede bloquearlo para siempre.&lt;/p&gt;

&lt;p&gt;Si respondes al origen antes de terminar, hazlo después de guardar de forma duradera lo que has aceptado. En n8n puedes configurar cuándo responde el Webhook. Una respuesta HTTP de recepción y un alta terminada en el CRM son estados diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Resuelve el resultado incierto antes de repetir
&lt;/h2&gt;

&lt;p&gt;Imagina que la petición al CRM termina con un timeout. El CRM podría haber creado la oportunidad y haberse perdido la respuesta.&lt;/p&gt;

&lt;p&gt;Repetir la creación inmediatamente puede duplicarla.&lt;/p&gt;

&lt;p&gt;Si la API de destino admite claves de idempotencia, utiliza el mecanismo documentado por ese proveedor. No basta con añadir una cabecera que el servidor no reconoce.&lt;/p&gt;

&lt;p&gt;Si admite una referencia externa consultable, guarda y busca esa referencia para conciliar el resultado antes de volver a escribir. Si no ofrece ninguna de esas garantías, deriva el caso incierto a revisión o diseña otra integración. Un registro local, por sí solo, no garantiza una única escritura en dos sistemas distintos.&lt;/p&gt;

&lt;p&gt;El estado "completado" debe reflejar un resultado confirmado. Para el resto, distingue error recuperable, resultado incierto y revisión pendiente. Cada uno necesita una salida clara.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Prueba las excepciones de forma deliberada
&lt;/h2&gt;

&lt;p&gt;Estas son las comprobaciones que usaría antes de activar el flujo. Son resultados esperados, no pruebas ejecutadas sobre este ejemplo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situación&lt;/th&gt;
&lt;th&gt;Resultado esperado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Entrega nueva y válida&lt;/td&gt;
&lt;td&gt;Se registra y llega al CRM con todos los campos necesarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Misma entrega repetida&lt;/td&gt;
&lt;td&gt;Se consulta su estado sin crear otra oportunidad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dos copias simultáneas&lt;/td&gt;
&lt;td&gt;Solo una obtiene el derecho a procesarla&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mismo correo con otro identificador de envío&lt;/td&gt;
&lt;td&gt;Se evalúa como consulta nueva&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timeout después de enviar al CRM&lt;/td&gt;
&lt;td&gt;Se concilia el resultado antes de repetir la escritura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Falta un campo obligatorio&lt;/td&gt;
&lt;td&gt;Se registra un motivo claro y no se crea un alta incompleta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interrupción tras reservar el evento&lt;/td&gt;
&lt;td&gt;La recuperación detecta el trabajo pendiente y aplica la política definida&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Usa datos sintéticos durante estas pruebas. El registro técnico necesita explicar qué pasó, sin copiar por defecto todo el contenido personal del formulario.&lt;/p&gt;

&lt;h2&gt;
  
  
  Del webhook al proceso completo
&lt;/h2&gt;

&lt;p&gt;Estas comprobaciones cubren la entrega técnica. El alta también incluye qué información se pide, quién revisa las excepciones y qué ocurre después de crear la ficha. La &lt;a href="https://awakate.com/blog/automatizar-onboarding-clientes-ia" rel="noopener noreferrer"&gt;guía del proceso de alta de clientes&lt;/a&gt; desarrolla ese contexto.&lt;/p&gt;

&lt;p&gt;Antes de activar tu integración, elige uno de los fallos de la tabla y fuerza esa situación en un entorno de prueba. Comprueba qué queda registrado y cómo se recupera el proceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias técnicas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/" rel="noopener noreferrer"&gt;Webhook de n8n: recepción y opciones de respuesta&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.n8n.io/flow-logic/error-handling/" rel="noopener noreferrer"&gt;Manejo de errores en n8n&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/current/ddl-constraints.html" rel="noopener noreferrer"&gt;Restricciones de unicidad en PostgreSQL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/current/sql-insert.html" rel="noopener noreferrer"&gt;INSERT y ON CONFLICT en PostgreSQL&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este texto se ha preparado con ayuda de IA. Presenta un patrón de diseño y ejemplos didácticos; no incluye un flujo ejecutable ni resultados de una prueba de producción.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>webdev</category>
      <category>automation</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
