AI Competitor — Monitoreo de precios de la competencia
Instalar y configurar la vigilancia de precios de la competencia en PrestaShop 8 y 9: perfiles de competidor, rastreo del catálogo, extracción por IA, alertas y analíticas.
Presentación
AI Competitor vigila los precios de tu competencia desde tu back office de PrestaShop. Declaras un competidor una vez, con su nombre y sus selectores; el módulo puede después recuperar la lista completa de sus productos a partir de su sitemap, emparejarla con tu catálogo, leer los precios a intervalos regulares, detectar las variaciones significativas, avisarte por email y proponerte un precio ajustado según tu estrategia.
Compatible con PrestaShop 8.0 a 9.x, PHP 7.4 a 8.3, multitienda nativa. Sin dependencias de Composer, sin biblioteca JavaScript externa.
Instalación
- En tu back office, abre Módulos → Gestor de módulos → Subir un módulo.
- Sube el archivo
dfaicompetitor.zip. - El módulo crea sus tablas y el menú Catálogo → AI Competitor, que reúne seis páginas: panel, competidores, URLs monitorizadas, catálogo del competidor, informes y analíticas, importación/exportación.
Tras la instalación se genera un token de cron único. Lo encontrarás en el panel del módulo.
Actualización desde una versión 1.0.x
Sube simplemente el nuevo ZIP sobre la instalación existente. El script de actualización crea las tablas nuevas, añade las columnas que faltan y, sobre todo, genera un perfil de competidor para cada nombre de competidor ya utilizado antes de vincularle las URLs correspondientes. Tus datos existentes se conservan y no hay nada que volver a introducir.
Reinstalar un paquete con el mismo número de versión que el ya instalado no vuelve a ejecutar el script de actualización, y la opcache de PHP puede seguir sirviendo los archivos antiguos. Comprueba siempre el número de versión que muestra el panel después de una subida.
Configuración inicial
Abre Catálogo → AI Competitor. El panel reúne las estadísticas y cinco bloques de configuración.
Proveedor de IA
El respaldo por IA es opcional pero recomendable: es el que toma el relevo cuando un sitio de la competencia no expone ni datos estructurados ni un selector aprovechable. Hay tres proveedores compatibles:
- Mistral AI (por defecto), el más económico, modelo aconsejado:
mistral-small-latest - Anthropic Claude, la mejor precisión en páginas complejas, modelo aconsejado:
claude-haiku-4-5-20251001 - OpenAI, buen término medio, modelo aconsejado:
gpt-4o-mini
Introduce la clave API del proveedor elegido. Se muestra enmascarada; deja el campo vacío en un guardado posterior para conservar la clave. Pagas directamente al proveedor, sin recargo de DataFirefly.
Alertas
- Email de notificación: destinatario de los resúmenes de alertas y del informe semanal.
- Umbral de variación en porcentaje, 3 % por defecto. Por debajo no se crea ninguna alerta.
- Día del informe semanal, lunes por defecto.
Scraping
- URLs por lote de cron: número de URLs leídas en cada ejecución, 20 por defecto.
- Intervalo por defecto en horas, aplicado a las URLs nuevas, 24 h por defecto.
- Timeout HTTP y User-Agent. El User-Agent entregado identifica al robot por su nombre (
DataFireflyBot); algunos sitios aceptan un robot con nombre que de otro modo bloquearían. - Retención del histórico en días, 180 por defecto.
Rastreo del catálogo
- Páginas por tramo: número de fichas de la competencia abiertas en una pasada, 15 por defecto.
- Segundos por tramo: presupuesto de tiempo de cada pasada, 20 por defecto. Mantenlo por debajo de tu
max_execution_timede PHP. - Umbral de emparejamiento: similitud de título mínima para aceptar una correspondencia automática, 82 por defecto.
- Monitorizar automáticamente las correspondencias: crea una URL monitorizada en cuanto una página rastreada se empareja con uno de tus productos. Desactivado por defecto.
- Hacer avanzar los rastreos desde el cron: activado por defecto.
Estrategia de ajuste
Tres estrategias determinan el precio sugerido, calculado siempre a partir del competidor más barato:
- Igualar: el mismo precio que el competidor más bajo.
- Undercut de X %: X % por debajo, 1 % por defecto.
- Premium a X %: X % por encima, para un posicionamiento de gama alta asumido.
Declarar un competidor
Desde la versión 1.1.0 un competidor es una ficha propia y no una simple etiqueta reescrita en cada URL. Abre Catálogo → AI Competitor → Competidores → Añadir. La ficha se divide en tres pestañas.
Identidad
El nombre que se muestra en todas partes, el dominio sin esquema (ejemplo.com), la moneda, el intervalo de lectura, la opción de extracción por IA forzada y un campo de notas libres. El dominio es lo que permite al módulo vincular automáticamente una URL nueva al competidor correcto.
Selectores
Los selectores CSS del precio, del nombre del producto, del SKU, de la imagen y de la disponibilidad. Déjalos vacíos si el sitio publica JSON-LD, que es el caso de la mayoría de tiendas modernas. Sintaxis admitida: etiqueta, .clase, #identificador, [atributo=valor], descendiente e hijo directo. Ejemplo: div.product-price > span.amount
Esta es la principal ventaja de la ficha de competidor: el día en que un sitio rehace su tema y rompe un selector, lo corriges aquí una sola vez y la corrección se propaga a todas las URLs de ese competidor que no tengan un selector propio.
Rastreo del catálogo
La URL del sitemap (déjala vacía para leer las directivas Sitemap: del robots.txt del dominio), la URL de una página de categoría de partida, el selector de los enlaces de producto y el del enlace a la página siguiente, los patrones de URL que retener o descartar, el retardo entre dos peticiones, el tope de productos y el respeto del robots.txt.
Los patrones aceptan una simple subcadena o una expresión regular delimitada por barras. En una tienda española, /producto/ como patrón a retener basta a menudo para aislar las fichas de producto en un sitemap que también contiene el blog y las páginas CMS.
Rastrear el catálogo de un competidor
Abre Catálogo → AI Competitor → Catálogo del competidor, elige el competidor, la fuente de descubrimiento y el tope de productos, y lanza el rastreo.
Hay dos fuentes disponibles:
- Sitemap, recomendado. El módulo lee el sitemap configurado o el anunciado por el robots.txt, sigue los índices de sitemaps de forma recursiva y retiene las direcciones que corresponden a tus patrones.
- Páginas de categoría, cuando ningún sitemap es aprovechable. El módulo parte de la URL de listado, recoge los enlaces de producto mediante el selector del competidor y sigue el enlace de página siguiente.
Al descubrimiento le sigue una fase de enriquecimiento que abre cada página, extrae título, SKU, EAN, marca, precio, disponibilidad e imagen, e intenta el emparejamiento con tu catálogo.
El rastreo avanza por tramos acotados en tiempo, pilotados por la página abierta con una barra de progreso, y se reanuda en cada pasada del cron. Un sitemap de decenas de miles de URLs se procesa sin llegar nunca al max_execution_time de PHP. Puedes cerrar la página: el trabajo continúa por el lado del cron.
El emparejamiento con tu catálogo
El módulo prueba tres vías, en orden decreciente de fiabilidad:
- EAN13, buscado en tus productos y en sus combinaciones. Correspondencia segura, puntuación 100.
- Referencia, referencia de proveedor o MPN. Puntuación 95.
- Similitud de título, con una ponderación que da más peso a los números de modelo y a las marcas que a las palabras comunes, y una penalización cuando los dos títulos tienen longitudes muy distintas. La puntuación debe superar el umbral configurado, 82 por defecto.
Cada línea del catálogo muestra el método y la puntuación de su correspondencia. Una correspondencia dudosa se corrige a mano: el campo de emparejamiento ofrece autocompletado sobre tu catálogo, por nombre o por referencia. Los botones Reemparejar relanzan la operación sobre las líneas sin emparejar, o sobre todas, lo que resulta útil tras haber corregido referencias en tu lado.
Una línea emparejada pasa a ser una URL monitorizada mediante su botón Monitorizar, o en lote mediante la acción de grupo sobre una selección. La URL creada hereda el nombre, los selectores, la moneda y el intervalo del competidor.
Añadir una URL a mano
El rastreo no sustituye la entrada puntual. Abre Catálogo → AI Competitor → URLs monitorizadas → Añadir:
- Competidor: la ficha de la que heredará la URL. Déjalo vacío para introducirlo todo a mano.
- Producto: seleccionado en tu catálogo.
- URL: la dirección completa de la ficha de producto de la competencia.
- Nombre del competidor, selector CSS, moneda, intervalo: se rellenan desde el competidor cuando los dejas vacíos.
Si no eliges competidor, el módulo busca aquel cuyo dominio corresponde a la dirección introducida y le vincula la URL. El botón Scrape de cada línea lanza una lectura inmediata, práctico para validar una URL nada más crearla.
Cómo funciona la extracción
Para cada URL el módulo prueba cuatro métodos en cascada y se detiene en el primero que funciona:
- JSON-LD: los datos estructurados Product/Offer, presentes en la gran mayoría de sitios de comercio electrónico. El precio, la moneda, la disponibilidad y, para el rastreo, el título, el SKU, el GTIN y la marca, se leen directamente sin configuración.
- OpenGraph: las etiquetas meta product price amount.
- Selector CSS: el del competidor, o el propio de la URL si lo tiene.
- IA: un extracto HTML limpio se envía a tu proveedor, que devuelve el precio, la moneda y el estado de stock. Se gestionan los formatos de precio internacionales (1 299,90 igual que 1.234,56 o $49.99).
Empieza siempre sin selector CSS: el JSON-LD basta en la mayoría de casos. Añade un selector o la IA forzada solo si la columna Status muestra no_price.
Importación y exportación
La página Importación / Exportación sirve para llevar una configuración de una tienda a otra.
Competidores en JSON
La exportación produce un archivo con los nombres, dominios, selectores y ajustes de rastreo. Marca los competidores que incluir, o no marques ninguno para exportarlos todos. Al importar, la correspondencia se hace primero por nombre y después por dominio; una casilla decide si un competidor ya presente se actualiza o se ignora, y un modo de vista previa anuncia el resultado sin escribir nada.
URLs monitorizadas en CSV
Columnas esperadas: product_id, product_reference, competitor_name, competitor_domain, url, price_selector, currency_iso, use_ai_extraction, scrape_interval_hours, active.
Solo competitor_name y url son obligatorias, más product_id o product_reference para saber a qué producto vincular la URL. Un nombre de competidor desconocido crea su ficha automáticamente, de modo que un solo archivo basta para arrancar una instalación entera. El separador se detecta automáticamente, y la importación arranca en modo vista previa, que informa línea a línea de lo que se crearía, actualizaría o ignoraría.
Catálogo del competidor en CSV
Exportación de todo lo que el rastreo ha descubierto, con el producto emparejado, el método y la puntuación. Una casilla restringe la exportación solo a las líneas emparejadas. Práctico para una auditoría sin conexión o para compartir con tu equipo de compras.
Configurar el cron
El funcionamiento periódico se apoya en un endpoint protegido por token, mostrado en el panel. Programa su llamada cada 30 minutos:
*/30 * * * * curl -s "https://tu-tienda.com/index.php?fc=module&module=dfaicompetitor&controller=cron&token=TU_TOKEN" > /dev/null
En cada ejecución, el cron lee el lote de URLs cuyo intervalo ha vencido, envía los emails de alertas pendientes, expide el informe semanal si es el día adecuado, hace avanzar un tramo de un rastreo de catálogo en curso y purga el histórico más allá de la retención configurada. La respuesta es un JSON resumen.
El token puede regenerarse en cualquier momento desde el panel, en cuyo caso los crons existentes deben actualizarse. También hay un lanzamiento manual mediante el botón Run cron now.
Alertas
Se generan cinco tipos de alerta, cada uno con una severidad:
- price_drop / price_rise: variación por encima del umbral. Una variación igual o superior al 10 % pasa a critical.
- undercut: un competidor baja de tu precio de venta con impuestos. Siempre critical.
- out_of_stock / back_in_stock: transiciones de disponibilidad detectadas mediante los datos estructurados o la IA.
- scrape_error: únicamente tras 3 fallos consecutivos, para eliminar el ruido de las indisponibilidades pasajeras.
Las alertas se agrupan en un único email resumen por ejecución del cron.
Informes y analíticas
La pantalla Informes y analíticas cabe en cuatro pestañas, detrás de una franja de indicadores mostrada permanentemente: productos comparados, porcentaje de productos donde eres el más barato, diferencia media frente al precio mínimo del mercado, alertas abiertas, salud del scraping. Un selector de periodo cubre 7, 30 o 90 días.
Vista general
Tu posición en el mercado en forma de barra (el más barato, en medio, el más caro), los productos donde pierdes en precio ordenados por diferencia decreciente, aquellos donde tienes margen para subir, una tabla por competidor que indica quién te baja el precio más a menudo, y la síntesis ejecutiva redactada por la IA. Las oportunidades se exportan en CSV.
Alertas
La lista filtrable por tipo, severidad, estado y texto libre, con un gráfico del volumen diario por severidad. Cada línea se confirma o se reabre sin recargar la página, y el contador de alertas abiertas se actualiza en la franja.
Análisis de producto
Elige un producto monitorizado: el módulo traza tu precio frente al de cada competidor en el periodo, muestra la sugerencia de ajuste con el precio actual y el precio propuesto uno al lado del otro, y lista las fuentes con un botón de lectura inmediata en cada una.
Desde la versión 1.1.0, cada lectura registra también tu propio precio del momento. Es lo que hace reconstruible el histórico de las diferencias. En una tienda actualizada desde una 1.0.x, la curva de tu precio solo es exacta a partir de las lecturas posteriores a la actualización; antes de esa fecha, el módulo usa tu precio actual como respaldo.
Salud
Las URLs que fallan, con su estado, el número de fallos consecutivos, el último error y un botón de reintento, más una tasa de éxito por competidor. Es el primer sitio donde mirar cuando una cifra parece falsa: un competidor cuyo scraping ha caído distorsiona las medias.
Sugerencia de precio
En la pestaña de análisis de producto, el módulo muestra tu precio actual, el mínimo, la media y el máximo de la competencia, las fuentes y el precio sugerido según tu estrategia. El botón Aplicar escribe el precio en el producto de PrestaShop.
La aplicación nunca es automática. Es una decisión deliberada para evitar las espirales de bajada en espejo entre competidores equipados con el mismo tipo de herramienta. La conversión de precio con impuestos a precio sin impuestos se gestiona automáticamente según el tipo impositivo del producto.
Resolución de problemas
El rastreo no descubre ninguna página
Comprueba primero que el dominio del competidor está indicado sin esquema ni www.. Abre después https://dominio/robots.txt en un navegador: si no contiene ninguna directiva Sitemap:, indica la URL del sitemap a mano en la ficha del competidor. Si el sitemap existe pero no se retiene nada, tu patrón de filtrado es probablemente demasiado estricto: vacíalo para ver qué aparece y después ajústalo.
El rastreo descubre páginas que no son productos
Indica en el patrón a retener el segmento común a las fichas de producto del sitio, por ejemplo /producto/ o /p/, y en el patrón a descartar lo que contamina el resultado, por ejemplo /blog/. Vacía después el catálogo del competidor y relanza.
Muchas páginas quedan sin emparejar
Mira primero si las fichas de la competencia exponen un SKU o un EAN: sin un identificador común, solo la similitud de título puede funcionar. Indica el selector de SKU en la ficha del competidor, relanza el rastreo y usa después Reemparejar. Si tus títulos difieren mucho de los del competidor, baja el umbral de emparejamiento a 75 y revisa las correspondencias obtenidas antes de dejarlo así.
Estado «no_price»
Ninguno de los métodos ha encontrado precio. Comprueba la URL en un navegador, añade un selector CSS de precio en la ficha del competidor, o activa la extracción por IA forzada.
Estado «error» o «blocked»
error significa que la página no ha respondido (HTTP 400 o superior, o timeout). blocked significa que el robots.txt del sitio prohíbe esa dirección a nuestro robot. En el primer caso, personaliza el User-Agent, aumenta el timeout o amplía el intervalo. En el segundo, es una decisión del sitio visitado que te corresponde valorar.
La extracción por IA no funciona
Comprueba que la clave API es válida y que el modelo existe en tu proveedor. Los errores de llamada a la IA se registran en Parámetros avanzados → Logs con el prefijo [dfaicompetitor].
Los emails no llegan
Prueba la configuración de email de PrestaShop en Parámetros avanzados → E-mail. El módulo usa el sistema de correo nativo con sus propias plantillas FR y EN.
Buenas prácticas y cumplimiento
- Deja activado el respeto del robots.txt. Se aplica tanto al descubrimiento como a la lectura de las fichas, respeta un
Crawl-delaypublicado y aplica la regla de precedencia del estándar: entre unAllowy unDisallowque coinciden ambos, gana la regla más larga. - Mantén un retardo entre peticiones de al menos un segundo y un tope de productos razonable en el primer rastreo de un sitio que no conoces.
- Amplía los intervalos de lectura: de 6 a 24 h por URL bastan de sobra para la vigilancia de precios.
- Conserva un User-Agent identificable. Es la práctica leal esperada en vigilancia competitiva, y algunos sitios toleran un robot con nombre que de otro modo bloquearían.
- La lectura de precios públicos es en general lícita en Europa, pero sigues siendo responsable del uso de los datos recogidos y de valorar las condiciones de uso de los sitios visitados.