Tutorial · n8n · Director Legal / CEO

Vigilancia Automática de Vencimientos de Contratos

Flujo que procesa contratos en PDF con IA local (Ollama/Mistral), extrae fechas de vencimiento y cláusulas de preaviso, actualiza el registro maestro y envía alertas escalonadas 30, 15 y 7 días antes de la fecha límite.

• Evento + Diarion8n Self-hosted~4 horas de configuración4 pasosLegalAvanzado
← Volver a todos los tutoriales

¿Qué hace este flujo y qué problema resuelve?

Este flujo de n8n automatiza la vigilancia de vencimientos de contratos para evitar incumplimientos operativos, pérdidas financieras y riesgos de cumplimiento legal. Detecta en forma periódica contratos próximos a vencer, evalúa reglas internas (por ejemplo, umbrales de 90, 60 y 30 días), y ejecuta acciones coordinadas: notificación a responsables, creación de tareas de renovación, bloqueo de procesos comerciales dependientes y registro de la trazabilidad en el sistema de gestión documental.

Problema que resuelve

  • Eliminación del riesgo de continuidad operacional por contratos caducos (por ejemplo, contratos de transporte o soporte técnico).
  • Reducción del costo por renovaciones urgentes o por renovaciones con penalidades por retraso.
  • Mejora de cumplimiento regulatorio y auditoría mediante registro automatizado de alertas y acciones tomadas.
  • Mayor eficiencia administrativa al centralizar la gestión de vencimientos y acciones asociadas.

Cómo opera, a alto nivel

  1. Agendado: un nodo Cron en n8n ejecuta el flujo a diario (o con menor frecuencia según volumen).
  2. Consulta: el flujo lee la fuente de datos de contratos (base SQL, Google Sheets o Airtable) y filtra contratos por fecha de vencimiento.
  3. Evaluación: se aplican reglas (umbral de alertas, exclusiones por cláusulas de prórroga) y se determina la acción correspondiente.
  4. Notificación y registro: el flujo envía alertas por correo/Slack, crea tickets en el gestor de tareas y actualiza el registro del contrato con estado y notas.
  5. Escalado: si no hay respuesta en el plazo definido, el flujo escalona a un responsable de mayor jerarquía.

Ejemplo operativo (empresa ficticia)

InnovaLogistics S.A. mantiene contratos con transportistas. Un contrato con TransMove vence en 30 días. El flujo detecta este vencimiento y: 1) envía un correo a Procurement, 2) crea un ticket en el gestor de incidencias del área logística, 3) añade un evento en el calendario corporativo para la reunión de revisión, y 4) marca el registro del contrato como "Alerta 30 días" en la base de datos. Si a los 10 días no hay acción, el flujo escalona al Director de Operaciones.

Beneficios medibles

  • Reducción de incidentes por contratos vencidos: estimación inicial 70%.
  • Menor gasto de emergencia por renovaciones inmediatas: ahorro proyectado en el primer año.
  • Trazabilidad completa para auditoría: todas las notificaciones y acciones quedan registradas.

Consideraciones de implementación

  • Definir fuente de datos principal y autoridad del registro maestro (quién actualiza fechas y cláusulas).
  • Establecer reglas de negocio claras: umbrales, excepciones y equivalente de escalado.
  • Garantizar permisos seguros para nodos que acceden a sistemas sensibles (DB, API, correo).

Cuándo usar este flujo

Contexto

Cuándo usar este flujo

✓ Úsalo cuando…✗ No lo uses cuando…
  • La empresa gestiona más de 20 contratos activos con fechas de vencimiento y cláusulas de renovación automática
  • Ha habido renovaciones no deseadas por falta de aviso en los últimos 2 años
  • Los contratos están en PDF y se almacenan en Google Drive o SharePoint
  • La empresa ya usa un CLM (Contract Lifecycle Management) como Ironclad o DocuSign CLM
  • Los contratos tienen estructuras muy heterogéneas que dificultan la extracción automática
  • No hay infraestructura para ejecutar Ollama (alternativa: usar Claude con DPA firmado)

Preparación

Prerrequisitos

HerramientaRequisitoUso en el flujo
Google Drive (carpeta de contratos)Carpeta designada para subir nuevos contratos en PDF. Credenciales de Google Drive configuradas en n8n.Trigger del flujo cuando se sube un nuevo contrato
Ollama + Mistral (self-hosted)Servidor Ollama instalado en infraestructura propia con el modelo Mistral descargado. IP local accesible desde n8n.Extracción local de fechas y cláusulas sin enviar datos a la nube
Google Sheets (registro maestro)Hoja con columnas: nombre_contrato, proveedor, fecha_vencimiento, dias_preaviso, fecha_limite_aviso, estado, url_driveRegistro centralizado de todos los contratos activos
n8n Self-hostedInstancia en infraestructura propia para garantizar que los datos no salen de la empresaOrquestador del flujo de vigilancia de contratos
Slack o Email corporativoCanal #contratos o lista de distribución del Director Legal y CEOEnvío de alertas escalonadas de vencimiento

Detección de nuevo contrato en Drive

Objetivo: Detectar automáticamente la llegada de un nuevo contrato en Google Drive y generar el evento inicial del flujo de vigilancia de vencimientos. Esta sección describe la configuración práctica de los nodos n8n, pasos detallados y un ejemplo operativo con una empresa ficticia.

Visión general del flujo en esta etapa: un nodo disparador que vigila una carpeta específica en Drive, filtro de validación para garantizar que solo se procesen contratos, y un nodo que normaliza los metadatos del archivo para el resto del flujo.

  1. Nodo 1: Google Drive Trigger

    1. Tipo: Trigger
    2. Operación: Watch Files (o Polling, si no se dispone de webhook)
    3. Credenciales: Cuenta de servicio o credenciales OAuth vinculadas a la carpeta corporativa
    4. Carpeta a vigilar: especificar el Folder ID de la carpeta contenedora (ejemplo: carpeta "Contratos/Vigentes")
    5. Filtros recomendados: mimeType igual a application/pdf y name contains Contrato
    6. Intervalo de sondeo: 60 segundos para procesos críticos, 5 minutos para menor frecuencia
  2. Nodo 2: IF node (validador de archivo)

    1. Condición 1: fileName matches RegExp para patrón de nombre. Ejemplo de expresión: ^Contrato_\d{4}_.+\.pdf$
    2. Condición 2: mimeType equals application/pdf
    3. Acción: si se cumple, continuar al nodo de normalización; si no, registrar o mover el archivo a carpeta de revisión
  3. Nodo 3: Google Drive - Get File (metadatos)

    1. Operación: Get File
    2. Input: fileId desde salida del Trigger
    3. Campos a recuperar: id, name, createdTime, modifiedTime, owners, webViewLink
    4. Salida: mapa de campos estandarizados para downstream
  4. Nodo 4: Set / Transform

    1. Normalizar campos clave: fileId, fileName, uploadDate, folderPath, downloadUrl
    2. Extraer metadatos adicionales del nombre de archivo (por ejemplo proveedor y fecha de vencimiento si embebida)

Ejemplo operativo con empresa ficticia

InnovaLegal S.A. centraliza contratos en Drive siguiendo la convención de nombres Contrato_YYYY_Proveedor.pdf y guarda archivos en la carpeta Contratos/Vigentes. Al añadir Contrato_2026_ACME.pdf el Google Drive Trigger detecta el archivo, el IF valida patrón y mimeType, el nodo Get File recupera id y enlace, y Set normaliza el registro para el módulo de vencimientos.

Output esperado

Campo Ejemplo
fileId 1a2B3cD4EfGh
fileName Contrato_2026_ACME.pdf
createdTime 2026-07-01T09:22:15Z
folderPath /Contratos/Vigentes
downloadLink https://drive.google.com/file/d/1a2B3cD4EfGh/view
detectedBy Google Drive Trigger - Watch Files

Problemas frecuentes

1. Sintoma: El trigger no detecta archivos nuevos

Causa: Credenciales caducas o permisos insuficientes sobre la carpeta.

Solución: Revisar y actualizar credenciales en n8n, confirmar que la cuenta tiene acceso de lectura a la carpeta y probar con un archivo manual.

2. Sintoma: Archivos detectados pero filtrados por el IF sin razón aparente

Causa: Expresión regular mal construida o diferencias en la convención de nombres.

Solución: Validar la expresión regular en una herramienta externa, añadir logs temporales que muestren fileName, y ajustar condiciones para aceptar variantes permitidas.

3. Sintoma: Metadata incompleta al usar Get File

Causa: Limitaciones de la API o campos no solicitados explícitamente.

Solución: Configurar el nodo para solicitar explícitamente los campos necesarios y verificar cuotas API. Si corresponde, reintentar con backoff.

4. Sintoma: Falsos positivos por archivos temporales o borradores

Causa: Herramientas que crean archivos temporales durante la subida (nombre temporal diferente).

Solución: Aplicar una segunda validación temporal que espere unos segundos y verifique que el archivo finaliza la subida; excluir nombres que contengan tmp o ~.

5. Sintoma: Alta latencia entre subida y disparo del flujo

Causa: Intervalo de polling elevado o limitación por cuota.

Solución: Reducir polling si la carga lo permite o implementar webhook si la cuenta y el entorno lo soportan. Monitorizar uso de cuota y ajustar frecuencia.

Adaptaciones y variantes

  • Vigilancia en SharePoint: sustituir Google Drive Trigger por un conector SharePoint / Microsoft Graph que vigile una librería de documentos y mantener la misma lógica IF y normalización.

  • Detección por correo: en lugar de Drive, usar un nodo IMAP o Gmail Trigger para detectar adjuntos con patrón de nombre y volcar adjuntos a una carpeta temporal en Drive para posterior procesamiento.

  • Monitor SFTP: usar nodo SFTP Trigger para detectar nuevos archivos en un repositorio seguro y aplicar los mismos filtros y transformaciones.

  • Validación por contenido: añadir un paso OCR o análisis de texto para extraer fecha de vencimiento desde el PDF cuando la fecha no está en el nombre de archivo; útil en contratos escaneados.

Notas finales: documente la convención de nombres y los permisos de la carpeta como parte del contrato operativo. Mantenga logs de los archivos rechazados para auditoría y ajuste progresivo de los filtros según la operativa real.


Extracción de fechas con IA local

Extracción de fechas con IA local

En esta sección se describe el diseño y la configuración de un flujo n8n que extrae automáticamente fechas relevantes de contratos utilizando un modelo de IA desplegado localmente. El objetivo es identificar fechas de inicio, vencimiento, renovación automática y plazos de notificación con alta precisión, minimizando transferencia de datos fuera de la infraestructura propia.

Flujo y configuración de nodos n8n

A continuación se detallan los nodos clave y su configuración recomendada. Los nombres de nodos se usan como referencia dentro del editor n8n.

  1. Webhook (Entrada)
    • Evento: POST
    • Path: /contracts/process
    • Campos esperados: file (binary), contract_id (string), source (string)
    • Uso: recibe el contrato en PDF o texto desde la aplicación interna de gestión documental.
  2. Read Binary File / Google Drive
    • Si el payload es binario: usar nodo Read Binary File para exponer el contenido como texto.
    • Si está en Drive/SharePoint: usar el nodo correspondiente con autenticación corporativa; mapear salida a la propiedad contract_text.
  3. Function (Preprocesamiento)

    Objetivo: limpiar OCR, normalizar formatos de fecha y segmentar por cláusulas.

    • Propiedades de entrada: binary.data o contract_text
    • Ejemplo de snippet (JS) para normalizar fechas y extraer bloques relevantes:
    • const text = items[0].json.contract_text || items[0].binary.data.toString('utf8');
      // Normalizar espacios y saltos
      const clean = text.replace(/\r/gi, '\n').replace(/\s+/g, ' ');
      // Segmentar por líneas clave
      const clauses = clean.match(/([^\.\n]{20,300}\.)/g) || [clean];
      return clauses.map(c => ({ json: { clause: c.trim(), contract_id: items[0].json.contract_id } }));
  4. HTTP Request a IA local

    Conectar con el servicio local de inferencia (p. ej., LocalAI, llama.cpp, o servicio HTTP propio).

    • Método: POST
    • URL: http://127.0.0.1:8080/v1/extract
    • Headers: Content-Type: application/json, Authorization: Bearer <token_interno>
    • Body (JSON): enviar prompt con la cláusula y esquema de salida. Ejemplo de estructura de prompt: "Extrae fechas y su tipo (start, end, renewal, notice) de la cláusula. Devuelve JSON con campo date_iso y confidence".
    • Timeout: 60s; retries: 2 con backoff
  5. Set / Merge (Normalización de salida)
    1. Mapear la respuesta del modelo a campos: contract_id, clause, date_detected, date_type, confidence, raw_model_output.
    2. Validar formato ISO 8601 para date_detected y convertir zonas horarias si procede.
  6. SplitInBatches / Wait / Notification
    • Procesar por lotes si hay grandes volúmenes. Insertar lógica de espera y reintento para llamadas al modelo.
    • Emitir notificaciones a un tablero de Control (p. ej., Slack interno o correo) cuando se detecte un vencimiento próximo.
  7. Persistencia
    • Guardar resultados en base de datos interna (Postgres). Campos: contract_id, clause_excerpt, date_detected, date_type, confidence, extracted_at.

Substeps técnicos

  1. Configurar servicio local de IA y exponer endpoint HTTP con autenticación mTLS o token interno.
  2. Crear Webhook en n8n y validar payloads entrantes con un nodo Validation (puede ser otro Function).
  3. Implementar el Function de preprocesamiento para mejorar la calidad de la entrada al modelo.
  4. Configurar HTTP Request para el servicio local, con encabezados y corpo estructurado.
  5. Normalizar y persistir la respuesta; exponer dashboard para revisión manual de casos con baja confianza.

Ejemplo práctico: TecnoGest S.A.

TecnoGest S.A., empresa ficticia de gestión de instalaciones, integra este flujo para vigilar contratos de proveedores. Proceso típico:

  1. El DMS envía al Webhook el PDF del contrato con contract_id = TG-2026-045.
  2. El nodo de lectura convierte el PDF a texto; el Function extrae cláusulas sobre "Duración" y "Renovación".
  3. El servicio IA local identifica una cláusula: "El presente contrato tendrá vigencia desde el 01/09/2024 hasta el 31/08/2026; renovación automática por un año salvo notificación 60 días antes."
  4. Salida normalizada: fecha de inicio 2024-09-01, fecha fin 2026-08-31, renovación automática con notificación 60 días.

Output esperado

Ejemplo de registro persistido tras extracción (datos ficticios):

contract_id clause_excerpt date_detected date_type confidence
TG-2026-045 "vigencia desde el 01/09/2024 hasta el 31/08/2026" 2024-09-01 start 0.97
TG-2026-045 "hasta el 31/08/2026" 2026-08-31 end 0.96
TG-2026-045 "renovación automática ... notificación 60 días antes" 60 days notice_period 0.88

Problemas frecuentes

Síntoma: Respuestas vacías o sin fechas
Causa: Entrada preprocesada contiene errores OCR o el prompt no especifica claramente el esquema de salida.
Solución: Mejorar limpieza en el nodo Function, añadir ejemplos de salida en el prompt y aumentar el contexto enviado al modelo.
Síntoma: Fechas en formatos ambiguos (ej. 03/04/2025 interpretado mal)
Causa: Modelo local no aplica heurística de localidad (dd/mm vs mm/dd).
Solución: Normalizar formatos en preprocesamiento, incluir en el prompt la convención regional (p. ej., 'formato dd/mm/yyyy').
Síntoma: Latencia alta en llamadas al servicio local
Causa: Modelo demasiado grande o falta de recursos (CPU/RAM); concurrencia sin control.
Solución: Ajustar batching, limitar concurrencia en n8n, optimizar modelo o desplegar réplicas con balanceador.
Síntoma: Altas tasas de falsos positivos (fechas detectadas donde no hay)
Causa: Prompt excesivamente permisivo o umbral de confianza bajo.
Solución: Restringir prompt a patrones de fecha y cláusulas contractuales; aplicar umbral mínimo de confidence y validar con expresiones regulares.
Síntoma: Errores de autenticación al invocar el endpoint local
Causa: Token caducado o mala configuración de certificados mTLS.
Solución: Renovar token, verificar configuración TLS y pruebas de conexión desde la máquina donde corre n8n.

Adaptaciones y variantes

  • Supervisor de cláusulas de renovación masiva: Variante orientada a procesar grandes volúmenes nocturnos. Añadir SplitInBatches con tamaño 50 y un proceso de priorización para contratos con vencimientos en los próximos 180 días.
  • Detección de hitos contractuales: Extender el prompt para identificar hitos (milestones), penalizaciones y condiciones de pago; almacenar entidades adicionales en la base de datos.
  • Operación multilingüe: Añadir un nodo de detección de idioma y enviar al modelo con el parámetro de idioma; mantener modelos locales o adaptadores por idioma para mejorar precisión en contratos internacionales.
  • Flujo híbrido: IA local + revisión humana: Para contratos críticos configurar un tablero de validación que reciba extracciones con confidence < 0.92 y permita correcciones manuales antes de confirmar alertas de vencimiento.

Conclusión: Con una configuración controlada de nodos n8n y un modelo de IA local bien encapsulado, es posible automatizar la extracción de fechas contractuales con trazabilidad y cumplimiento de requisitos de privacidad. Se recomienda comenzar por un piloto con 100 contratos representativos, ajustar prompts y umbrales, y luego escalar.

// Body del HTTP Request a Ollama (JSON) { "model": "mistral", "prompt": "Extrae la siguiente informacion del contrato en formato JSON estricto. Si no encuentras un campo, usa null. Campos requeridos: - fecha_vencimiento: string (formato YYYY-MM-DD) - dias_preaviso: number (dias de preaviso para cancelar o no renovar) - renovacion_automatica: boolean - tipo_contrato: string (servicio/arrendamiento/suministro/otro) - nombre_proveedor: string Contrato: {{$json.texto_extraido}}", "format": "json", "stream": false }

Actualización del registro maestro

Actualización del registro maestro (step3)

Objetivo: persistir en la base maestra la información consolidada de vencimientos tras la verificación y el cálculo de plazos. Esta etapa actualiza o crea el registro en la tabla contracts_master y registra metadatos operativos para auditoría.

Resumen de nodos recomendados en n8n y configuración específica:

  1. Preparación del payload (Nodo: Set - nombre: PreparePayload)
    1. Agregar campos: contract_id => expression: {{$json['contract_id']}}
    2. expiry_date => {{$json['expiry_date']}} (ISO 8601 preferible)
    3. counterparty => {{$json['counterparty']}}
    4. source_flow => 'vencimientos-tenant-1' (string fijo para trazabilidad)
    5. modified_by => {{$json['processed_by']}} o email del sistema
  2. Cálculo de fechas y flags (Nodo: Function - nombre: CalculateDates)
    1. Code: calcular days_to_expiry y next_renewal_date (ej. expiry_date menos 30, 90 días) usando Date en JS.
    2. Salida: next_renewal_date (ISO), days_to_expiry (número), status_update (e.g., 'vencido' | 'por_vencer' | 'vigente').
  3. Lectura previa del maestro (Nodo: PostgreSQL - nombre: GetMasterRow)
    1. Credentials: PostgresCreds
    2. Operation: Execute Query (o Get All Rows si está disponible)
    3. Query: SELECT * FROM contracts_master WHERE contract_id = {{$json['contract_id']}} LIMIT 1
  4. Merge de datos (Nodo: Merge - nombre: MergeExisting)
    1. Strategy: Merge by property (key: contract_id). Preferir valores calculados desde CalculateDates para fields críticos (expiry_date, days_to_expiry).
  5. Actualización/Inserción (Nodo: PostgreSQL - nombre: Update Master Record)
    1. Credentials: PostgresCreds
    2. Operation: Update
    3. Table: contracts_master
    4. Identifier column: contract_id
    5. Columns a actualizar: expiry_date, next_renewal_date, days_to_expiry, status, counterparty, last_modified_by, last_modified_at
    6. Expresiones ejemplo para valores: expiry_date => {{$json['expiry_date']}}, days_to_expiry => {{$json['days_to_expiry']}}, last_modified_at => {{$now}}.
    7. Si el update no afecta filas (registro no existente): encadenar nodo Insert (Operation: Insert) con los mismos campos para crear el registro maestro.
  6. Registro de auditoría / salida (Nodo: HTTP Request o Google Sheets - nombre: AuditLog)
    1. Guardar evento: contract_id, acción (update/insert), actor, timestamp, origen del flujo.

Flujo lógico: PreparePayload -> CalculateDates -> GetMasterRow -> MergeExisting -> (If exists) Update Master Record -> (Else) Insert Master Record -> AuditLog.

Ejemplo operativo

Caso realista: Grupo Altamira S.A. detecta que un contrato con ID 'ALT-2026-099' vence en 2026-09-30. El flujo calcula 30 días de aviso y actualiza el maestro.

CampoValor (antes)Valor (después)
contract_idALT-2026-099ALT-2026-099
expiry_date2026-09-302026-09-30
next_renewal_date2026-08-312026-08-31
days_to_expiry120120
statusvigentepor_vencer
last_modified_bysystemautomations@altamira.local

Problemas frecuentes

Síntoma: El nodo Update devuelve 0 filas afectadas a pesar de existir el contrato.
Causa: Discrepancia en el identificador (espacios, mayúsculas/minúsculas) o uso de claves compuestas no mapeadas. Solución: Normalizar contract_id en Set/Function (trim, toUpperCase) y volver a ejecutar. Verificar la consulta SELECT previa.
Síntoma: Fecha calculada incorrecta (desfase de 1 día).
Causa: Diferencias en zona horaria o formato de fecha (UTC vs local). Solución: Convertir y forzar ISO 8601 en el Function node; utilizar getTimezoneOffset si necesario y estandarizar a YYYY-MM-DD.
Síntoma: Inserción duplicada de registros.
Causa: Condición de carrera cuando varios flujos procesan el mismo contrato simultáneamente. Solución: Implementar bloqueo optimista (campo version/timestamp) o serializar por contract_id mediante nodos que hagan queueing o uso de transacciones en la base.
Síntoma: Campos nulos en master tras update.
Causa: El Merge no prioriza correctamente los valores nuevos y reemplaza con valores vacíos. Solución: Revisar configuración del Merge (preferir incoming) o validar y filtrar antes de Update (Set sólo con campos no vacíos).
Síntoma: Error de conexión a la base: authentication failed.
Causa: Credenciales caducadas o IP bloqueada. Solución: Verificar PostgresCreds en n8n, renovar credenciales, comprobar reglas de firewall y lista de IPs permitidas.

Adaptaciones y variantes del flujo

  • Guardar el maestro en Google Sheets: sustituir nodos PostgreSQL por Google Sheets (Operation: Update / Append) cuando la organización use hoja compartida como registro canónico.
  • Uso de Airtable como tabla maestra: emplear el nodo Airtable para Update/Upsert y aprovechar campos vinculados para avisos automáticos entre equipo legal y procurement.
  • Base NoSQL (MongoDB): adaptar el Merge usando _id y operaciones upsert; calcular days_to_expiry en Function y usar UpdateOne con upsert=true para garantizar idempotencia.
  • Sincronización bilateral: después de Update, emitir evento (Webhook o Message Queue) para notificar a sistemas externos (ERP, CRM) que consuman la versión maestra actualizada.

Recomendación final: incluir siempre auditoría mínima (who/when/source) y pruebas con datos ficticios antes de activar en producción. Documente el contrato de datos (nombres de campos y formatos) para mantener consistencia entre upstream y la tabla maestra.


Alertas escalonadas de vencimiento

Esta sección describe cómo implementar alertas escalonadas de vencimiento en n8n para asegurar respuestas progresivas según la proximidad del contrato a su fecha final. El objetivo es notificar al responsable inicial y, ante la falta de acción, escalar a responsables de mayor nivel y a canales alternativos. A continuación se detallan los nodos recomendados y la configuración práctica.

Resumen del flujo: ejecutar diariamente, extraer contratos próximos a vencer, calcular días restantes, determinar nivel de alerta, enviar notificaciones y actualizar el registro para evitar duplicados.

  1. Preparar la fuente de datos
    1. Nodo Cron: ejecutar cada día a las 08:00. Configuración: schedule='0 8 * * *'.
    2. Nodo PostgreSQL/MySQL: consulta de contratos activos. Ejemplo de SQL:
      • SELECT contract_id, title, counterparty, end_date, owner_email, last_alert_level FROM contracts WHERE end_date >= now() AND end_date <= now() + INTERVAL '30 days' AND status = 'active';
  2. Calcular prioridad y nivel de alerta
    1. Nodo Function: calcular days_left y proponer nivel. Lógica sugerida:
      • days_left = difference entre end_date y now()
      • if days_left > 15 and <= 30 => level='30d'
      • if days_left > 7 and <= 15 => level='15d'
      • if days_left > 1 and <= 7 => level='7d'
      • if days_left <= 1 => level='1d'
    2. Incluir campo next_alert_level y bandera should_send si level > last_alert_level.
  3. Rutas y envíos escalonados
    1. Nodo Switch/IF: ramas según next_alert_level.
      • Case '30d' => enviar a owner_email via Email node.
      • Case '15d' => enviar a owner_email y CC a jefe de departamento (campo manager_email).
      • Case '7d' => enviar a owner_email, manager y crear ticket en sistema (HTTP Request a API de gestión).
      • Case '1d' => enviar a owner, manager y legal; y marcar como crítico.
    2. Nodo Email: configurar from='no-reply@empresa.com', subject con plantilla 'Alerta de vencimiento: {{title}} - {{days_left}} días'.
    3. Nodo HTTP Request: POST a endpoint de ticketing con payload JSON con contract_id, prioridad y enlace al contrato.
    4. Nodo PostgreSQL Update: registrar last_alert_level y last_alert_date para evitar reenvíos duplicados.
  4. Persistencia y registros
    1. Guardar trazabilidad en tabla alerts_log: contract_id, alert_level, sent_at, channel, recipients.
    2. Añadir manejos de error y reintentos con Delay y registros en un log central.

Ejemplo operativo (empresa ficticia): InnovaLogix S.A. tiene un contrato con ID 2024-117 que vence en 14 días. El workflow ejecuta Cron, consulta la base, Function calcula days_left=14 y asigna level='15d'. Switch envía correo a maria.gomez@innovalogix.com (owner) y CC a luis.rios@innovalogix.com (manager). Se crea entrada en alerts_log y se actualiza last_alert_level='15d'. Si a los 7 días no hay actualización de estado, se ejecutará la rama '7d' y se abrirá un ticket en JIRA vía HTTP Request asignado al equipo legal de InnovaLogix.

Output esperado

contract_id title end_date days_left last_alert_level recipients
2024-117 Contrato de suministro anual 2026-07-29 14 15d maria.gomez@innovalogix.com; luis.rios@innovalogix.com

Problemas frecuentes

Síntoma: No llegan correos a los destinatarios
Causa: Configuración SMTP incorrecta o bloqueo por proveedor. Solución: Verificar credenciales SMTP en nodo Email, revisar logs del servidor y probar envío manual desde n8n. Configurar registros SPF/DKIM si procede.
Síntoma: Alertas duplicadas cada día
Causa: No se actualiza last_alert_level o la condición should_send siempre es true. Solución: Añadir UPDATE en la base tras cada envío y comprobar la lógica en el nodo Function para que compare correctamente last_alert_level.
Síntoma: Filtrado SQL devuelve menos registros que esperado
Causa: Zona horaria o formato de fecha en la base. Solución: Normalizar fechas usando UTC en consultas y revisar uso de INTERVAL con la misma zona horaria que n8n.
Síntoma: HTTP Request a ticketing falla con 401/403
Causa: Token API caducado o permisos insuficientes. Solución: Renovar token, comprobar alcance y probar el endpoint con herramientas externas; manejar respuestas de error en n8n e implementar reintentos limitados.
Síntoma: Workflow se queda bloqueado en Function o Switch
Causa: Excepciones no capturadas por datos inesperados. Solución: Añadir validaciones sobre campos obligatorios y rutas de error; registrar el payload que causa la excepción para depuración.

Adaptaciones

  • Escala a canales externos: En lugar de correo, enviar SMS en etapas críticas usando un nodo HTTP Request a Twilio o proveedor local.
  • Gestión legal prioritaria: Para contratos con cláusula de confidencialidad, iniciar automáticamente revisión legal y crear tarea en el sistema interno con prioridad alta.
  • Escalas internas por SLA: En organizaciones con SLAs, mapear niveles de alerta a penalizaciones o acciones automáticas (suspensión de renovación automática) y activar un flujo de cobros o retención.
  • Integración PLM/ERP: En empresas manufactureras ficticias como TecnoProd S.L., sincronizar con ERP para bloquear órdenes ligadas a contratos vencidos automáticamente tras la alerta '1d'.

Implementar estas prácticas garantiza trazabilidad, evita notificaciones redundantes y facilita la acción escalonada con mínima intervención manual.


Output esperado del flujo

Output esperado del flujo

El flujo de vigilancia automática de vencimientos de contratos produce salidas operativas y registros de auditoría destinados a garantizar trazabilidad, respuesta oportuna y evidencia para gobernanza. Los outputs principales son notificaciones proactivas, entradas en sistemas de gestión de incidencias, archivos de exportación con metadatos y registros en el historial de ejecuciones de n8n. A continuación se detallan los elementos esperados, su formato y ejemplos concretos para validar la correcta ejecución del flujo.

Principales salidas y su finalidad

  • Notificaciones por correo electrónico a responsables con resumen del contrato y llamada a la acción, para gestión manual o renovación.
  • Creación de tareas en el sistema de ticketing o gestor de actividades con prioridad y fecha límite asociada.
  • Archivo CSV o registro en almacenamiento compartido con la lista de contratos próximos a vencer, para análisis y conciliación.
  • Entrada de evento en el sistema de auditoría o en el historial de la plataforma de contratos (actualización de campo estado_alerta).
  • Registro de ejecución en n8n con resultado y payload enviado, para troubleshooting.

Ejemplo concreto de salida (datos ficticios)

Tabla representativa de la información exportada y las acciones tomadas por el flujo. Use esta tabla como referencia para validar los artefactos generados en su entorno.

Contracto ID Cliente Fecha vencimiento Días restantes Estado alerta Acción tomada Fecha notificación Responsable
CTR-2025-0012 InnovaLogistics S.A. 2026-08-10 26 Alerta principal Correo enviado y tarea creada en TaskMaster 2026-07-15 Head Procurement
CTR-2024-0333 ClaroSalud S.L. 2026-07-22 7 Alerta urgente Correo y notificación Slack al equipo legal 2026-07-15 Legal Manager
CTR-2023-1101 AguaNatura Servicios 2026-09-30 72 Ninguna Registro en CSV para revisión trimestral 2026-07-15 Operations Analyst
CTR-2025-0077 EnergiaNova 2026-07-16 1 Alerta crítica Tarea urgente creada y escalado a director 2026-07-15 Contract Owner

Formatos y ubicaciones de los outputs

  • Correo: asunto prefijo Vigilancia contratos; cuerpo con resumen en tabla y enlace directo al contrato en el repositorio.
  • CSV: columnas clave contract_id, cliente, fecha_vencimiento, dias_restantes, estado_alerta, accion, fecha_notificacion, responsable. Archivo almacenado en la carpeta compartida de control con versión timestamp.
  • Tarea en gestor: resumen estandarizado, prioridad derivada de dias_restantes, fecha límite igual a fecha_vencimiento menos periodo de acción definido.
  • Registro n8n: visualizar en ejecuciones del workflow con payload de salida y estado ok o error.

Dónde verificar y cómo validar

  • Panel de ejecuciones de n8n: confirmar que la ejecución corresponde a la hora programada y que el nodo que genera el archivo CSV devolvió un código 200 o success.
  • Bandeja de entrada de los responsables: verificar asunto y contenido del correo, y que los enlaces funcionan.
  • Sistema de ticketing: confirmar que se creó la tarea con campos meta y que el owner asignado es correcto.
  • Almacenamiento: validar existencia del archivo CSV con nombre de versión y comprobación de filas esperadas.

Este conjunto de outputs permite tanto la acción operativa inmediata como la construcción de métricas de cumplimiento en el tiempo. Para la empresa ficticia InnovaLogistics S.A. la combinación de correo, ticket y CSV garantiza que el equipo de compras tenga visibilidad anticipada y evidencia para auditoría interna.



Problemas frecuentes y cómo resolverlos

Problemas frecuentes y cómo resolverlos

Esta sección aborda las incidencias más habituales en flujos n8n diseñados para la vigilancia automática de vencimientos de contratos. Se describen síntomas concretos, causas comunes y soluciones aplicables de forma inmediata en nodos típicos: Cron Trigger, HTTP Request, Google Sheets/Airtable, Date & Time, IF, SplitInBatches y Email/Slack/Twilio.

Errores, síntoma, causa y solución

1) Fechas mal parseadas o alertas desincronizadas

Síntoma: Alertas que llegan en fecha errónea o contratos que nunca se consideran vencidos.

Causa: Formato de fecha inconsistente entre orígenes (DD/MM/YYYY vs MM/DD/YYYY) o diferencia de zona horaria entre el origen y el Cron Trigger.

Solución: Normalizar la fecha en un nodo Date & Time; convertir a ISO 8601 con expresiones como {{$json['fecha_vencimiento'] | date: 'YYYY-MM-DDTHH:mm:ssZ'}} o usar Date & Time node para forzar UTC. Configure el nodo Cron Trigger con la zona horaria del negocio o convierta todas las fechas a UTC antes de la comparación. Ejemplo: Grupo Altamira incluye fechas en formato europeo — añadir un nodo Set + Date & Time para parsear '12/05/2026' como DD/MM/YYYY.

2) Notificaciones duplicadas

Síntoma: Un contrato genera múltiples correos/Slack en el mismo periodo.

Causa: El flujo vuelve a procesar el mismo registro sin marcarlo como notificado; no existe clave de deduplicación.

Solución: Implementar control de estado. Flujo recomendado: 1) Leer registro en Airtable/Google Sheets; 2) IF node que verifica campo last_notified_at; 3) Si no existe, enviar notificación y actualizar last_notified_at con nodo Update. Use SplitInBatches para procesar lotes y reducir re-procesos. Ejemplo: Clínica Santa Clara actualiza la columna 'alert_sent' con timestamp tras enviar el email.

3) Errores de autenticación y permisos (401/403)

Síntoma: Nodos HTTP Request, Google Sheets o Airtable fallan con 401/403.

Causa: Credenciales caducadas, permisos insuficientes o scope OAuth incorrecto.

Solución: Revocar y volver a autorizar credenciales en n8n; comprobar scopes requeridos por la API; mover credenciales a nivel de flujo y no en nodos individuales. Para APIs con OAuth2, asegurar refresco automático del token. Ejemplo: Finanzas Nova reautoriza su integración ERP y añade scope read:contracts.

4) Cron o trigger no ejecuta el flujo

Síntoma: El flujo no se ejecuta en el horario esperado.

Causa: Workflow desactivado, instancia n8n en modo sleep (hosting serverless), o Cron configurado en zona horaria equivocada.

Solución: Verificar que el workflow está Active; ejecutar n8n en entorno con disponibilidad permanente o usar un monitor externo; ajustar timezone en Cron Trigger o convertir horarios con Date & Time. Ejemplo: Proveedor LogiCorp tenía el workflow desactivado tras una actualización.

5) Límite de tasa y timeouts

Síntoma: Respuestas 429 o fallos intermitentes en HTTP Request cuando se procesan muchos contratos.

Causa: Exceso de peticiones concurrentes a la API externa o sin manejo de reintentos.

Solución: Introducir SplitInBatches para procesar en lotes, añadir Wait entre llamadas críticas y lógica de reintentos (IF para 429 + Wait progresivo). Configure timeout en HTTP Request y cache local si es posible. Ejemplo: Instituto Verde redujo concurrencia y añadió backoff para llamadas al registro público.

Guía rápida: evitar duplicados (subprocedimiento)

  1. Leer fuente de contratos (Google Sheets/Airtable) con el nodo correspondiente.
  2. Usar un nodo IF para comprobar campo last_notified_at: condition 'isEmpty' sobre {{$json['last_notified_at']}}.
  3. En branch positivo, enviar notificación con Email o Slack node.
  4. Actualizar registro con nodo Update para escribir last_notified_at = {{$now}}.
  5. En branch negativo, omitir envío y registrar en log con Set node.

Resumen rápido (tabla)

Error Causa típica Nodo afectado Acción recomendada
Fechas mal parseadas Formato o zona horaria inconsistente Date & Time / Cron Trigger Normalizar a ISO 8601 / usar UTC
Notificaciones duplicadas No existe estado de notificación Airtable/Google Sheets, IF Registrar last_notified_at y verificar antes de enviar
401/403 Credenciales caducadas o scopes HTTP Request / API nodes Reautorizar y ajustar scopes
429 / timeouts Exceso de llamadas concurrentes HTTP Request / SplitInBatches Batching + Wait + backoff

Adaptaciones del flujo para otros contextos

  • Contratos de proveedores con escalado de aprobación: Añadir nodo HTTP Request para crear una tarea en el sistema de gestión procurement, un nodo IF para identificar contratos críticos y un nodo Slack/Email para escalado a responsables. Ejemplo: En Proveedora Norte, los vencimientos mayores a 100k activan una cadena de aprobaciones.
  • Renovaciones de suscripciones / facturación: Integrar con el sistema de facturación mediante HTTP Request o API de facturación; en caso de vencimiento cercano, generar factura proforma y enviar notificación al cliente. Nodos clave: HTTP Request (API billing), Set (plantilla de factura), Email (cliente).
  • Certificaciones de personal y cumplimiento (RRHH): Usar Google Sheets o HR API para listar certificaciones por empleado, Cron diario y nodo IF por cada empleado; notificar a manager y actualizar campo 'training_required'. Ejemplo: Departamento de RRHH de Banco Alba sincroniza vencimientos con calendar invites.
  • Cartera de arrendamientos con sincronización de calendario: Además de notificaciones internas, crear/actualizar eventos en Google Calendar u Outlook con nodo Google Calendar/Office365. Incluir recordatorios automáticos 30/15/7 días antes.

Si necesita, puedo generar ejemplos de configuración de nodos concretos (campos de credenciales, expresiones para IF, muestras de payload para HTTP Request) adaptados a su sistema de origen. Indique el origen de datos que usa su organización y preparo un checklist operativo.


Adaptaciones del flujo para otros contextos

Esta sección describe adaptaciones prácticas del flujo de vigilancia automática de vencimientos de contratos en n8n para distintos contextos organizativos. Proporciona variantes del diseño, un ejemplo detallado con configuración de nodos, el resultado esperado en un caso concreto y una lista de problemas frecuentes con síntoma, causa y solución. Los ejemplos usan empresas ficticias verosímiles para facilitar la comprensión y la replicabilidad.

Variantes del flujo para otros contextos

  • Renovaciones automáticas con aprobación humana: flujo híbrido para contratos que requieren revisión antes de renovar.

    1. Trigger: Cron diario que obtiene contratos con vencimiento en 30 días.
    2. Consulta: nodo Database/Google Sheets para listar contratos y estado de renovación.
    3. Condición: nodo IF que separa contratos con cláusula de aprobación manual.
    4. Para los que requieren aprobación: nodo Email/Slack para enviar notificación a responsable con enlace a un Webhook de aprobación.
    5. Webhook: recibe la decisión humana y activa el nodo que actualiza el contrato o programa la renovación automática.

    Ejemplo: la firma ficticia Constructora Altamira utiliza este flujo para contratos de subcontratación cuyo valor supera 50.000 EUR.

  • Seguimiento de proveedores y SLAs: orientado a medir cumplimiento de servicios asociados a contratos.

    1. Trigger: Cron semanal.
    2. Integración: HTTP Request a API del proveedor para obtener métricas SLA.
    3. Transformación: Function node que calcula desviaciones y vincula métricas al contrato correspondiente.
    4. Alertas: Si desviación > umbral, nodo Email/Teams para responsable y nodo CRM para crear actividad.

    Ejemplo: la logística ficticia InnovaLogistics realiza esta variante para contratos de transporte con cláusulas de puntualidad.

  • Contratos financieros con vencimientos escalonados: añade cálculo de amortizaciones y fechas intermedias.

    1. Trigger: Cron mensual.
    2. Transformación: Function node que genera calendario de vencimientos parciales (cuotas) a partir de calendario y tabla financiera.
    3. Condición: IF para alertar según tipo de cuota (capital, interés, comisión).
    4. Salida: Generar entrada en ERP y notificación contable automatizada.

    Ejemplo: Banco Solera (ficticio) aplica esta variante para préstamos con pagos trimestrales.

  • Integración con ERP/CRM para gestión comercial: actualiza estados contractuales en sistemas comerciales y crea tareas de renovación.

    1. Trigger: Webhook activado por cambios en ERP/CRM o Cron para sincronización periódica.
    2. Transformación: nodo Set/Function para mapear campos entre sistemas.
    3. Integración: HTTP Request o nodo nativo del ERP para actualizar registro y crear actividad de seguimiento.

    Ejemplo: la empresa de servicios AquaTech Servicios sincroniza contratos con su CRM comercial para que el equipo de cuentas gestione renovaciones prioritarias.

Configuración específica de nodos (ejemplo práctico para la variante de aprobación humana)

  1. Cron node: programar a las 08:00 todos los días.

  2. Database node (MySQL/Postgres): consulta SQL:

    1. SELECT id, cliente, fecha_vencimiento, requiere_aprobacion FROM contratos WHERE fecha_vencimiento BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '30 days' AND estado = 'activo';
  3. IF node: condición: requiere_aprobacion == true

  4. Email node (SMTP): campo Para: responsable_legal; Asunto: "Solicitud de aprobación de renovación — Contrato {{id}}"; Cuerpo: resumen de contrato y link al Webhook de aprobación.

  5. Webhook node: ruta pública que recibe JSON { contractId, decision, observaciones } y dispara un Function node que aplica la decisión y actualiza la base de datos.

Output esperado (ejemplo concreto)

Lista de alertas generadas en una ejecución para la empresa ficticia Constructora Altamira:

ContractID Cliente FechaVencimiento DíasRestantes AcciónRecomendada
CA-2024-091 Proveedor Hormigones Norte 2026-08-10 29 Enviar solicitud de aprobación a dirección de compras
CA-2023-214 Subcontrata Albañilería S.A. 2026-07-31 10 Generar propuesta de renovación automática
CA-2025-007 Servicios Eléctricos Delta 2026-07-20 -1 Contrato vencido: crear tarea de gestión post-vencimiento

Problemas frecuentes y soluciones

1) Síntoma: No se genera ninguna alerta pese a existir contratos próximos al vencimiento.
Causa: Query de base de datos con rango de fechas incorrecto o zona horaria mal configurada.
Solución: Revisar la consulta SQL, comprobar uso de CURRENT_DATE vs TIMESTAMP y ajustar la zona horaria del nodo Cron y la base de datos.
2) Síntoma: Correos de notificación no llegan a los responsables.
Causa: Configuración SMTP errónea o bloqueos por políticas de seguridad (SPF/DKIM).
Solución: Verificar credenciales SMTP, probar envío manual desde n8n, y coordinar con TI para revisar registros SPF/DKIM y whitelist del servidor.
3) Síntoma: Las aprobaciones enviadas por Webhook no modifican el estado del contrato.
Causa: Mapeo de campos en el Function node o problemas de autorización al escribir en la base de datos/ERP.
Solución: Habilitar logging en el Function node, comprobar payload recibido, validar credenciales/API keys usadas para actualización y probar la llamada de forma aislada.
4) Síntoma: Duplicidad de notificaciones para el mismo contrato.
Causa: El flujo no marca contratos como procesados o el trigger Cron se ejecuta varias veces solapadas.
Solución: Implementar un campo de estado "alerta_generada" con marca de tiempo al final del flujo y añadir lógica IF para evitar re-procesos; ajustar el comportamiento del Cron para evitar solapamientos.
5) Síntoma: Errores intermitentes al integrar con el ERP externo.
Causa: Límites de tasa (rate limits) o latencia de red.
Solución: Implementar reintentos exponenciales en HTTP Request, añadir manejo de códigos 429 y 5xx, y programar ventanas de sincronización fuera de picos de carga.

Resumen ejecutivo: adapte la variante que mejor se alinee con la gobernanza del contrato en su organización (autónoma, híbrida o integrada con finanzas/ERP). Priorice trazabilidad (marcas de procesamiento), seguridad (credenciales y registros) y claridad en las notificaciones para reducir fricción operativa. Las configuraciones de nodos y las pruebas con datos ficticios permiten validar el flujo antes de pasar a producción.


Siguiente paso

¿Qué hacer ahora?