# Dynamic Pricing Engine — Guía completa

> Guía completa del plugin Dynamic Pricing Engine para WooCommerce: instalación, configuración, 4 tipos de reglas (hora, stock, segmento, competencia), segmentos de clientes, scraping, A/B testing, registro, protecciones a 3 niveles, FAQ.

- Página: <https://www.datafirefly.com/es/documentation/dfdynamicpricing/>
- Idioma: es
- Actualizado el: 2026-07-01
- Otros idiomas: [fr](https://www.datafirefly.com/documentation/dfdynamicpricing/index.md), [en](https://www.datafirefly.com/en/documentation/dfdynamicpricing/index.md), [de](https://www.datafirefly.com/de/documentation/dfdynamicpricing/index.md), [it](https://www.datafirefly.com/it/documentation/dfdynamicpricing/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfdynamicpricing/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfdynamicpricing/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfdynamicpricing/index.md)
- Índice: <https://www.datafirefly.com/es/documentation/llms.txt>

Bienvenido a la documentación completa de **Dynamic Pricing Engine**, el motor de precios dinámicos para WooCommerce de DataFirefly. Esta guía cubre la instalación, la configuración inicial, cada tipo de regla, la segmentación de clientes, el scraping de la competencia, el A/B testing, el registro, las protecciones y la desinstalación.

**Requisitos:** WordPress 6.0+, WooCommerce 8.0+, PHP 7.4+. Compatible con HPOS y bloques de Checkout.

## Instalación

### Subida del plugin

1. Desde el back-office de WordPress, ve a **Plugins → Añadir nuevo → Subir plugin**.
2. Selecciona el archivo `dfdynamicpricing.zip` y haz clic en _Instalar ahora_.
3. Una vez completada la instalación, haz clic en _Activar plugin_.

### Qué ocurre al activar

El plugin crea 6 tablas personalizadas (prefijadas con `wp_dfdpe_`):

- `wp_dfdpe_rules` — las reglas de precios
- `wp_dfdpe_logs` — el registro de ajustes
- `wp_dfdpe_segments` — los segmentos de clientes (3 sembrados automáticamente)
- `wp_dfdpe_competitors` — el seguimiento de la competencia
- `wp_dfdpe_ab_tests` — los tests A/B
- `wp_dfdpe_ab_events` — los eventos de exposición, ATC y conversión

También se programan dos tareas cron: el scraping de la competencia (horario por defecto) y la purga del registro (diaria).

### Menú de administración

Aparece un nuevo menú **Dynamic Pricing** en la barra lateral con 7 submenús: Panel, Reglas, Segmentos, Competencia, A/B Testing, Registro, Ajustes. Todas las acciones requieren la capacidad de WordPress `manage_woocommerce`.

## Configuración inicial (Ajustes)

Antes de crear tu primera regla, da un vistazo rápido en **Dynamic Pricing → Ajustes** para ajustar los parámetros globales.

### Registro

- **Activar registro**: marcado por defecto. Cada ajuste se registra con producto, regla, cliente, contexto.
- **Retención (días)**: 60 días por defecto. La purga automática se ejecuta a diario.

El registro está limitado a 1 entrada por sesión, producto y hora para evitar el flood. Puedes desactivarlo completamente si no lo usas.

### Protecciones globales

- **Precio suelo (% del precio original)**: por ejemplo, 70 = nunca bajar del 70 % del precio original. 0 = desactivado.
- **Precio techo (% del precio original)**: por ejemplo, 130 = nunca superar el 130 %. 0 = desactivado.
- **Nunca vender por debajo del coste de compra**: activar si guardas el coste en un meta del producto.
- **Clave meta del coste de compra**: `_cost` por defecto (compatible con WooCommerce Cost of Goods).

### Scraper de la competencia

- **Frecuencia de ejecución**: horaria, dos veces al día o diaria. El scraper procesa 25 URLs por lote.

### Visualización en front

- **Mostrar precio original tachado**: útil para un efecto promo visible. Desactivar para tests A/B confidenciales.

## Crea tu primera regla

Ve a **Dynamic Pricing → Reglas → Añadir**. Cada regla tiene los mismos campos base, cualquiera que sea su tipo.

### Campos comunes

- **Nombre**: etiqueta interna, útil en el registro (ej.: «Happy hour 18h-20h»).
- **Tipo**: Hora, Stock, Segmento de cliente o Competencia.
- **Estado**: Activa o Inactiva. Una regla inactiva nunca se evalúa.
- **Prioridad**: las reglas se ejecutan en orden ascendente de prioridad. Cada regla trabaja sobre el resultado de la anterior.
- **Alcance**: Global, Categoría, Etiqueta o Producto específico.
- **Ajuste**: Porcentaje, Importe fijo, Valor definido o Match competidor (solo con tipo Competencia).
- **Suelo / Techo**: protecciones opcionales a nivel de regla.
- **Ventana de fechas**: fechas de inicio y fin para activar la regla solo durante un periodo dado.
- **Test A/B**: enlace opcional a un test A/B y su variante (ver sección A/B Testing).

**Consejo de priorización:** empieza por las reglas más amplias (globales) con prioridad baja, y luego refina con reglas específicas de prioridad más alta. Las protecciones globales configuradas en Ajustes siempre se aplican al final.

## Tipo 1 — Regla por hora

Ajusta el precio según la hora y el día de la semana. Ideal para el efecto happy hour, promos de fin de semana o tarifas nocturnas.

### Condiciones disponibles

- **Días de la semana**: selecciona uno o varios días (lunes a domingo, formato ISO).
- **Hora de inicio / Hora de fin**: formato 24h. Los rangos que cruzan la medianoche se gestionan automáticamente (ej.: 22h-02h).
- **Zona horaria**: _sitio_ (por defecto, usa la zona horaria de WordPress) o una zona específica (ej.: `Europe/Madrid`).

### Ejemplos concretos

- **Happy hour**: −15 %, jueves-viernes, 18h-20h, zona Europe/Madrid.
- **Promo de fin de semana**: −10 %, sábado-domingo, 00h-23h59.
- **Precio nocturno**: +5 %, todos los días, 22h-06h (cruza la medianoche, gestionado automáticamente).

## Tipo 2 — Regla por stock

Ajusta el precio según el nivel de stock del producto. Útil para liquidar rápidamente productos con sobrestock o valorizar los que se están agotando.

### Condiciones disponibles

- **Operador**: .
- **Umbral**: número entero.
- **Modo**: _Absoluto_ (número de unidades) o _Porcentaje del stock inicial_ (requiere el meta `_initial_stock` definido en el producto).

### Ejemplos concretos

- **Liquidación**: stock >= 50 (sobrestock) → −20 %.
- **Escasez**: stock < 5 → +10 %.
- **Porcentaje del stock inicial**: modo porcentaje, stock < 20 % del stock inicial → −5 %.

Para usar el modo Porcentaje, añade un campo meta `_initial_stock` a tus productos (vía WP All Import, ACF o un simple `update_post_meta`). Sin este meta, el modo porcentaje se ignora.

## Tipo 3 — Regla por segmento de cliente

Aplica un ajuste solo a los clientes que pertenecen a uno o varios segmentos definidos.

### Condiciones disponibles

- **Segmentos**: uno o varios segmentos existentes (ver sección Segmentos).
- **Correspondencia**: _Any_ (el cliente pertenece al menos a un segmento) o _All_ (pertenece a todos).

### Ejemplos concretos

- **Fidelidad**: segmento _loyal-customers_, ajuste −10 %.
- **Recuperación**: segmento _dormant_ (a crear), ajuste −20 % durante 7 días.
- **B2B**: segmento _b2b_ (rol `wholesale`), ajuste −25 %.

## Tipo 4 — Regla por precio de la competencia

Alinea tu precio con el de un competidor que hayas configurado en la sección Competencia. Tres estrategias disponibles.

### Estrategias

- **Match**: tu precio se convierte exactamente en el precio del competidor.
- **Undercut**: tu precio baja del competidor, en porcentaje o importe fijo.
- **Overprice**: tu precio sube por encima del competidor (posicionamiento premium).

### Condiciones disponibles

- **Modo**: _Porcentaje_ o _Importe fijo_.
- **Importe**: porcentaje (ej.: 5 para 5 %) o importe en la divisa.
- **Antigüedad máxima de los datos (horas)**: más allá, los datos de scraping se consideran demasiado antiguos y la regla pasa al comportamiento de fallback.
- **Fallback**: comportamiento si los datos de la competencia no están disponibles (por ejemplo, aplicar un ajuste neutro o saltar la regla).

### Ejemplo concreto

Undercut del 3 % del competidor A, con antigüedad máxima de 6 horas. Si el competidor A no ha sido scrapeado desde hace 6 horas, la regla se ignora y el precio queda sin cambios.

## Segmentos de clientes

Un segmento es una combinación de criterios que define un grupo de clientes. Una vez creado, un segmento puede ser objetivo de una regla de tipo _Segmento de cliente_.

### Segmentos sembrados al activar

- **new-customers**: clientes con 0 o 1 pedido.
- **loyal-customers**: clientes con 5 pedidos o más.
- **vip**: clientes que han gastado al menos 500 €.

### Crear un segmento

Desde **Dynamic Pricing → Segmentos → Añadir**, define:

- **Nombre** y **Slug** (auto-generado si está vacío).
- **Descripción** (opcional, para tu equipo).
- **Criterios**: añade tantas líneas como sea necesario. Todos los criterios deben cumplirse (lógica AND).
- **Estado**: activo o inactivo.

### Campos disponibles para los criterios

- `order_count` — número de pedidos del cliente.
- `total_spent` — total gastado (en la divisa del sitio).
- `is_guest` — 1 si el visitante no está conectado, 0 en caso contrario.
- `user_roles` — roles de WordPress del cliente (ej.: `customer`, `subscriber`, `wholesale`).
- `days_since_last_order` — días desde el último pedido.

### Operadores disponibles

Diez operadores: `==`, `!=`, `>`, `>=`, `= 60`. Apunta a los antiguos clientes que no han pedido en 2 meses.

## Competencia (scraping)

El scraper recupera automáticamente el precio mostrado en una página de producto de un competidor, según una frecuencia configurable. Los precios recuperados los usan las reglas de tipo _Competencia_.

### Añadir un competidor

Desde **Dynamic Pricing → Competencia → Añadir**:

1. **Producto WooCommerce (ID)**: el ID del producto local al que asociar el seguimiento.
2. **Nombre del competidor**: etiqueta libre (ej.: «Amazon», «El Corte Inglés»).
3. **URL**: la página de producto del competidor a scrapear.
4. **Tipo de selector**: CSS, XPath, Regex o JSON-LD.
5. **Selector**: el selector que apunta al precio (ver ejemplos abajo).
6. **Divisa**: por defecto la divisa WooCommerce del sitio.
7. **Estado**: seguimiento activo o en pausa.

### Tipos de selectores

- **CSS**: selector CSS clásico. Ejemplos: `.price .amount`, `#product-price`, `span[itemprop=price]`.
- **XPath**: expresión XPath. Ejemplo: `//span[@class="price"]`.
- **Regex**: expresión regular PHP. Ejemplo: `/€s*([d,.]+)/` — se usa el primer grupo capturado.
- **JSON-LD**: auto-detección Schema.org. Busca `price`, `offers.price`, `offers.lowPrice` en las etiquetas JSON-LD. Deja el campo Selector vacío.

### Parsing de precios

El scraper gestiona los formatos europeos (`1 299,90`) y americanos (`1,299.90`) automáticamente. Los símbolos de divisa y espacios se limpian.

### Ejecución manual

El botón **Scrapear ahora** junto a cada competidor fuerza una actualización inmediata en AJAX. Útil para probar un selector nuevo.

### Estados posibles

- **pending** — nunca scrapeado, esperando el próximo cron.
- **ok** — última ejecución exitosa.
- **error** — última ejecución fallida (mensaje almacenado en el campo _last_error_).

**Respeto a los T&C de la competencia:** el scraper realiza una petición HTTP simple con timeout corto, pero te corresponde verificar que el scraping esté autorizado por los Términos y Condiciones de los sitios objetivo. Algunas jurisdicciones regulan esta práctica.

## A/B Testing

El módulo A/B integrado permite comparar varias estrategias de precio en un mismo producto y medir su impacto en tiempo real (exposiciones, añadidos al carrito, conversiones, RPV).

### Crear un test

Desde **Dynamic Pricing → A/B Testing → Nuevo test**:

1. **Nombre** y **slug**.
2. **Variantes**: lista de etiquetas separadas por comas. Por defecto `A,B`.
3. **Reparto del tráfico**: peso relativo por variante (normalizado automáticamente). Por ejemplo `50/50`, `70/30` o `1/1/1` para tres variantes equiparadas.
4. **Estado**: Borrador, En curso, En pausa o Terminado. Solo un test _En curso_ asigna visitantes.
5. **Ventana**: fechas opcionales de inicio y fin.

### Enlazar una regla con una variante

En el formulario de una regla, selecciona el test A/B y la variante objetivo. La regla solo se aplicará a los visitantes asignados a esa variante concreta.

### Cómo funciona la asignación

En la primera exposición, el plugin asigna al visitante a una variante según los pesos configurados, y luego almacena esta elección en una cookie `dfdpe_ab`. Una cookie de sesión aparte `dfdpe_sid` permite seguir al mismo visitante a lo largo de su sesión, conectado o no.

### Eventos rastreados

- **exposure** — primera vez que el visitante ve un precio afectado por el test.
- **atc** — añadido al carrito (hook `woocommerce_add_to_cart`).
- **conversion** — pedido finalizado (hook `woocommerce_thankyou`). Se registra el importe total del pedido.

### Métricas calculadas (página Resultados)

- **Exposiciones** y **Sesiones únicas**.
- **CR ATC** — tasa de añadido al carrito (ATC / exposiciones).
- **CR Conv.** — tasa de conversión (conversiones / exposiciones).
- **Ingresos** — total de conversiones.
- **RPV** — ingresos por visitante (ingresos / exposiciones). Es la métrica clave de decisión: la variante con el RPV más alto se destaca automáticamente (badge _Ganador_).

**Buena práctica:** deja correr un test al menos 2 semanas antes de concluir. Un test A/B fiable requiere varios miles de exposiciones para alcanzar significancia estadística.

## Registro de ajustes

Cada ajuste de precio aplicado en el front-office puede registrarse. El registro es accesible vía **Dynamic Pricing → Registro**.

### Información registrada

- Fecha y hora.
- Producto y variación.
- Regla activada (ID).
- Cliente (ID) o sesión anónima.
- Precio original, precio final, importe del ajuste.
- Test A/B y variante (si aplica).
- Contexto: `frontend`, `cart`, `checkout`.

### Filtros disponibles

Puedes filtrar por ID de producto, ID de regla o ID de test A/B. La paginación muestra 50 entradas por página.

### Rate-limiting

Para evitar el flood, el plugin limita el registro a 1 entrada por sesión, producto y hora. Una sesión que consulta 100 veces la misma ficha de producto en una hora solo genera una línea.

### Purga automática

Una tarea cron diaria (`dfdpe_cron_purge_logs`) elimina las entradas más antiguas que la retención configurada (60 días por defecto).

## Protecciones: cómo funcionan

Tres niveles de protección sucesivos impiden que tu precio final alcance un nivel peligroso.

### Nivel 1 — Protecciones por regla

Cada regla puede definir su propio suelo y techo. Se aplican inmediatamente después del ajuste de esa regla. Útil para topar los efectos de una regla concreta (ej.: «la happy hour nunca puede bajar de 30 €, sea cual sea el precio original»).

### Nivel 2 — Protecciones globales

Definidas en Ajustes, como porcentaje del precio original:

- **Precio suelo**: el precio final no puede bajar de este porcentaje.
- **Precio techo**: el precio final no puede superar este porcentaje.

Ejemplo: suelo al 70 % y techo al 130 %. Un producto de 100 € nunca podrá bajar de 70 € ni superar los 130 €, sean cuales sean las reglas aplicadas.

### Nivel 3 — Protección coste de compra

Si está activada en Ajustes, esta protección impide que el precio final baje del valor del meta `_cost` (o de la clave personalizada que configures). Es la garantía última para no vender nunca con pérdidas.

Los tres niveles son acumulativos y se aplican en este orden: regla → global → coste. El precio final siempre es el resultado más «protegido» de los tres.

## Compatibilidad HPOS y caché

### HPOS (High-Performance Order Storage)

El plugin declara compatibilidad con `custom_order_tables` y `cart_checkout_blocks` desde la inicialización. No se requiere ninguna acción adicional si has activado HPOS en WooCommerce.

### Caché de precios de variaciones

WooCommerce almacena en caché los precios mínimo y máximo de los productos variables mediante un hash. El plugin inyecta un seed dinámico (usuario + sesión + bucket de 5 minutos) en este hash vía el filtro `woocommerce_get_variation_prices_hash`, lo que fuerza a WooCommerce a recalcular los precios en el momento adecuado sin romper la caché para los demás visitantes.

## FAQ

### ¿Puedo combinar varias reglas en el mismo producto?

Sí. Las reglas se ejecutan en orden de prioridad, cada una trabajando sobre el resultado de la anterior. Puedes encadenar «−10 % VIP» y luego «tope al 130 % del coste».

### ¿Se aplican también las reglas al carrito y checkout?

Sí. Un hook sobre `woocommerce_before_calculate_totals` recalcula los precios de las líneas del carrito en cada visualización.

### ¿Es el plugin compatible con cachés de servidor (Redis, Varnish)?

Sí, pero si tu caché es muy agresiva a nivel de página completa, los precios mostrados pueden ser los cacheados. Para una visualización dinámica fiable, excluye las páginas de producto del caché full-page, o usa fragmentos ESI.

### ¿Puedo desactivar el plugin sin perder mis reglas?

Sí. La desactivación no elimina ningún dato. Solo la desinstalación vía _Plugins → Eliminar_ dispara el script `uninstall.php`.

### ¿Cómo exporto mis datos?

Todos los datos se almacenan en las 6 tablas `wp_dfdpe_*`. Puedes exportarlas vía phpMyAdmin, WP-CLI (`wp db export`) o cualquier herramienta de copia de seguridad WordPress.

## Desinstalación

Para desinstalar completamente:

1. Desactiva el plugin desde **Plugins**.
2. Haz clic en _Eliminar_.

El script `uninstall.php` elimina entonces:

- Las 6 tablas `wp_dfdpe_*`.
- Las 9 opciones WordPress creadas.
- Las tareas cron programadas.

La desinstalación es definitiva e irreversible. Haz una copia de seguridad de tus reglas, segmentos y registro antes si quieres poder revertir.

## Soporte

Tu licencia incluye 12 meses de soporte y actualizaciones. Para cualquier pregunta, contacta con nosotros vía [datafirefly.com/contact](https://www.datafirefly.com/contact/).
