OPS-25-E1Travel Intelligence

Real-time price intelligence for an OTA platform

Sub-15-minute freshness across 2M+ price points. 32 suppliers, 14 regions, 9 currencies. Production-grade browser automation.

€2.3Mmargin recovery annualised
Sector
OTA · Travel · €30M+ GMV
Surfaces
Browser · Multi-region · Currency engine
Runtime
14 months, 99.6% SLA
Published
2025-06-04

Challenge

A mid-tier OTA (€30M+ GMV, 11–14% margin) was losing market share to two larger competitors with stronger price intelligence. In their model, prices were updated once every 6 hours in batches; competitors adjusted within minutes. Result: in high-volatility periods (long weekends, holidays, events) they sold cheaper rooms than they could have, or expensive rooms nobody wanted to buy.

An internal attempt at their own system in 2024 failed. Classic API integration with 32 suppliers did not exist — most have only a web frontend or restricted partner API with 3–12h latency. Their first scrape implementation broke in two months: success rate below 50%, inconsistent validation, no handling of intra-day currency conversion.

Approach

We designed a 4-layer system: discovery (a Playwright pool detecting availability per supplier per region), pricing (deep-fetch price points with dynamic loading, JS-rendered carousels, multi-step booking flows), validation (Zod schema enforcement + currency normalisation with live FX rates), aggregation (sub-minute aggregations into a customer read API).

Critical decisions: residential proxies with geo-matching (a Berlin hotel price differs whether you look from a Polish or German IP — a pricing accuracy requirement). Per-supplier parser with version tracking — when a supplier changes layout, automatic fallback to v(n-1) parser plus a team alert. Idempotent persist with content hashing — re-runs never generate false price-change signals.

Architecture: Temporal as orchestrator (4,000+ parallel workflows at peak), Playwright with custom fingerprint per region, Redis for sub-second cache lookups, ClickHouse for time-series price data, PostgreSQL for canonical hotel/room/policy entities. Currency layer integrates ECB plus a dedicated FX provider for minor pairs.

Outcome

Pricing freshness dropped from 6h to a 12–14 minute median, 22 minutes P99. Enough to match competitors and, in some categories, beat them (because our supplier coverage is broader).

Margin recovery (measured via a 3-month A/B test with a control group of regions): +€2.3M annualised, i.e. +0.65 margin points. The customer now has an internal methodology repeatable in future periods.

The system handles 2.1M price points per day, 32 suppliers, 14 regions. 99.6% SLA over 14 months. Three supplier layout migrations during the period — all handled via parser versioning without downtime.

Stack

TemporalPlaywrightClickHousePostgreSQLRedisBright Data residentialDatadogECB FX API

Metrics

  • 12.4 minPrice freshness median
  • 2.1MPrice points / day
  • 32Suppliers
  • 14Regions
  • +€2.3MMargin recovery (annualised)
  • 99.6%SLA achievement
Similar problem in your business?

Every project is different, but patterns repeat.

If you recognise pieces of this case study in your own situation — write. We usually see in the first call whether it is hours-per-week scale or months of infrastructure.