¿Qué hace este flujo y qué problema resuelve?
Este flujo de n8n automatiza la monitorización de licitaciones públicas y transforma una tarea repetitiva y de alto riesgo en un proceso sistemático, trazable y accionable. Su propósito es detectar convocatorias relevantes para la organización, normalizar la información publicada en múltiples portales (BOE, plataformas autonómicas y plataformas sectoriales), aplicar filtros de prioridad y notificar a los equipos responsables con la documentación y los plazos necesarios para preparar una oferta competitiva.
El problema que resuelve es doble. Primero, reduce la probabilidad de pérdida de oportunidades por supervisión manual insuficiente: los equipos suelen depender de búsquedas puntuales o alertas generales que generan ruido. Segundo, mitiga el riesgo operativo y de cumplimiento asociado a plazos y requisitos documentales al centralizar la identificación, el registro y la notificación de cada expediente en un flujo automatizado con historial.
- Captura de fuentes: el flujo consulta periódicamente APIs y páginas públicas de licitaciones.
- Extracción y normalización: estructura datos clave (objeto, presupuesto, plazos, órgano contratante, clasificación CPV/CNAE).
- Filtrado y priorización: aplica reglas comerciales para seleccionar oportunidades de interés.
- Desduplicado y enriquecimiento: elimina duplicados y añade metadatos internos (cliente interesado, responsable, urgencia).
- Notificación y registro: envía alertas a los responsables (correo, canal de mensajería, sistema de gestión) y guarda el expediente en el histórico.
Beneficios operativos: mayor cobertura de mercado, reducción del tiempo de respuesta, asignación temprana de recursos y generación de un registro auditable de todas las convocatorias analizadas y las decisiones tomadas. Desde la dirección, esto se traduce en aumento de la efectividad comercial y mejor control del pipeline de licitaciones.
Ejemplo operativo con una empresa ficticia:
- InnovaContratos S.L.: compañía de ingeniería con foco en infraestructuras públicas. Define criterios: Comunidad Autónoma = Andalucía; CPV = obras de carretera y suministro de materiales; presupuesto mínimo = 500.000 EUR; plazo de presentación > 15 días.
- Resultado del flujo para InnovaContratos S.L.: el sistema detecta 3 convocatorias relevantes en 72 horas, normaliza la información y notifica al equipo comercial con ficha resumida y enlaces a los pliegos.
Impacto esperado: disminución de oportunidades perdidas, incremento en el ratio de respuesta a licitaciones y mejor priorización de recursos. En una visión directiva, el flujo aporta visibilidad temprana del mercado público y facilita decisiones de asignación presupuestaria y de personal basadas en datos.
Cuándo usar este flujo
Cuándo usar este flujo
| ✓ Úsalo cuando… | ✗ No lo uses cuando… |
|---|---|
|
|
Prerrequisitos
| Herramienta | Requisito | Uso en el flujo |
|---|---|---|
| API PLACE (Plataforma Contratación del Estado) | Registro gratuito en contrataciondelestado.es para obtener credenciales API | Fuente principal de licitaciones públicas españolas |
| Lista de códigos CPV | Listado de códigos CPV (Common Procurement Vocabulary) relevantes para los productos/servicios de la empresa | Filtro principal para seleccionar licitaciones relevantes |
| OpenAI GPT-5 API | API key con acceso a GPT-5 o GPT-4o para análisis de texto | Análisis de relevancia y extracción de requisitos clave de cada licitación |
| n8n Cloud o Self-hosted | Instancia activa con credenciales configuradas | Orquestador del flujo de monitorización diaria |
| Slack o Email corporativo | Canal de licitaciones en Slack o lista de distribución del equipo comercial | Envío del resumen ejecutivo diario |
Definición de criterios de búsqueda
Definición de criterios de búsqueda
La definición de criterios de búsqueda es la etapa crítica que determina la precisión y relevancia de las alertas de licitaciones públicas. En este paso diseñamos filtros semánticos, paramétricos y de canal para que el flujo automatizado de n8n detecte convocatorias alineadas con la estrategia comercial. El objetivo es minimizar ruido y maximizar oportunidades accionables.
Principios ejecutivos: priorizar campos obligatorios (CPV/NAICS, tipo de procedimiento, importe mínimo/máximo), establecer tolerancias por geografía y fechas, y combinar filtros booleanos y semánticos para capturar sinónimos y variaciones terminológicas.
-
Identificar atributos clave
- Sector o CPV/NAICS: usar códigos primarios y secundarios.
- Alcance geográfico: país, región, municipio.
- Tipo de contrato: suministro, obra, servicios.
- Rango presupuestario y fechas de publicación/cierre.
-
Configuración específica de nodos n8n
Ejemplo de cadena mínima de nodos y parámetros recomendados:
- Node: Cron — Trigger diario a las 07:00 UTC.
- Node: HTTP Request / RSS Feed — Endpoint de licitaciones. Parámetros: method=GET, responseFormat=JSON, query params: 'cpv'= '45000000, 72000000', 'region'='Andina'.
- Node: Set — Normalizar campos: amount_numeric = parseFloat(amount.replace(/[^0-9.]/g,'')), publish_date = new Date(publish_date).
- Node: Function — Aplicar filtros semánticos: keywords = ['mantenimiento','infraestructura','servicios TIC']; match = keywords.some(k => title.toLowerCase().includes(k)).
- Node: IF — Condiciones lógicas: (match == true) AND (amount_numeric >= 50000) AND (region == 'Región Centro').
- Node: Google Sheets / Database — Registrar ID y hash para evitar duplicados; campos: id, title, cpv, amount, publish_date, source_url.
- Node: Send Email / Slack — Notificación con plantilla resumida y enlace a ficha completa.
-
Substep: afinación y pruebas
- Ejecutar el flujo en modo manual con 50-100 registros históricos.
- Medir tasa de verdaderos positivos y falsos positivos; ajustar keywords y umbrales de importe.
- Agregar más fuentes o normalizadores si faltan resultados relevantes.
Ejemplo con empresa ficticia: Constructora NovaSur. Requisitos de NovaSur: obras de infraestructura vial, CPV 45100000, importe entre 200.000 y 2.000.000 USD, región: Provincia Central. En n8n se configura el nodo Function para mapear sinónimos: ['reparación vial','rehabilitación de carreteras'] y el IF para cerrar en el rango de importes. Las alertas se envían al equipo comercial y se guardan en Google Sheets para control de oportunidades.
Problemas frecuentes
- Falsos positivos recurrentes
- Síntoma: muchas alertas no relevantes. Causa: palabras clave demasiado genéricas o ausencia de contexto semántico. Solución: añadir filtros CPV, usar expresiones regulares más específicas y aplicar listado de exclusión (blacklist) en el nodo Function.
- Faltan resultados relevantes
- Síntoma: oportunidades conocidas no aparecen. Causa: fuente no incluida, normalización incorrecta de campos o umbrales de importe demasiado altos. Solución: incorporar más endpoints, revisar transformaciones en Set/Function y bajar temporalmente umbrales para pruebas.
- Duplicados en alertas
- Síntoma: la misma licitación notificada varias veces. Causa: falta de deduplicación por identificador o cambios menores en la fuente. Solución: almacenar hash de contenido y comprobar prior a notificar; usar nodos de base de datos o Google Sheets para control.
- Errores de parsing
- Síntoma: fallos al convertir importes o fechas. Causa: formatos regionales (coma vs punto) o campos vacíos. Solución: implementar funciones de normalización robustas en el nodo Function y capturar excepciones para registro de errores.
- Latencia o fallos por límite de API
- Síntoma: requests bloqueados o flujo interrumpido. Causa: límites de llamadas a la API de origen. Solución: implementar backoff, cache local y escalonar cron triggers; considerar usar proveedor alternativo para replicación.
Adaptaciones
- Flujo para consultoras TIC: priorizar CPV de software y servicios, añadir análisis de requisitos técnicos en nodo Function y enviar a canal técnico interno en Slack.
- Flujo para suministros y compras: incorporar validación de proveedores aprobados, umbral de importe bajo y conexión a ERP para comprobar stock y condiciones comerciales.
- Versión para internacionalización: parametrizar geografía y moneda; añadir conversión de divisas en nodo Function y normalizar CPV/NAICS entre jurisdicciones.
- Flujo de adjudicaciones y seguimiento post-licitación: ampliar criterios para capturar actas de adjudicación, alertas de recursos y plazos contractuales; integrar con CRM para seguimiento comercial.
Consulta diaria a la API PLACE
Esta sección describe la implementación diaria de la consulta a la API PLACE usando n8n. El objetivo es ejecutar una búsqueda programada de nuevas licitaciones, filtrar las relevantes y registrar los resultados en la base de datos o enviar alertas a los responsables. A continuación se presenta la configuración detallada de los nodos n8n, el paso a paso operativo, un ejemplo práctico con una empresa ficticia y apartados de salida esperada, problemas frecuentes y adaptaciones recomendadas.
Configuración específica de nodos n8n
- Schedule Trigger
- Mode: 'Every Day'
- Time: '07:00'
- Timezone: 'Europe/Madrid'
- HTTP Request
- HTTP Method: 'GET'
- URL: 'https://api.place.gob.es/v1/licitaciones'
- Authentication: 'Header' – Header Name: 'X-API-KEY', Value: '{{ $credentials.PLACE_api_key }}'
- Query Parameters: 'date_from' = '{{ $json["last_run"] }}' or calculated as 'today - 1 day', 'limit' = '100', 'offset' = '0'
- Response Format: 'JSON'
- Function / Function Item
- Usado para: manejar paginación (leer campo 'next' o incrementar 'offset'), normalizar fechas y filtrar por sectores/geografía.
- SplitInBatches para procesar cada licitación individualmente (batch size = 1-10).
- IF para filtrar por criterios (valor estimado, sector, provincia).
- Postgres / MySQL / Google Sheets para registro y deduplicado: comprobar si 'tender_id' ya existe antes de insertar.
- Webhook / Email / Slack para notificaciones a responsables si se cumple criterio de aviso.
Paso a paso operativo (substeps)
- Crear el nodo Schedule Trigger con la programación diaria.
- Conectar a un nodo Set para enviar la variable 'date_from' (por ejemplo 'yesterday' en formato ISO) y 'limit' inicial.
- Configurar el nodo HTTP Request con la URL de la API PLACE y el header 'X-API-KEY'.
- Agregar un nodo Function para comprobar la respuesta y gestionar paginación: si response.next existe, actualizar 'offset' y re-ejecutar hasta agotar resultados.
- Pasar la lista al nodo SplitInBatches para procesar cada licitación: extraer campos clave (id, título, fecha_publicacion, fecha_limite, valor_estimado, link).
- En nodo IF, aplicar reglas (ej.: valor_estimado > 100000 y sector == 'Obras Públicas' y provincia == 'Sevilla').
- Registrar en la base de datos: usar consulta upsert para evitar duplicados por 'id'.
- Enviar notificación por email/Slack si el registro cumple criterios de alerta y actualizar el log con la marca de procesamiento.
- Actualizar variable 'last_run' al final del flujo con la fecha y hora de ejecución.
Ejemplo práctico (empresa ficticia)
La empresa ficticia 'Servicios de Ingeniería Altair S.L.' monitoriza licitaciones de obras públicas en Andalucía. Requisitos: valor estimado > 150.000 EUR y plazo de presentación > 10 días. Altair configura el flujo descrito, añade un IF con esos criterios y un nodo Slack para alertar al equipo de licitaciones. Tras la primera ejecución diaria, reciben un resumen y el flujo realiza upsert en su base de datos interna para seguimiento comercial.
Output esperado
Ejemplo de salida tras una ejecución diaria (datos ficticios):
| id | titulo | fecha_publicacion | fecha_limite | valor_estimado (€) | link |
|---|---|---|---|---|---|
| PLACE-2026-000123 | Rehabilitación puente A-45 | 2026-07-14 | 2026-08-05 | 420000 | https://place.gob.es/licit/PLACE-2026-000123 |
| PLACE-2026-000127 | Suministro de iluminación viaria | 2026-07-14 | 2026-07-30 | 95000 | https://place.gob.es/licit/PLACE-2026-000127 |
Problemas frecuentes
- Error: Sin resultados inesperados
- Síntoma: El flujo devuelve lista vacía pese a que hay licitaciones esperadas. Causa: Parámetros 'date_from' o filtros demasiado restrictivos; zona horaria incorrecta. Solución: Revisar el valor enviado en 'date_from', probar con un rango ampliado, confirmar timezone del Schedule Trigger.
- Error: Paginación incompleta
- Síntoma: Solo se reciben los primeros 100 registros. Causa: No se implementó la lógica de paginación o se interpreta mal el campo 'next'. Solución: Implementar nodo Function para leer 'response.next' o incrementar 'offset' en bucle hasta que no haya más páginas.
- Error: 401/403 Autenticación
- Síntoma: Respuesta de la API con 401 o 403. Causa: API key incorrecta o caducada, header mal nombrado. Solución: Verificar credenciales en n8n Credentials, usar el nombre de header correcto ('X-API-KEY' o 'Authorization: Bearer ...').
- Error: Duplicados en la base de datos
- Síntoma: Mismas licitaciones registradas varias veces. Causa: No se usa clave única o upsert en insert. Solución: Implementar consulta upsert por 'id' externo o marcar procesadas las integraciones con índice único en la tabla.
- Error: Lento o timeouts
- Síntoma: Tiempo de respuesta largo o fallos por timeout. Causa: Solicitudes con limit demasiado alto o procesamiento síncrono de archivos adjuntos. Solución: Reducir 'limit' y usar SplitInBatches; descargar adjuntos en un flujo asíncrono posterior.
Adaptaciones del flujo
- Filtrado por ámbito geográfico: adaptar el nodo IF para incluir provincias o código NUTS y enviar alertas solo a delegaciones locales.
- Integración con CRM: en lugar de solo registrar en BD, ejecutar un nodo HTTP Request a la API del CRM para crear oportunidades con metadatos de la licitación.
- Sincronización incremental por id: usar un endpoint de cambios (if disponible) o mantener un cursor 'last_id' cuando la API no soporta fecha, para evitar re-procesos.
- Multicanal de notificación: añadir nodos para enviar resumen diario por email, crear tarea en gestor interno y notificar en Slack/Teams según prioridad.
Conclusión: Con una programación diaria, paginación controlada, reglas de filtrado y upsert en la base de datos, n8n ofrece un flujo robusto para monitorizar automáticamente las licitaciones del PLACE y notificar a los equipos responsables. Las adaptaciones propuestas permiten escalar el uso a diferentes regiones, integraciones y políticas de notificación.
Análisis de relevancia con IA
Análisis de relevancia con IA
Objetivo: aplicar un modelo de lenguaje para evaluar y priorizar automáticamente las licitaciones detectadas por el flujo de monitorización. El análisis debe producir una puntuación de relevancia (0-100), etiquetas temáticas y una justificación breve que permita a un responsable de licitaciones tomar una decisión rápida.
Flujo y configuración de nodos n8n (pasos)
Descripción general de nodos clave y parámetros recomendados. Incluye plantillas de prompt y lógica de filtrado.
-
Webhook (entrada)
- Método: POST
- Response Mode: 'On Received' si solo se encola el evento
- Payload: { 'tender_id', 'title', 'description', 'budget', 'deadline', 'origin_url' }
-
HTTP Request (recuperar detalles adicionales)
- Method: GET
- URL: 'https://api.plataformalicitudes.example/notice/{{ $json.tender_id }}'
- Headers: 'Authorization: Bearer {{ $credentials.apiKey }}'
-
Set (normalización)
- Campos a crear: 'normalized_budget' (convertir a EUR), 'days_to_deadline' (número entero)
- Formato: claves limpias: title, description, budget_eur, deadline_iso
-
Function (preparación del prompt)
JS conciso para construir prompt y contexto. Ejemplo:
items[0].json.prompt = `You are an expert procurement analyst. Evaluate the following tender for relevance to a construction company focused on transport infrastructure. Respond JSON with: score (0-100), tags (array), rationale (short).\n\nTENDER: ${items[0].json.title}\n${items[0].json.description}\nBUDGET: ${items[0].json.budget_eur} EUR\nDEADLINE: ${items[0].json.deadline_iso}`; return items; -
OpenAI / AI node (evaluación)
- Provider: OpenAI
- Model: 'gpt-4' (o el disponible en su entorno)
- Temperature: 0
- Max tokens: 600
- Input: usar 'prompt' generado
- Output esperado: JSON con { score, tags, rationale }
-
Set / If (reglas de decisión)
- Si score >= 75 -> enviar a canal de alta prioridad (Slack/Email/Sheets)
- Si 50 <= score < 75 -> marcar para revisión humana
- Si score < 50 -> archivar o etiquetar como baja prioridad
-
Google Sheets / Email (salida)
- Registrar: tender_id, title, budget_eur, deadline_iso, score, tags, rationale, link
- Notificar stakeholders según reglas de prioridad
Prompt recomendado
En el nodo Function o directamente en el nodo AI, use un prompt estructurado. Ejemplo de plantilla ejecutiva:
"Eres un analista senior de adquisiciones. Evalúa la relevancia de la licitación para una empresa que se dedica a obras públicas de transporte (puentes, carreteras, túneles). Devuelve un JSON con: score (0-100), tags (máx. 5 etiquetas), rationale (1-2 frases) y factores clave que justifican la puntuación."
Ejemplo práctico (empresa ficticia)
Empresa: InfraVía S.A. Perfil: construcción de infraestructuras viales y puentes, procura proyectos con presupuesto superior a 2M EUR y plazo de contrucción mayor a 12 meses.
- Detección: sistema captura licitación con título 'Construcción de puente sobre río X' y presupuesto 3.2M EUR.
- Normalización: budget_eur = 3200000, days_to_deadline = 28.
- IA evalúa: score = 88, tags = ['puente','obra civil','alto presupuesto'], rationale = 'Presupuesto y tipo de obra alineados al core de InfraVía; plazo de ejecución y requisitos técnicos coinciden con experiencia previa'.
- Acción: se envía notificación inmediata al equipo comercial y se registra en la hoja 'Oportunidades - Alta Prioridad'.
Output esperado (ejemplo de registro)
| tender_id | title | budget_eur | deadline | score | tags | rationale |
|---|---|---|---|---|---|---|
| TN-2026-0045 | Construcción de puente sobre río X | 3,200,000 | 2026-08-12 | 88 | ['puente','obra civil','alto presupuesto'] | Presupuesto y tipología alineados con experiencia; plazo compatible; requisitos técnicos claros. |
| TN-2026-0079 | Mantenimiento de red local de alumbrado | 85,000 | 2026-06-30 | 22 | ['mantenimiento','bajo presupuesto'] | Actividad fuera del core y presupuesto muy bajo para interés comercial. |
Problemas frecuentes
Lista de errores habituales con síntoma, causa y solución.
- Error: Respuesta del modelo no es JSON parseable
-
Síntoma: El nodo AI devuelve texto libre que rompe el workflow.
Causa: Prompt poco estructurado o temperatura alta.
Solución: Forzar formato JSON en el prompt, usar temperatura=0 y validar salida con un nodo Function que intente parsear y capture errores.
- Error: Scores inconsistentes entre ejecuciones
-
Síntoma: Mismas licitaciones reciben puntuaciones variables.
Causa: Parámetros de modelo inestables, contexto insuficiente o prompts ambiguos.
Solución: Establecer temperatura=0, incluir criterios de evaluación explícitos en el prompt y mantener un prompt template fijo.
- Error: Latencia alta en evaluación
-
Síntoma: Retrasos en el flujo y notificaciones tardías.
Causa: Llamadas sin caché a la API de IA para documentos largos o uso de modelos con alta latencia.
Solución: Pre-filtrar por reglas simples (presupuesto mínimo, palabras clave) antes de llamar al modelo; usar versiones del modelo optimizadas para latencia.
- Error: Falsos positivos por coincidencias superficiales
-
Síntoma: Se priorizan licitaciones por simples coincidencias de palabras clave.
Causa: Prompt que da demasiado peso a keywords y no al contexto técnico/contractual.
Solución: Ajustar prompt para pedir evaluación por criterios técnicos y estratégicos; incluir ejemplos negativos y positivos en few-shot.
- Error: Problemas con moneda o fechas
-
Síntoma: Budget mal normalizado o deadlines incorrectos.
Causa: Falta de normalización previa o formatos variados de entrada.
Solución: Añadir nodo de normalización robusto (con conversión de divisas y parsing de fechas) antes de construir el prompt.
Adaptaciones para otros contextos
Variantes del flujo básico para cubrir escenarios distintos.
- Multilingüe y global: incorporar un paso de detección de idioma y traducción automática (Google Translate / DeepL node) antes del análisis. Ajustar prompt a contexto local (normativa, tipo de contrato) y normalizar monedas según país.
- Pequeñas y medianas empresas (SME): cambiar umbrales de presupuesto y prioridad; modelo puede optimizar para oportunidades regionales y contratos menores. Añadir ruleset para subcontratación y suministros.
- Proveedores de servicios (IT, consultoría): redefinir etiquetas y criterios (tecnologías requeridas, duración del contrato, SLA). Incluir extracción de requisitos técnicos y coincidencia con capacidades internas (skills mapping).
- Precalificación y riesgos: extender prompt para valorar riesgos (requisitos legales, experiencia previa, garantías). Añadir scoring adicional por riesgo y un nodo que genere checklist de cumplimiento automático.
Conclusión: el análisis de relevancia con IA en n8n permite escalar la priorización de oportunidades si se combina una normalización rigurosa, prompts estructurados, controles de calidad en la salida y reglas de negocio claras. Para InfraVía S.A. y otras empresas, ajustar umbrales y ejemplos en el prompt mejora la precisión y reduce falsos positivos.
Notificación al equipo comercial
Notificación al equipo comercial (Paso 4)
En esta etapa se transforma la detección de una nueva licitación en una notificación operativa para el equipo comercial. El objetivo es entregar la información esencial (título, órgano convocante, importe aproximado, fecha de cierre y link) en el canal apropiado, con prioridad y asignación automática cuando aplique. A continuación se detallan los nodos n8n, su configuración y un flujo probado que permite entregar notificaciones coherentes y accionables.
-
Nodo: SplitInBatches
- Propósito: procesar lotes si llegan múltiples resultados en una sola ejecución.
- Configuración clave: Batch Size = 1 (procesamiento por licitación).
-
Nodo: Set
- Propósito: normalizar datos y construir el payload de notificación.
- Campos que crear:
- title = {{$json.title}}
- authority = {{$json.authority}}
- budget = {{$json.estimated_value}}
- deadline = {{$json.closing_date}}
- url = {{$json.url}}
- priority = {{$json.estimated_value > 50000 ? 'Alta' : 'Media'}}
- assigned = {{$json.category === 'Infraestructura' ? 'EquipoA' : 'EquipoB'}}
-
Nodo: Function (opcional: enriquecimiento)
- Propósito: aplicar lógica para generar asunto y texto de notificación.
- Ejemplo de salida:
- subject = `Nueva licitación: ${item.title} (${item.priority})`
- message = `Órgano: ${item.authority}\nImporte: ${item.budget}\nCierre: ${item.deadline}\n${item.url}`
-
Nodo: Conditional / IF
- Propósito: enrutar según prioridad o categoría (p. ej. correo vs. Slack vs. Teams).
- Condiciones típicas: priority == 'Alta' → canal urgente; assigned == 'EquipoA' → notificar líder específico.
-
Nodo: Slack (o Microsoft Teams / Email)
- Slack - Campos recomendados:
- Channel = #oportunidades-licitaciones
- Text = Nueva licitación: {{$json.title}}\nÓrgano: {{$json.authority}}\nImporte: {{$json.budget}}\nCierre: {{$json.deadline}}\n{{$json.url}}
- Blocks (opcional) = botones: "Ver" -> {{$json.url}}, "Asignar" -> enlace interno
- Email - Campos recomendados:
- To = comercial@solucionespublicas.example
- Subject = {{$json.subject}}
- Body (HTML) = incluir tabla con campos clave y enlaces.
-
Nodo: Google Sheets / Airtable (registro)
- Propósito: crear o actualizar registro de oportunidad para trazabilidad.
- Campos a mapear: id, title, authority, budget, deadline, url, priority, assigned, notified_at = {{$now}}
-
Nodo: Set de salida y retorno
- Propósito: consolidar resultado para logs y webhooks de auditoría.
Ejemplo operativo (empresa ficticia): SolucionesPublicas S.A. recibe una licitación detectada por el scraper. El flujo divide el lote, normaliza campos en Set, genera asunto en Function, evalúa prioridad en IF y envía una notificación a Slack al canal #oportunidades-licitaciones y un correo a comercial@solucionespublicas.example si la prioridad es Alta. Simultáneamente registra la oportunidad en Google Sheets bajo la hoja "Oportunidades".
| ID | Título | Órgano | Importe | Cierre | URL | Prioridad | Asignado |
|---|---|---|---|---|---|---|---|
| LIC-2026-0142 | Suministro de equipamiento hospitalario | Departamento Salud Regional | 120000 | 2026-08-10 | https://licitaciones.example/LIC-2026-0142 | Alta | EquipoA (Líder: Marta López) |
Comprobaciones de éxito: el equipo comercial debe recibir un mensaje en Slack con el asunto y el enlace, el correo (si aplica) debe llegar al buzón de comercial, y la hoja de registro debe contener la fila con notified_at y estado inicial "Pendiente contacto".
Problemas frecuentes:
- Error 1 — Mensaje no llega a Slack
- Síntoma: nodo Slack reporta error o la notificación no aparece en canal. Causa: token de API caducado o canal mal escrito. Solución: renovar token en las credenciales de Slack y verificar el nombre del canal; probar con un mensaje simple desde n8n.
- Error 2 — Campos faltantes en la notificación
- Síntoma: la notificación muestra campos vacíos. Causa: mapeo incorrecto en el nodo Set o nombres de campo del origen cambiaron. Solución: revisar el output del nodo anterior (debug), actualizar expresiones {{$json.
}} y añadir validaciones en Function. - Error 3 — Duplicados en la hoja de registro
- Síntoma: la misma licitación se registra varias veces. Causa: ausencia de verificación de duplicados (ID único). Solución: antes de crear, ejecutar un nodo Google Sheets Query o Search en Airtable para comprobar existencia por ID; actualizar si existe.
- Error 4 — Retrasos o tiempo de espera
- Síntoma: el flujo tarda o falla por timeout al llamar a servicios externos. Causa: endpoints lentos o límites de API. Solución: implementar reintentos con backoff, aumentar timeouts en HTTP Request y usar SplitInBatches para controlar carga.
- Error 5 — Asignación incorrecta
- Síntoma: asignado a equipo inapropiado. Causa: reglas de negocio en Function mal definidas o cambios categóricos. Solución: centralizar la lógica de asignación en un lookup table (Google Sheets/Airtable) y referenciarlo desde el flujo.
Adaptaciones del flujo para otros contextos:
- Venta B2B: reemplazar el canal Slack por notificaciones directas a CRM (Salesforce / HubSpot) y mapear lead score según importe y sector.
- Operaciones técnicas: notificar al equipo técnico por Microsoft Teams y crear tickets automatizados en Jira con prioridad derivada del importe o impacto.
- Alcance internacional: añadir nodo de traducción automática (Google Translate) para generar notificaciones en el idioma regional y adjuntar resumen en local language.
- Gestión de subcontratistas: enviar notificación segmentada por categoría a una lista de proveedores externos via correo y registrar aceptación en Airtable para seguimiento.
Output esperado del flujo
Salida esperada del flujo de monitorización automática de licitaciones públicas: descripción ejecutiva y ejemplos concretos para integración operativa. El flujo debe producir salidas estructuradas y accionables que permitan a equipos comerciales y de oferta priorizar oportunidades y activar procesos internos (alertas, creación de leads, descarga de pliegos).
Formato(s) de salida esperado(s):
- Registro por licitación en una hoja de cálculo (Google Sheets / Excel) o en una base de datos: una fila por licitación con campos normalizados.
- Payload JSON por notificación, enviado a webhook o a un canal de mensajería corporativa (Slack/Teams) para consumo por sistemas downstream.
- Correo electrónico ejecutivo diario/resumen con las licitaciones que pasan umbrales de prioridad.
Estructura de datos recomendada (explicación rápida):
- ID_externo: identificador único de la publicación en el portal.
- Título: texto corto de la licitación.
- Órgano_convocante: entidad pública responsable.
- Fecha_publicación y Fecha_límite: en formato ISO (YYYY-MM-DD).
- Estado: nuevo / actualizado / cerrado.
- Palabras_clave_encontradas: lista de términos que activaron la coincidencia.
- Prioridad (0-100): score calculado por reglas (sector, importe, plazo).
- Enlace_pliego: URL directa al anuncio.
Ejemplo concreto (datos ficticios). Este ejemplo se muestra como tabla tal como quedaría en Google Sheets o en la respuesta JSON enviada al CRM:
| ID_externo | Título | Órgano_convocante | Fecha_publicación | Fecha_límite | Estado | Palabras_clave | Prioridad | Enlace_pliego |
|---|---|---|---|---|---|---|---|---|
| LIT-2026-00123 | Servicio de mantenimiento de infraestructuras viarias | Ayuntamiento de Monteverde | 2026-07-10 | 2026-08-05 | nuevo | "mantenimiento, viario, pavimentación" | 86 | https://portallicitaciones.example/123 |
| LIT-2026-00124 | Suministro de equipos informáticos para centros educativos | Consejería de Educación - Región Norte | 2026-07-09 | 2026-07-30 | nuevo | "suministro, informática, centros educativos" | 74 | https://portallicitaciones.example/124 |
| LIT-2026-00125 | Consultoría estratégica para transformación digital | Agencia de Desarrollo NovaInfra | 2026-07-08 | 2026-08-01 | actualizado | "consultoría, transformación digital" | 92 | https://portallicitaciones.example/125 |
| LIT-2026-00126 | Obras de rehabilitación de centro cultural | Diputación Provincial de Solaria | 2026-07-11 | 2026-08-20 | nuevo | "rehabilitación, obras, centro cultural" | 81 | https://portallicitaciones.example/126 |
Ejemplo de fila integrada en CRM o en un ticket de oportunidad (lista de campos clave):
- Cuenta: NovaInfra Consultores S.L.
- Oportunidad origen: MonitorLicita-n8n
- Título oportunidad: Servicio de mantenimiento de infraestructuras viarias (LIT-2026-00123)
- Fecha límite: 2026-08-05
- Score_prioridad: 86
- Contacto asignado automáticamente: Equipo Obras
Indicaciones operativas breves: utilice la columna Prioridad para filtrar alertas automáticas (ej.: prioridad >= 80 = notificación inmediata a equipo comercial). Asegure un campo URL activo para permitir descarga directa del pliego desde los flujos de trabajo.
Ejemplo de uso por una empresa ficticia: ConsulteraTech S.A. configura el flujo para que todas las licitaciones con prioridad >=85 generen un ticket en su herramienta de gestión de propuestas y envíen un correo al responsable de ofertas con la tabla adjunta y el enlace al pliego.
Problemas frecuentes y cómo resolverlos
Problemas frecuentes y cómo resolverlos
Esta sección describe los problemas más habituales al desplegar un flujo n8n para monitorización automática de licitaciones públicas y las acciones correctivas recomendadas. Se prioriza diagnóstico rápido y medidas concretas para restaurar la continuidad del servicio sin perder trazabilidad. Se incluyen pasos de verificación específicos de nodos n8n, ejemplos aplicados a empresas ficticias y variantes del flujo para otros contextos.
Pasos de verificación inicial
- Comprobar historial de ejecuciones en n8n: abrir la ejecución fallida y revisar errores en el nodo con estado rojo.
- Confirmar disponibilidad de la fuente: realizar una petición directa al endpoint de la plataforma de licitaciones con curl o Postman.
- Verificar credenciales: asegurar que variables de entorno o credenciales guardadas en n8n coincidan con las vigentes.
- Probar nodos individualmente: ejecutar el nodo HTTP Request, luego el de transformación (Function o Set) y finalmente el de notificación.
Errores frecuentes
- Error 1: No llegan notificaciones
-
Síntoma: El flujo se ejecuta sin errores aparentes, pero no se reciben correos ni mensajes en Slack.
Causa probable: El nodo de envío (SMTP, Slack, Teams) tiene credenciales caducadas o el trigger final está filtrando por condiciones demasiado estrictas.
Solución: Validar credenciales en la sección Credentials de n8n; revisar el nodo If o Switch que decide envío. Prueba rápida: añadir temporalmente un nodo de registro (Move to Debug) para confirmar que el payload llega hasta ese punto. Ejemplo: en la empresa ficticia TecLicit S.A., el problema fue un token de Slack rotado tras una reorganización de canales; la solución fue regenerar el token y actualizar la credencial en n8n. - Error 2: Fallo en la extracción de datos
-
Síntoma: El nodo HTTP Request devuelve 200 pero el siguiente Function node falla al parsear JSON.
Causa probable: Cambio en la estructura del API o en el formato de la respuesta (por ejemplo, HTML en lugar de JSON), o Headers incorrectos como Accept o Content-Type.
Solución: Revisar la pestaña Response Format del nodo HTTP Request y establecer JSON cuando aplique. Verificar Headers en la solicitud. Para versiones incompatibles, adaptar el Function node para manejar ambos formatos. En Consorcio Abierto Iberia, se corrigió añadiendo header 'Accept: application/json' en el nodo HTTP Request. - Error 3: Cron/trigger no ejecuta
-
Síntoma: No hay ejecuciones programadas en los horarios esperados.
Causa probable: Zona horaria mal configurada en el nodo Cron o conflicto con reglas de ahorro de hora; el servidor de n8n no está en ejecución.
Solución: Comprobar timezone en el nodo Cron y en la configuración global del servidor. Verificar que el servicio n8n esté activo y revisar logs del sistema. Procedimiento: reiniciar servicio y observar primera ejecución manualmente. - Error 4: Límite de rate-limits en API
-
Síntoma: Respuestas 429 o bloqueos temporales tras múltiples ejecuciones seguidas.
Causa probable: Exceso de peticiones simultáneas al proveedor de datos (portal de licitaciones) o ausencia de backoff/retry.
Solución: Implementar un nodo Wait entre peticiones críticas, configurar reintentos exponenciales en el nodo HTTP Request o agrupar solicitudes usando Merge/Batch. En el ejemplo de la empresa ficticia Plataforma-Compra, se implementó un backoff incremental y se redujo la frecuencia del Cron para cumplir límites. - Error 5: Transformaciones incorrectas
-
Síntoma: Campos mal mapeados en la notificación final; por ejemplo, fecha como cadena no normalizada.
Causa probable: Cambios en nombres de campos en la fuente o lógica de transformación insuficiente en Function/Set.
Solución: Añadir validaciones y normalizaciones (ej. moment.js dentro del Function node o usar expresiones n8n para formatear fechas). Mantener tests unitarios del flujo si se actualiza la fuente.
Guía rápida de configuración de nodos relevantes
- HTTP Request: Method GET, Response Format JSON, agregar header 'Accept: application/json' y credenciales de API en Headers Authorization: 'Bearer {API_KEY}'.
- Cron: Timezone configurada según la región de operación; probar con Run once para validar horario.
- Function: Añadir try/catch y devolver objeto con campo error para trazar fallos sin romper todo el flujo.
- Retry y Wait: usar Wait de 5-30 segundos y reintentos exponenciales en nodos críticos.
Adaptaciones del flujo para otros contextos
- Monitorización de contratos y ejecuciones contractuales: cambiar la fuente a API de contratación interna y añadir validaciones de hitos. Salida a ERP y correo del equipo legal.
- Detección de convocatorias locales municipales: usar un nodo Playwright o RSS Feed para scrapeo y normalizar datos; notificar equipos regionales vía Microsoft Teams.
- Vigilancia de subvenciones y ayudas públicas: integrar filtros por categoría y umbral económico, y exportar resultados a un repositorio S3 para auditoría.
- Alertas para procesos de compras estratégicas: añadir un nodo ML ligero para priorizar licitaciones de alto impacto y disparar workflow de aprobación interna en un sistema de gestión documental.
Si persiste un error crítico tras aplicar estas acciones, documente la secuencia de pasos y los datos de entrada y ejecute una ejecución manual con datos controlados. Mantenga un registro de cambios en la configuración de credenciales y en los endpoints de las fuentes para facilitar diagnósticos futuros.
Adaptaciones del flujo para otros contextos
Adaptaciones del flujo para otros contextos
Este apartado describe variantes prácticas y configuraciones concretas para adaptar el flujo de monitorización automática de licitaciones públicas a otros contextos de interés institucional o empresarial. Se prioriza la replicabilidad: se indican nodos n8n claves, parámetros recomendados y ejemplos aplicados a empresas ficticias verosímiles.
Configuración específica de nodos n8n (guía práctica)
Configuración base que suele requerirse al adaptar el flujo. Cada paso incluye subpasos y parámetros recomendados.
-
Cron – Programa de ejecución
- Trigger: tipo 'Cron'.
- Configuración: ejecutar cada 1 hora o diariamente según prioridad.
-
HTTP Request / RSS Feed Read – Fuente de datos
- Endpoint: URL del feed o API (por ejemplo 'https://api.licitaciones.example/feeds').
- Método: GET. Añadir headers de autenticación si procede.
-
Function – Normalización y enriquecimiento
- Tipo: Function.
- Ejemplo de transformación (JavaScript):
items = items.map(i => { const title = i.json.title || i.json.nombre; const pub = i.json.pubDate || i.json.fecha || null; return { json: { title, published: pub, url: i.json.link } }; }); return items;
-
IF / Filter – Reglas de relevancia
- Condiciones: palabras clave, importe mínimo, organismo remitente.
- Ejemplo: IF 'importe >= 50000' Y 'palabra clave contiene "obras"'.
-
Google Sheets / DB / Email / Slack – Salidas
- Persistencia: Google Sheets para trazabilidad rápida; DB relacional para integraciones ERP.
- Notificación: Email para dirección; Slack para equipos operativos; Webhook para sistemas internos.
Adaptaciones recomendadas (variantes del flujo)
-
Monitorización de contratos privados y concursos de proveedores
Objetivo: detectar oportunidades de subcontratación en grandes empresas. Cambios clave: fuente = portals privados y LinkedIn Jobs API; filtros por categoría 'suministros' y por región; salida = integración con CRM (Webhook a ERP). Ejemplo: La consultora ficticia 'Consorcio NovaLegal S.A.' configura un Webhook hacia su CRM interno para crear leads automáticos cuando se detectan concursos relevantes.
-
Seguimiento de subvenciones y ayudas públicas
Objetivo: identificar convocatorias de subvención. Cambios: adaptar palabras clave a programas y criterios de elegibilidad; añadir un nodo Function que calcule fechas límites y alerta 30/15/3 días antes. Ejemplo: 'Fundación Horizonte Verde' usa un Google Sheets para priorizar solicitudes y un nodo Email para notificar al equipo de financiación.
-
Alerta de cumplimiento normativo / cambios regulatorios
Objetivo: monitorizar boletines oficiales y publicaciones normativas. Cambios: fuente = BOE/Diarios oficiales; procesar textos largos mediante un nodo de extracción (Extract Text) y un servicio de NLP para detectar menciones a leyes claves; salida = canal Slack #regulatorio. Ejemplo: 'Servicios Públicos Atlántico' integra un NLP de terceros y envía resumenes diarios al equipo jurídico.
-
Integración con pipeline de adjudicaciones y ERP
Objetivo: automatizar flujo desde detección hasta registro contable. Cambios: añadir validaciones por importe, adjudicatarios potenciales; nodo SQL para insertar en la base de datos ERP; Webhook bidireccional para recibir actualizaciones de estado. Ejemplo: 'Constructora SolNorte' enlaza el flujo con su ERP para generar órdenes provisionales cuando la licitación supera umbral económico.
Output esperado (ejemplo concreto)
Ejemplo de resultado normalizado que almacenará el flujo tras aplicar filtros y enriquecimientos:
| id | título | organismo | fecha_publicacion | estado | url | relevancia |
|---|---|---|---|---|---|---|
| LIC-2026-00123 | Contrato de obras: renovación de estaciones | Ayuntamiento de Puertoverde | 2026-07-10 | Publicado | https://licitaciones.puertoverde.example/123 | Alta |
| SUB-2026-045 | Convocatoria subvención energía renovable | Consejería de Industria Regional | 2026-07-12 | Abierto | https://subvenciones.regional.example/045 | Media |
| LIC-2026-00999 | Servicio de limpieza integral edificios públicos | Entidades Centralizadas Áurea | 2026-07-14 | Publicado | https://licitaciones.aurea.example/999 | Baja |
Problemas frecuentes y soluciones
- Conexión fallida al API / feed
-
Síntoma: error 401/403 o timeout en nodo HTTP Request.
Causa: credenciales incorrectas, IP no autorizada o cambio en endpoint.
Solución: verificar API key, renovar tokens, actualizar URL y revisar whitelist IP; añadir reintentos en el nodo.
- Duplicación de registros
-
Síntoma: múltiples entradas idénticas en Google Sheets o DB.
Causa: falta de deduplicación o clave primaria mal definida.
Solución: implementar nodo 'Set' con id único calculado (por ejemplo hash de título+fecha), y usar 'Upsert' en la DB o condición IF para evitar duplicados.
- Falsos positivos por palabras clave
-
Síntoma: se envían alertas para documentos no relevantes.
Causa: reglas demasiado permisivas o ausencia de contexto semántico.
Solución: combinar filtros booleanos, aplicar NLP básico (entidades/temas) y ajustar umbral de relevancia; desarrollar listas de exclusión.
- Errores en transformaciones JavaScript
-
Síntoma: nodo Function lanza excepciones y corta la ejecución.
Causa: supuestos sobre estructura de datos no cumplidos (propiedades undefined).
Solución: añadir validaciones defensivas (existencia de campos), usar try/catch y registrar entradas problemáticas para corrección manual.
- Retrasos en notificaciones
-
Síntoma: alertas llegan con latencia superior a la esperada.
Causa: limitación en rate limits de APIs o ejecución concurrente bloqueada.
Solución: escalonar llamadas con parámetros de paginación, implementar backoff exponencial y revisar límites de ejecución del servidor n8n.
Ejemplo aplicado: La empresa ficticia 'Gestión Pública Áurea' implementó la variante de seguimiento regulatorio, añadió un nodo NLP y redujo falsos positivos en un 60% tras ajustar filtros y reglas de deduplicación. Recomendación: probar cada variante en paralelo durante 2-4 semanas en entorno de staging antes de producción.