Lo difícil de un workflow de n8n nunca es el camino feliz: es el webhook que reintenta, el envío duplicado y el nodo que se cae a las 3am mientras duermes. Esta plantilla obliga a que todo eso quede en la especificación antes de que arrastres un solo nodo al canvas: trigger y payload, plan nodo por nodo, una estrategia de idempotencia explícita, rutas de error, secretos por nombre y una marca honesta de dónde ya superaste el editor visual. Cópiala, cambia dos placeholders y deja de descubrir tus fallos en producción.

En resumen
- Lo que falla por defecto en cualquier prompt de «hazme un workflow de n8n» es que diseña el camino feliz y lo entrega tal cual. Sin manejo de reintentos, sin dedup, sin rama de error. Y te enteras cuando el mismo correo sale dos veces.
- Para arreglarlo, haz que el primer artefacto sea la especificación, no el canvas. Obliga a un plan nodo por nodo que nombre la clave de idempotencia y la ruta del Error Trigger antes de que exista un solo nodo.
- La idempotencia es la línea que todos borran y todos terminan lamentando. Los webhooks reintentan. n8n vuelve a ejecutar. Y una clave de dedup es lo único que separa el «procesado una vez» del «le cobramos dos veces a la tarjeta».
- Los secretos van en la especificación solo por NOMBRE, nunca por valor. El plan debe leerse como un checklist de credenciales, para que nada se filtre en un parámetro de nodo ni en un JSON exportado.
- Deja siempre la salida honesta. El prompt debe avisar cuándo un nodo Code o un servicio de verdad le gana a cablear el nodo #38. n8n es buen pegamento, pero mal lugar para criar un monstruo.
La mayoría de los prompts de «hazme un workflow de n8n» te devuelven el camino feliz y nada más. Describes una automatización, el modelo arma una cadena limpia de trigger a acción y todo se ve terminado. Hasta que el proveedor del webhook reintenta tras un timeout, el workflow se dispara dos veces y le mandas el mismo correo de factura a un cliente que ya pagó. El fallo nunca estuvo en los nodos que ves. Estuvo en el reintento, en el duplicado y en el crash de las 3am que nadie especificó. Esta plantilla obliga a meter todo eso en el diseño desde el principio. Abajo tienes el prompt completo, luego cómo leer su salida, cómo adaptarlo, las variables que tocas, algunas variantes y los detalles a cuidar que de verdad muerden.
01 · La plantilla
Esto es todo. Pégala en Claude (o en cualquier chat capaz) como tu primer mensaje, reemplaza los dos placeholders entre corchetes y deja que produzca una especificación que puedas revisar antes incluso de abrir n8n.
Eres un ingeniero de automatización senior diseñando un workflow de n8n. Te voy
a dar una descripción en lenguaje sencillo. Produce una ESPECIFICACIÓN nodo por
nodo, no un JSON terminado ni un discurso de venta. Asume que esto va a correr
sin supervisión en producción.
QUÉ QUIERO AUTOMATIZAR:
[UNA A TRES FRASES — el trigger, los pasos, y cómo se ve "listo"]
ENTORNO:
[DÓNDE CORRE + QUÉ TOCA — p. ej. n8n self-hosted, habla con Stripe + Postgres +
un canal de Slack; o: n8n Cloud, solo un webhook entrante y un email]
Produce la especificación en exactamente estas secciones:
1. TRIGGER
- Tipo de nodo (Webhook / Schedule / trigger de app) y por qué.
- El payload exacto que recibe (lista los campos que de verdad vas a usar).
- ¿Puede este trigger dispararse más de una vez para el mismo evento lógico?
(Los webhooks reintentan ante una respuesta non-2xx. Los schedules se
traslapan si una ejecución va lenta.) Dilo.
2. PLAN NODO POR NODO
- Numera cada nodo. Por cada uno: tipo, propósito en una línea, los campos
de entrada clave que lee y la salida clave que produce.
- Marca cada nodo que produzca un EFECTO SECUNDARIO (envía, cobra, escribe,
borra) — esos son los que nunca deben correr dos veces.
3. IDEMPOTENCIA (esto no te lo saltes)
- ¿Cuál es la CLAVE de dedup para este evento? (un id de orden, un id de
mensaje, un hash del payload: algo estable entre reintentos.)
- ¿Dónde dejamos registrado "ya procesado"? (una fila en la DB, un SETNX de
Redis, una verificación en el static data de n8n, una restricción única que
haga que el segundo insert falle a gritos.)
- Por cada nodo de efecto secundario del paso 2, di exactamente cómo se evita
una re-ejecución o cómo se hace seguro repetirla.
4. MANEJO DE ERRORES
- ¿Qué nodos pueden fallar de verdad (red, auth, rate limit, datos malos)?
- El workflow de Error Trigger: qué se registra, qué dispara alerta y si el
item se reintenta, se manda a dead-letter o se descarta.
- Distingue fallos REINTENTABLES (timeouts) de fallos VENENOSOS (input malo
que nunca va a funcionar): necesitan manejo distinto.
5. SECRETOS Y ACCESO
- Lista cada credencial que haga falta SOLO POR NOMBRE (p. ej. "Stripe API
key", "Postgres prod read-write"). Nunca devuelvas un valor ni un
placeholder que parezca uno.
- Anota el alcance mínimo que necesita cada credencial. Marca cualquier cosa
que correría con más acceso del que pide la tarea.
6. CHECK DE COMPLEJIDAD (sé honesto)
- Si algún paso necesita más de ~3 nodos de branching/looping/reshaping,
dilo y esboza la versión con nodo Code o servicio externo.
- Si todo el asunto va camino de pasar de ~15 nodos, nombra la costura donde
debería volverse un sub-workflow llamado o pasar a código de verdad.
REGLAS:
- Sin lenguaje de marketing. Nada de "sin fricción", "robusto", "potente".
- Si a mi descripción le falta algo que necesitas (una clave de dedup, una
política de error, una credencial), PREGUNTA antes de adivinar: lista los
huecos como preguntas.
- Prefiere menos nodos. Un workflow que puedo leer a las 3am le gana a uno
ingenioso.
Consejo
La sección que más palanca te da es la 3, idempotencia, y la línea que más palanca te da dentro de ella es "algo estable entre reintentos". Si el modelo elige una clave de dedup como un timestamp o un id aleatorio, no es una clave de dedup. Cambia en cada reintento y no deduplica nada. Insiste hasta que la clave salga del evento mismo.
02 · Cómo leer la especificación que te da
La salida es un documento de revisión, no una orden de armado. Léela en un orden concreto, porque los errores baratos se esconden siempre en el mismo sitio.
- Lee primero la sección 3. Si la idempotencia está contada en vago, tipo "verificamos si ya existe", sin nombrar la clave ni el store, el resto de la especificación está armado sobre arena. Un efecto secundario sin clave de dedup tarde o temprano se dispara doble. Es solo cuestión de tráfico.
- Cruza la 2 contra la 3. Cada nodo marcado como efecto secundario en la sección 2 tiene que tener su frase correspondiente en la sección 3 explicando cómo se hace segura una re-ejecución. Un nodo de efecto secundario sin línea de idempotencia es el bug que estás a punto de entregar.
- Después lee la sección 4 junto con la 3. Reintentos e idempotencia son el mismo problema visto desde dos lados. La sección 4 decide qué reintentar, la sección 3 hace que el reintento sea seguro. Si se contradicen, tipo "reintenta tres veces" sin dedup, esa es la contradicción que tienes que resolver antes de armar nada.
- La sección 5 es una auditoría de fugas. Revísala buscando cualquier valor que parezca real. Si el modelo escribió una key o una URL con pinta de verdadera, eso es un fallo del prompt. Regenera.
Atención
No empieces a arrastrar nodos hasta que la sección 3 nombre tanto la clave como el store. Los incidentes de n8n más caros no son los crashes. Un crash es ruidoso y lo arreglas. Son las acciones dobles silenciosas, el segundo cobro, el ticket duplicado, el cliente que recibió el mismo correo de cobranza cuatro veces porque el webhook reintentó cuatro veces. La clave de dedup es toda la defensa que tienes.
03 · Las tres cosas que esto fuerza y que de otro modo olvidarías
Una clave de dedup que sobreviva a un reintento
Los proveedores de webhooks reintentan ante cualquier respuesta non-2xx, incluido el timeout en el que tu workflow en realidad sí funcionó pero respondió lento. El propio n8n vuelve a ejecutar workflows en el retry manual y en algunas reentregas del queue mode. Así que "¿esto ya corrió?" es una pregunta que cada nodo de efecto secundario tiene que poder responder, y la única forma honesta de responderla es con una clave derivada del evento, como un id de orden, un id de evento de Stripe o un id de mensaje, que verificas contra un store antes de correr el efecto secundario.
-- El store de dedup confiable más barato: una restricción única que hace que el
-- segundo intento falle a gritos en vez de actuar dos veces. Inserta ANTES del
-- efecto secundario; si el insert falla por conflicto, el evento ya se manejó.
create table processed_events (
event_key text primary key,
workflow text not null,
processed_at timestamptz not null default now()
);
-- En el workflow: intenta el insert primero.
insert into processed_events (event_key, workflow)
values ('stripe_evt_3Nq...redactado', 'invoice-paid')
on conflict (event_key) do nothing
returning event_key;
-- 0 filas devueltas -> ya procesado, DETENTE. 1 fila -> sigue.
Una ruta de error que distinga reintentable de veneno
Un timeout hay que reintentarlo; un payload mal formado, no: reintentarlo solo quema ejecuciones y te vuelve a alertar para siempre. La especificación obliga a hacer esa división para que tu workflow de Error Trigger sepa la diferencia entre "vuelve a intentar en un minuto" y "este item nunca va a funcionar, mándalo a dead-letter y sigue".
Secretos que existen solo por nombre
Una especificación que lista "Stripe API key (solo scope de cobro), Postgres prod (read-write a processed_events + invoices)" es un checklist de credenciales que puedes pasarle a tu setup de secretos. El mismo instinto detrás de Infuse, donde el valor nunca vive dentro de la cosa que lo usa. Una especificación que pega una key en un parámetro de nodo es una fuga esperando a que la subas a un export del workflow.
04 · Variables y cómo adaptarla
La plantilla tiene dos placeholders entre corchetes y varias perillas que puedes mover.
- [UNA A TRES FRASES] es tu automatización en palabras sencillas. Nombra el trigger, los pasos y qué significa "listo". Una frase honesta le gana a tres rellenas de paja. Y si además puedes decir qué es lo que no debe pasar dos veces, dilo. Eso prepara la sección de idempotencia.
- [DÓNDE CORRE + QUÉ TOCA] es lo que vuelve concretas las secciones de secretos y de errores. "n8n self-hosted detrás de Traefik, habla con Stripe + Postgres + Slack" produce una especificación mucho más afilada que dejarlo en blanco, porque el modelo sabe qué credenciales y qué modos de fallo entran siquiera en juego.
Las perillas que vale la pena mover:
- El techo de complejidad. La plantilla usa ~15 nodos como la línea a partir de la cual sugiere partir en un sub-workflow o pasar a código. Bájalo a ~8 si mantienes tus workflows chicos a propósito. Súbelo solo si de verdad tienes un pipeline lineal largo sin branching.
- El store de dedup. Si no corres Postgres, cambia el enfoque de restricción única de la sección 3 por lo que tengas a mano: el SETNX de Redis, el static data del workflow de n8n o una clave única en tu sistema destino. La idea es "store nombrado", no "Postgres".
- La regla de preguntar-antes-de-adivinar. Es muro de carga. Si lo que quieres es un borrador totalmente sin supervisión, cámbiala por "haz el supuesto más seguro y márcalo", pero entonces te toca leer las marcas, porque una clave de dedup adivinada es peor que no tener especificación.
Importante
Mantén la sección 3 como obligatoria y, en tu cabeza, ponla por delante del "nodo por nodo" aunque en el texto vaya después. La forma más común de romper esta plantilla es tratar la idempotencia como un apéndice opcional y pasarla de largo. Si solo vas a hacer cumplir una sección en la revisión, que sea esta: que cada efecto secundario tenga una clave de dedup nombrada y un store nombrado.
05 · Variantes
Mismo esqueleto, distinto énfasis. Adapta la lista de secciones al trabajo que tengas.
- Disparado por Schedule, no por webhook. Los triggers de cron e intervalo no reintentan, pero se traslapan. Si una ejecución tarda más que el intervalo, n8n puede arrancar la siguiente antes de que termine la primera. Reemplaza el lenguaje de reintento de webhook en la sección 1 por una pregunta de traslape, "¿pueden estar corriendo dos ejecuciones de esto a la vez?", y haz que la especificación defina un run-lock (un flag en el static data de n8n o un lock a nivel de fila en tu DB) para que una ejecución lenta no quede pisada por la siguiente.
- Fan-out / procesamiento en lote. Cuando el workflow itera sobre muchos items (filas, archivos, destinatarios), la idempotencia tiene que ser por item, no por ejecución. Pídele a la especificación que haga la clave de dedup a nivel de item y que defina el comportamiento ante un fallo parcial: si el item 47 de 200 falla, ¿el lote se detiene, salta-y-sigue o hace rollback? Esta es la variante donde la mayoría de los equipos entrega un bug silencioso.
- Paso de IA en el medio. Si un nodo llama a un LLM, agrega una sección para el contrato de structured output (la forma JSON exacta que esperas de vuelta) y un fallback para cuando el modelo devuelva algo fuera de forma. Esto se parece a cómo se prepara un pipeline estilo Agent Orchestra. La salida del modelo es solo otro input no confiable, y el workflow tiene que validarla como tal.
06 · Detalles a cuidar
Los modos de fallo, más o menos en orden de cuán seguido muerden:
- Sin clave de dedup, acción doble silenciosa. La omisión más cara de todas. Un efecto secundario sin verificación de idempotencia funciona en todas las pruebas (solo disparas una vez) y falla en producción (el webhook reintenta). Nunca dejes pasar la revisión a un nodo de efecto secundario sin una clave nombrada.
- Una clave de dedup que cambia en el reintento. Peor que no tener ninguna, porque parece que está resuelta. Un timestamp, un id aleatorio o now() como clave no deduplica nada. La clave tiene que salir del evento para que el reintento produzca la misma clave.
- Insertar el registro de dedup DESPUÉS del efecto secundario. Si mandas el correo y después registras "procesado", un crash en el medio hace que el próximo reintento lo vuelva a mandar. Registra primero (o usa una restricción que falle antes de la acción), y luego actúa.
- Reintentar veneno para siempre. Un payload mal formado reintentado en el mismo horario que un timeout te va a volver a alertar en cada ciclo hasta que silencies la alerta, y ahí te quedas volando a ciegas. Separa lo reintentable de lo venenoso en la sección 4.
- El monstruo de 40 nodos. n8n es excelente pegamento y mal lugar para criar lógica de aplicación. Cuando la sección 6 te dice que muevas un paso a un nodo Code o a un servicio de verdad, no es el modelo tirando la toalla. Es la llamada honesta. Un workflow que no puedes leer a las 3am es un pasivo, no una automatización.
Una buena especificación de n8n no te dibuja el canvas. Saca a la luz el reintento, el duplicado y el crash mientras todavía son baratos de manejar. Lee primero la sección de idempotencia, haz que cada efecto secundario demuestre que no puede dispararse doble y trata el check de complejidad como permiso para dejar de cablear y empezar a programar. El objetivo no es un workflow terminado. Es uno que sigue haciendo lo correcto la segunda vez que llega el webhook.
Puntos clave
- Haz que la especificación sea el primer artefacto, no el canvas. Un plan nodo por nodo con la idempotencia nombrada y una rama de error real es algo que puedes revisar antes de que exista el primer nodo equivocado.
- La idempotencia no se negocia para ningún efecto secundario. Nombra una clave de dedup que sobreviva a los reintentos y nombra dónde registras «ya procesado»; lee esa sección antes que cualquier otra.
- Registra «procesado» ANTES del efecto secundario, o usa una restricción única que falle primero. Si registras después, un crash en el medio lo vuelve a enviar en el próximo reintento.
- Separa los fallos reintentables de los venenosos. Los timeouts se reintentan; los payloads mal formados van a dead-letter. Reintentar veneno solo te vuelve a alertar para siempre.
- Mantén los secretos en la especificación solo por nombre, y trata el check de complejidad como permiso para salir de n8n. Un workflow que no puedes leer a las 3am es un pasivo, no una automatización.
Preguntas frecuentes
¿Por qué pedir una especificación en vez de generar directo el JSON del workflow?
Porque el JSON esconde justo las decisiones que más necesitas revisar. Un workflow generado se ve completo apenas importa sin errores, que es exactamente cuando la clave de dedup que falta y la rama de error ausente se vuelven invisibles. La especificación es un documento plano y legible donde la idempotencia y el manejo de fallos son secciones con nombre que puedes cuestionar antes de que exista un solo nodo. Genera el JSON después de que la especificación pase la revisión, no en su lugar.
Mi workflow solo manda un mensaje de Slack. ¿De verdad necesito idempotencia?
Si un mensaje duplicado solo es molesto, puedes asumir el riesgo, pero déjalo dicho explícito en la especificación en vez de saltarte la sección. La trampa está en cómo crece la cosa: el día que ese nodo de Slack se convierte en «mensaje de Slack Y crear un ticket Y actualizar una fila», ya agregaste efectos secundarios donde el doble disparo se vuelve duplicados de verdad. Dejar la sección 3 como una línea pensada a propósito, «aquí un duplicado es aceptable, y por esto», hace que la decisión siga a la vista cuando el workflow crezca.
¿Qué hace que una clave de dedup sea buena, en concreto?
Tiene que ser estable entre reintentos y única por evento lógico. Estable quiere decir que sale del payload del evento, como un id de orden, un id de evento de Stripe o un id de mensaje, para que el reintento calcule exactamente la misma clave. Única quiere decir que dos eventos genuinamente distintos nunca chocan. Cualquier cosa que cambie en cada entrega (un timestamp, un id aleatorio, la hora a la que corrió el workflow) no pasa la prueba de estabilidad y no deduplica nada, por más que parezca una clave. Ante la duda, haz un hash de las partes del payload que definen la identidad del evento.
¿Cuándo debería la especificación decirme que deje n8n por un nodo Code o código real?
Cuando un solo paso necesita más de unos pocos nodos de branching, looping o reshaping de datos, esa lógica sale más barata y más testeable como nodo Code. Cuando el workflow entero pasa de unos quince nodos, por lo general ya cruzaste de «pegamento» a «aplicación»: esa es la costura para partirlo en un sub-workflow llamado o moverlo a un servicio chico. La señal no es solo el conteo de nodos; es si todavía podrías leer el workflow y confiar en él a las 3am en plena caída. Si la respuesta es no, dale el salto.
El modelo sigue inventando detalles que no le di. ¿Cómo lo detengo?
Mantén intacta la regla de «PREGUNTA antes de adivinar» y revisa que tu línea de ENTORNO esté completa. Casi todo lo que el modelo inventa lo inventa porque no tiene idea de qué toca el workflow, así que se fabrica un stack plausible. Dile dónde corre y con qué sistemas habla, y las suposiciones caen en seco. Si de verdad quieres un borrador sin supervisión, cambia la regla por «haz el supuesto más seguro y márcalo», pero ahí las marcas se vuelven lectura obligatoria, porque una clave de dedup adivinada y sin marcar es justo el tipo de detalle que muerde en producción.
¿En qué se diferencia esto de solo activar el retry incorporado de n8n en un nodo?
El retry a nivel de nodo maneja fallos transitorios dentro de una misma ejecución: vuelve a correr ese nodo tras un parpadeo de red. No hace nada por el problema de afuera: que el proveedor del webhook reentregue el evento entero, o que tú vuelvas a ejecutar el workflow a mano. Eso arranca una ejecución nueva que el retry a nivel de nodo ni siquiera ve. La idempotencia es la defensa en esa capa externa, y es la capa que la especificación te obliga a diseñar. Usa las dos: retry de nodo para los parpadeos, clave de dedup para las reentregas.
¿Prefieres que lo hagamos por ti?
Esto mismo lo construimos para negocios como el tuyo. La primera conversación es gratis y sin compromiso.
Escríbenos por WhatsAppPrimera conversación gratis. Te responde el fundador.
Recursos relacionados

El skill de flujos n8n: diseña automatizaciones que aguantan eventos duplicados y noches feas
Un skill de Claude Code que convierte el disparador y el resultado que describes en un flujo de n8n, con las partes poco vistosas armadas desde el inicio: chequeo de deduplicación, reintentos con backoff y una ruta de error, en vez de pegadas a la carrera después de la primera alerta a las 2am.

Programa un flujo de n8n con cron que no te dé sorpresas
Todo lo que debe correr a una hora fija (una sincronización nocturna, un chequeo cada hora, un reporte el lunes por la mañana) merece más que una línea de cron que vas a terminar olvidando. Esta guía recorre el patrón exacto que uso en un n8n self-hosted: un Schedule Trigger con la zona horaria correcta, trabajo idempotente que aguanta una doble corrida, un camino de error que de verdad te avisa, y un seguro para que un job lento nunca arranque encima del anterior.

Cuándo tu workflow de n8n ya pide a gritos pasar a código
Los workflows visuales son una maravilla hasta que la ramificación, las pruebas y el versionado los van convirtiendo en un lastre sin que lo notes. Aquí tienes un marco de decisión probado en producción: tres preguntas de diagnóstico, las señales que te dicen "no lo toques" y el patrón híbrido que de verdad uso casi siempre.