OPS-25-E1Travel Intelligence

Real-time price intelligence dla platformy OTA

Sub-15-minutowa freshness na 2M+ punktach cenowych. 32 dostawcy, 14 regionów, 9 walut. Browser automation klasy production.

€2.3Modzyskana marża rocznie
Sektor
OTA · Travel · €30M+ GMV
Powierzchnie
Browser · Multi-region · Currency engine
Czas pracy
14 miesięcy, 99.6% SLA
Opublikowano
2025-06-04

Wyzwanie

OTA średniej skali (€30M+ GMV, marża 11-14%) tracił udział rynkowy na rzecz dwóch większych konkurentów z silniejszą price intelligence. W ich modelu, własne ceny były aktualizowane raz na 6 godzin batchem; konkurenci dostosowywali w ciągu minut. Skutek: w okresach wysokiej zmienności (weekendy długie, święta, eventy) sprzedawali tańsze pokoje niż mogli, lub drogie pokoje których nikt nie chciał kupić.

Wewnętrzna próba własnego systemu w 2024 padła. Klasyczne API integration z 32 dostawcami nie istniało — większość ma tylko web frontend albo restricted partner API z opóźnieniem 3-12h. Ich pierwsza implementacja scrape'u rozpadła się po dwóch miesiącach: success rate poniżej 50%, niespójne walidacje, brak handling'u currency conversion intra-day.

Podejście

Zaprojektowaliśmy system 4-warstwowy: discovery layer (Playwright pool wykrywający availability per supplier per region), pricing layer (deep-fetch price points z dynamic loading, JS-rendered carousels, multi-step booking flows), validation layer (Zod schema enforcement + currency normalization z live FX rates), aggregation layer (sub-minute aggregations do read API klienta).

Critical decisions: residential proxy z geo-matching (cena hotelu w Berlinie różni się gdy patrzysz z polskiego vs niemieckiego IP — wymóg pricing accuracy). Per-supplier parser z version tracking — kiedy supplier zmienia layout, automatic fallback do v(n-1) parser plus alert do zespołu. Idempotent persist z content hashing — re-runy nie generują false price-change signals.

Architektonicznie: Temporal jako orchestrator (4000+ parallel workflows w peak), Playwright z custom fingerprint per region, Redis dla sub-second cache lookups, ClickHouse dla time-series price data, PostgreSQL dla canonical hotel/room/policy entities. Currency layer integruje z ECB plus dedicated FX provider dla minor pairs.

Wynik

Pricing freshness spadł z 6h do 12-14 minut median, 22 minut P99. To wystarczyło żeby dorównać konkurentom, w niektórych kategoriach prześcignąć (bo nasz reach w supplier coverage jest szerszy).

Margin recovery (zmierzone przez A/B test z control group regionów na 3 miesiące): +€2.3M annualised, czyli +0.65pp margin point. Klient ma metodologię wewnętrzną którą można powtórzyć w przyszłych okresach.

System obsługuje 2.1M price points dziennie, 32 supplierów, 14 regionów. SLA 99.6% przez 14 miesięcy. Trzy migracje supplier layout w tym okresie — wszystkie obsłużone przez parser versioning bez downtime.

Stack

TemporalPlaywrightClickHousePostgreSQLRedisBright Data residentialDatadogECB FX API

Wskaźniki

  • 12.4 minPrice freshness median
  • 2.1MPrice points / dzień
  • 32Suppliers
  • 14Regiony
  • +€2.3MMargin recovery (annualised)
  • 99.6%SLA achievement
Podobny problem w Twojej firmie?

Każdy projekt jest inny, ale wzorce się powtarzają.

Jeśli rozpoznajesz fragmenty tego case study u siebie — napisz. Zwykle widzimy w pierwszym callu, czy to skala godzin tygodniowo, czy infrastruktura na miesiące.