Compara el ADR de toda tu cartera
Una tabla de cartera es fácil de imprimir y fácil de leer mal. Doce ADR uno al lado del otro parecen comparables; solo lo son si cada hotel se preció en las mismas noches, con el mismo producto y recogido de la misma forma. Esta receta imprime la tabla y, debajo, cada motivo para desconfiar de una línea.

Qué vas a construir
Un comando que imprime una línea por hotel — el ADR de una ventana de noches, su distancia a la mediana de la cartera, en cuántas noches se basa y de qué productos sale — seguido de cada motivo por el que dos líneas no son comparables, y un CSV para la hoja de cálculo.
Esto hay que montarlo antes
ObligatorioLos endpoints no aceptan texto libre: aceptan tus identificadores. Esta receta da por hecho que lo de abajo ya existe en tu cuenta, y mientras falte algo la llamada responde con un error o con menos de lo que esperas. Cada punto enlaza la receta que lo enseña.
- 01
Da de alta el hotel en tu panel de control
Veetal resuelve el alojamiento contra Booking.com y le asigna un slug — y es ese slug, no el nombre del hotel, lo que piden todos los endpoints de alojamiento.
Guía: Da de alta tu hotel y el compset contra el que fijas precio → - 02
Lanza una importación sobre el hotel
Un dataset Feed solo contiene lo que una importación ha escrito. Activa esta API sobre el hotel, lanza la primera ejecución a mano y lee la estimación de créditos antes de pulsar: el coste crece con el compset y, en los datasets multi-OTA, también con las OTAs.
Lo mismo por API, si prefieres no pasar por el panel:
curl -X POST "https://api.veetal.app/v3/account/accommodation" \
-H "veetal-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }' # see the account reference for the bodyPara saber si ya ha terminado alguna importación, lístalas:
curl "https://api.veetal.app/v3/account/imports" \
-H "veetal-api-key: YOUR_API_KEY"Las lecturas Feed no se facturan por petición. Los créditos se van en las importaciones que recogen los datos, y por eso la estimación aparece antes de lanzar y no después.
Cómo funciona
- 01
Mete todos los hoteles en la cuenta
Da de alta cada propiedad en Accommodations. Una vista de cartera a la que le faltan tres hoteles es una vista en la que nadie confía.
- 02
Impórtalos todos igual
Lanza un import de Accommodation Rates sobre las noches que quieras, con el mismo tipo de visitante y el mismo dispositivo para todos los hoteles, y ponlo en un schedule. Dos hoteles recogidos de forma distinta dan números que parecen iguales y significan cosas distintas.
- 03
Lee un mes por hotel
Llama a /rate/v7/{año}/{mes} una vez por hotel y mes. Devuelve todas las noches del último import terminado de ese hotel; quédate con sus tarifas y descarta el compset. Construye la ventana de noches en UTC, o al este de UTC se corre una noche hacia atrás.
- 04
Pon precio a cada noche y después a la ventana
Toma la tarifa más barata de cada noche con el producto del que sale, haz la media para el ADR y mide cada hotel contra la mediana de la cartera, no contra la media.
- 05
Lee los avisos antes que el ranking
Un hotel con menos noches, uno que mezcla productos entre noches, uno recogido como Genius o con otro dispositivo, o una segunda moneda: cada uno hace su línea menos comparable, y la receta los enumera debajo de la tabla.
La llamada
Primero la lista de hoteles — el slug solo es la clave de ese objeto. Después, una llamada por hotel y mes: todas las noches del último import de ese hotel, con la misma forma para toda la cartera.
# your hotels, indexed by slug
curl "https://api.veetal.app/v3/account/accommodation" \
-H "veetal-api-key: YOUR_API_KEY"
# every night of one hotel's latest import, for a whole month
curl "https://api.veetal.app/v3/feed/accommodation/YOUR_ACCOMMODATION_SLUG/rate/v7/2026/10" \
-H "veetal-api-key: YOUR_API_KEY"Clona y ejecuta
EjecutableLa receta entera es una carpeta autocontenida: Node 20, sin paso de build, y una batería de tests que corre sin API key.
git clone https://github.com/Veetal-Connect/recipes.git
cd recipes/portfolio-monitor
cp .env.example .env # your VEETAL_API_KEY
node --env-file=.env index.mjs YYYY-MM-DD YYYY-MM-DD # put the window: first night, last nightComprueba antes tu key
Una llamada, cinco segundos. Si esto responde, la receta va a funcionar.
# your hotels, indexed by slug
curl "https://api.veetal.app/v3/account/accommodation" \
-H "veetal-api-key: YOUR_API_KEY"
# every night of one hotel's latest import, for a whole month
curl "https://api.veetal.app/v3/feed/accommodation/YOUR_ACCOMMODATION_SLUG/rate/v7/2026/10" \
-H "veetal-api-key: YOUR_API_KEY"Preguntas
¿El ADR de aquí es el mismo que el de mi PMS?
No, y no lo presentes como si lo fuera. Este es el precio publicado en Booking; tu PMS sabe lo que se vendió de verdad, incluido el directo y el negociado. Responden a preguntas distintas, y la diferencia entre ambos es informativa por sí sola.
¿Por qué la mediana y no la media?
Porque una propiedad de 2.000 EUR arrastraría la referencia con la que se juzga a todos los demás. La mediana no se mueve cuando una línea es extrema, así que cada desviación dice algo de ese hotel, no del que se sale.
¿Por qué un hotel dice que tiene menos noches?
Porque no tuvo tarifa en algunas noches de la ventana, y esas noches no faltan al azar: las que un hotel llena primero son las más caras. Un ADR hecho con lo que queda sale sistemáticamente bajo, así que la receta te dice en cuántas noches se apoya cada línea.
¿Qué significa «collected as [anonymous · mobile]»?
Cómo se recogieron las tarifas de ese hotel: como visitante anónimo o Genius, en escritorio o en móvil. Un precio Genius no es un precio público y uno de móvil no es uno de escritorio, así que cuando la cartera los mezcla la receta agrupa los hoteles por huella. Corrige la configuración del import antes de fiarte del ranking.
¿Y si las propiedades están en monedas distintas?
La receta avisa de que esos ADR no se pueden sumar y no los convierte: una conversión que no has elegido es peor que ninguna. Pon la misma moneda en todos los hoteles, o convierte fuera con un tipo que puedas indicar.
¿Por qué falta uno de mis hoteles en la tabla?
No tenía tarifas en la ventana en su último import terminado. Cada hotel se lee de su propio último import, así que una noche que solo cubrió un import anterior no cuenta. Revisa la pestaña Imports y el schedule.
Construye el tuyo
Empieza gratis con 1.000 créditos de API. Sin tarjeta ni llamada comercial.
¿Qué quieres construir con tarifas de hotel?
Dilo en una línea y te devolvemos el prompt, la receta si ya existe y las APIs sobre las que corre, empezando por tarifas de hotel.