¿Monitoreas precios para un minorista que opera en una docena de países? En Lidl, la misma referencia de ERP puede venderse por €17.99 en Francia, €29.99 en Alemania y 119 PLN en Polonia el mismo día, con o sin promoción, a veces sin listado alguno.
Para los equipos de precios y datos, el desafío no es solo recolectar esos números: es comparar ofertas regionales distintas sin mezclar monedas, promociones asincrónicas y brechas en el surtido. Piloterr muestra cada tienda de Lidl como se muestra al cliente local, a través de la API de Lidl, en 27 mercados.
Este artículo explica cómo estructurar un pipeline de monitoreo de precios multirregional, por qué existen las diferencias de precios (y no son errores de datos), y cómo observarlas en la práctica con llamadas a la API y un script en Python.
Un producto, muchas ofertas comerciales
En la teoría económica, la discriminación de precios significa cobrar a cada segmento según su disposición a pagar. En línea, la segmentación geográfica es trivial: lidl.fr y lidl.de son contextos comerciales distintos incluso cuando comparten la misma marca.
En la práctica, cada tienda nacional calibra el precio en función de:
- La competencia local (Castorama en Francia, OBI en Alemania, etc.)
- El posicionamiento percibido de la marca en ese mercado
- El calendario de promociones de la subsidiaria
- El poder adquisitivo y los anclajes de precios locales
El resultado: misma identidad de producto, oferta económica diferente. Esto no es una anomalía que deba corregirse en tu pipeline. Son los datos que debes capturar.
Qué hace que el precio varíe de un país a otro
Costos y restricciones locales
Dos regiones pueden vender el mismo SKU mientras enfrentan estructuras de costos diferentes:
| Factor | Impacto |
|---|---|
| Normas de IVA e impuestos | Visualización con impuestos incluidos, tasas variables |
| Aduanas e importación | Especialmente fuera de bloques de mercado único |
| Logística y última milla | Contratos con transportistas, mano de obra |
| Cumplimiento (empaque, etiquetado) | Costos de cumplimiento local |
| Fraude y métodos de pago | Riesgo y tarifas específicas del mercado |
El precio mostrado incorpora estas restricciones. Comparar Francia y Polonia sin conversión de divisas o contexto local dice poco sobre la estrategia comercial real.
Las promociones no están sincronizadas
Los mecanismos de promoción (precios tachados, insignias de "−44%", etiquetas de "mega oferta") se deciden país por país. Un producto en oferta en Francia puede estar a precio completo en Alemania el mismo día. Esto no es una inconsistencia de la API: los calendarios de promociones son descentralizados.
Para el análisis, dos consecuencias:
- El precio spot y el precio de referencia deben almacenarse por separado.
discount_percentagees un campo derivado: puede estar ausente cuando no hay promoción local en curso.
El surtido nunca es 100% idéntico
Algunas referencias de ERP son paneuropeas. Otras solo se listan donde la demanda, la regulación o la logística lo permiten. Los títulos, slugs y páginas de productos también varían según la localidad.
Un listado faltante es en sí mismo una señal: producto no distribuido, agotamiento temporal o deslistado del catálogo. No lo confundas con un error de solicitud.
La moneda es parte de la oferta legal
Las tiendas multirregionales exponen la moneda nativa de su jurisdicción. En algunos mercados (Bulgaria, por ejemplo), puede aparecer una moneda secundaria junto a la primaria.
En análisis, siempre almacena (precio, moneda, región, marca de tiempo). Convierte fuera de línea cuando necesites comparabilidad. La API no debe normalizar todo a EUR: el precio mostrado es la oferta comercial y legal como la ve el cliente.
El modelo mental adecuado para tus datos
Piensa en ofertas regionales, no en un solo precio:
Identidad global del producto (ERP / SKU)
│
┌────┼────┐
▼ ▼ ▼
Oferta Oferta Oferta
FR DE PL
€17.99 €29.99 119 PLN
promo — —
Cada par (erp_id, región) es una oferta distinta. La clave de tu registro debe verse así:
(erp_id, región, observado_en) → { precio, moneda, precio_anterior, en_stock, url, locale }
Ese modelo evita comparaciones engañosas y paneles que mezclan peras con manzanas.
Caso de estudio: un taladro PARKSIDE en 8 países
Toma la referencia de ERP 100397447, el taladro percutor PARKSIDE PSBM 750 B3. Mismo producto, observado en varias tiendas de Lidl en junio de 2026:
| Región | Precio | Moneda | Precio anterior | Lectura |
|---|---|---|---|---|
| Francia | 17.99 | EUR | 31.99 | Promoción activa (~−44%) |
| España | 19.99 | EUR | — | Sin tachado en el momento de la observación |
| Eslovaquia | 19.99 | EUR | 29.99 | Promoción |
| Bélgica (FR/NL) | 24.99 | EUR | 34.99 | Mismo precio en ambas localidades BE |
| Polonia | 119.00 | PLN | — | ≈ €27 a tipo de cambio típico |
| Alemania | 29.99 | EUR | — | ~67% más alto en EUR nominal que FR |
| Países Bajos | 29.99 | EUR | — | Alineado con Alemania |
| República Checa | 999.90 | CZK | — | ≈ €40 a tipo de cambio típico |
No listado en el momento de la prueba: Reino Unido, Italia, Portugal, Hungría, Rumanía. Mismo ERP, surtido parcial.
Cuatro lecciones de una sola página de producto:
- El euro no garantiza uniformidad: €17.99 vs €29.99 dentro de la zona euro.
- Las promociones son asincrónicas: FR, SK y BE con descuento; DE y NL a precio completo.
- Las monedas requieren conversión para cualquier comparación seria.
- La cobertura del catálogo varía: un producto "europeo" no está necesariamente en todas partes.
Lo que devuelve la API (Francia vs Alemania)
En Francia, la tienda muestra una promoción:
{
"product_id": "100397447",
"title": "PARKSIDE® Perceuse à percussion PSBM 750 B3, 10 Nm, 750 W",
"price": 17.99,
"old_price": 31.99,
"discount_percentage": 43.0,
"currency": "EUR",
"locale": "fr-fr",
"in_stock": true
}
En Alemania, misma referencia, título diferente, precio diferente, sin promoción:
{
"product_id": "100397447",
"title": "PARKSIDE® Schlagbohrmaschine »PSBM 750 B3«",
"price": 29.99,
"currency": "EUR",
"locale": "de-de",
"in_stock": true
}
La API no intenta armonizar. Muestra lo que muestra cada tienda. La diferencia que ves en las respuestas es la misma diferencia que vería un cliente al cambiar de sitios nacionales.
Ejemplos de la API de Piloterr
Dos endpoints cubren el caso de uso: product para una oferta regional precisa, search para descubrir referencias en un catálogo nacional. El parámetro query acepta una referencia de ERP, una URL completa de Lidl o una palabra clave; region apunta a la tienda cuando no se proporciona una URL.
curl: mismo ERP, dos regiones
Reemplaza YOUR-API-KEY con tu clave de la panel de Piloterr.
Francia (promoción activa en el momento de la observación):
curl -G "https://api.piloterr.com/v2/lidl/product" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=100397447" \
--data-urlencode "region=fr"
Alemania (misma referencia, precio diferente):
curl -G "https://api.piloterr.com/v2/lidl/product" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=100397447" \
--data-urlencode "region=de"
También puedes pasar una URL nacional: la región se infiere del dominio y el parámetro region se ignora.
curl -G "https://api.piloterr.com/v2/lidl/product" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=https://www.lidl.pl/p/parkside-wiertarka-udarowa-750-w-psbm-750-b3/p100397447"
Búsqueda para encontrar referencias de ERP en un mercado determinado:
curl -G "https://api.piloterr.com/v2/lidl/search" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=drill" \
--data-urlencode "region=de"
Python: compara una referencia en varias regiones
Este script consulta varias tiendas para la misma referencia de ERP e imprime una instantánea comparativa. Los listados faltantes se tratan como ofertas nulas, no como errores fatales.
import requests
from datetime import datetime, timezone
PILOTERR_API_KEY = "YOUR-API-KEY"
ERP_ID = "100397447"
REGIONS = ["fr", "de", "pl", "es", "nl", "cs"]
def fetch_lidl_offer(erp_id: str, region: str) -> dict | None:
response = requests.get(
"https://api.piloterr.com/v2/lidl/product",
headers={"x-api-key": PILOTERR_API_KEY},
params={"query": erp_id, "region": region},
timeout=30,
)
if response.status_code == 404:
return None
response.raise_for_status()
return response.json()
def main():
observed_at = datetime.now(timezone.utc).isoformat()
print(f"ERP {ERP_ID} — observado en {observed_at}\n")
for region in REGIONS:
try:
offer = fetch_lidl_offer(ERP_ID, region)
except requests.HTTPError as exc:
print(f"{region.upper():<4} error {exc}")
continue
if offer is None:
print(f"{region.upper():<4} — no listado")
continue
price = offer.get("price")
currency = offer.get("currency", "?")
old_price = offer.get("old_price")
promo = f" (antes {old_price})" if old_price else ""
stock = "en stock" if offer.get("in_stock") else "agotado"
print(f"{region.upper():<4} {price} {currency}{promo} {stock}")
if __name__ == "__main__":
main()
Salida de ejemplo (junio de 2026):
ERP 100397447 — observado en 2026-06-15T09:00:00+00:00
FR 17.99 EUR (antes 31.99) en stock
DE 29.99 EUR en stock
PL 119.0 PLN en stock
ES 19.99 EUR en stock
NL 29.99 EUR en stock
CS 999.9 CZK en stock
Para la comparación entre monedas, convierte fuera de línea con tus tasas de cambio del día. La API devuelve el precio tal como se muestra en la tienda local, que es la granularidad adecuada para el monitoreo conforme y el archivo de promociones.
Documentación completa: Búsqueda en Lidl y scraper de Lidl.
Qué significa esto para el monitoreo de precios
Si monitoreas precios multirregionales (Lidl o en otros lugares), se aplican algunos principios simples:
Haz
- Fija una clave global del producto (ERP, GTIN, SKU del fabricante) para unir ofertas.
- Consulta cada región explícitamente:
region=fr,region=de, etc. - Mantén marca de tiempo, moneda y locale en cada instantánea.
- Trata los listados faltantes como ofertas nulas, no como errores.
- Separa el precio spot, el precio de referencia y la disponibilidad.
Evita
- Comparar 119 PLN y €17.99 sin conversión de divisas.
- Usar una sola región como "el precio de Lidl".
- Esperar banderas de promoción idénticas en todos los países.
- Confundir la ausencia del producto con una falla técnica.
Para Lidl específicamente, Piloterr cubre 27 tiendas nacionales (fr, de, pl, gb, ch, cs, be, etc.).
Casos extremos que sorprenden a los equipos en producción
| Fenómeno | Interpretación |
|---|---|
price: null en algunos listados austriacos | Producto visible, pero sin precio en línea en la carga útil |
| Doble moneda (ej. Bulgaria) | La moneda principal sigue las reglas de visualización de la tienda |
Producto faltante en lidl.co.uk | Brecha en el surtido, no fallo de la API |
| Títulos y slugs diferentes FR/DE | Mismo ERP, merchandising localizado |
old_price inconsistente en algunas categorías | Valida la semántica por categoría de producto |
Estos casos no invalidan el principio general: cada región es una oferta autónoma.
En resumen
Las diferencias de precios entre países en el comercio electrónico son estructurales e intencionales. Provienen de la segmentación de mercados, costos locales, monedas, promociones descentralizadas y elecciones de surtido.
Lidl es una ilustración clara: una referencia de ERP, ocho ofertas regionales diferentes en la misma herramienta. Con Piloterr, accedes a cada una como se presenta al cliente local, lista para alimentar un pipeline de monitoreo de precios o un análisis de posicionamiento competitivo.
Para más información sobre el cumplimiento de precios promocionales en Europa, consulta nuestro artículo sobre la directiva Omnibus.
Los precios y la disponibilidad mencionados reflejan observaciones de junio de 2026. Cambian con las promociones y los reajustes de precios.