Manejo del procesamiento exactamente una vez con Webhooks

Hola a todos, me enfrento a un problema más avanzado de confiabilidad en n8n relacionado con flujos de trabajo activados por webhook.
Tengo un flujo de trabajo:
Webhook → Procesar → Base de datos
El servicio externo a veces reintenta el mismo evento de webhook (por ejemplo, debido a tiempos de espera agotados), por lo que n8n recibe solicitudes duplicadas con el mismo payload.
Ahora mismo, esto causa:
• Registros duplicados en la base de datos
• Acciones duplicadas descendentes (correos electrónicos, llamadas API, etc.)
Ejemplo de payload:
{
“event_id”: “abc123”,
“user_id”: 42,
“action”: “created”
}
Si se envía el mismo event_id dos veces, se procesa dos veces.
Lo que he intentado
• Verificaciones básicas en un nodo Function
• Upserts en la base de datos
• Añadir retrasos
Pero ninguno de estos garantiza completamente el procesamiento exactamente una vez.
El desafío
Quiero asegurar:
• Cada evento se procesa solo una vez
• Manejo seguro de reintentos
• Ningún efecto secundario duplicado

Describe el problema/error/pregunta

¿Cuál es el mensaje de error (si lo hay)?

Por favor, comparte tu flujo de trabajo

(Selecciona los nodos en tu lienzo y usa los atajos de teclado CMD+C/CTRL+C y CMD+V/CTRL+V para copiar y pegar el flujo de trabajo.)

Comparte el resultado devuelto por el último nodo

Información sobre tu configuración de n8n

  • Versión de n8n:
  • Base de datos (predeterminada: SQLite):
  • Configuración EXECUTIONS_PROCESS de n8n (predeterminada: own, main):
  • Ejecutando n8n a través de (Docker, npm, n8n cloud, aplicación de escritorio):
  • Sistema operativo:

Hola @Keira_Becky Estás lidiando con un problema de idempotencia, y la única solución confiable es rastrear eventos procesados; no hay “exactamente una vez” integrado en n8n.

Usa el event_id como clave única y deja que tu base de datos la refuerce.

Intenta esto

  1. Almacena event_id en la BD con restricción UNIQUE

CREATE TABLE events (
event_id TEXT PRIMARY KEY,
payload JSONB
);

  1. Inserta antes de procesar

INSERT INTO events (event_id, payload)
VALUES ({{$json.event_id}}, {{$json}})
ON CONFLICT (event_id) DO NOTHING;

Entonces si la inserción tiene éxito → procesa el evento
Si hay conflicto → omite (ya fue procesado)

Gracias @Niffzy

Lo resolví insertando antes del procesamiento