StayRank AI ← Back to the app

Methodology

How StayRank AI actually ranks a hotel

Not a black-box recommendation. Every score below is a documented formula over real data - this page shows the weights, the sources, and exactly what's an honest estimate versus a fact.

The scoring formula

Every hotel gets a metric score: each of its metrics (quiet, cleanliness, transit, room size, value, and a couple/family/business fit score) is multiplied by a weight, summed, and divided by the total weight. Your traveler type shifts those weights automatically before anything else runs.

MetricBase weight
Quiet20
Cleanliness18
Transit access18
Value14
Room size12
Couple fit8
Family fit4
Breakfast3
Wi-Fi3

Picking Couple adds +10 to couple fit; Family adds +12 to family fit; Business adds +8 Wi-Fi / +4 transit; First-time adds +8 transit. Anything your free-text description implies as a priority (e.g. "quiet is essential") boosts that metric's weight too, on a continuous 0–18 scale when the LLM parser is active, or a flat +8 from the rule-based fallback.

That weighted metric score is then blended with a semantic text-match score - a real TF-IDF cosine-similarity comparison between your exact wording and each hotel's neighborhood description, tags, strengths, and review text - so phrasing that isn't a recognized keyword can still move the ranking:

final score = (metric score × 0.8) + (text-match score × 0.2)

Price is applied last: hotels over your stated budget lose up to 24 points scaled to how far over they are; hotels under budget gain up to 8. Nothing about this formula changes hotel-by-hotel - it's the same function for all of them.

What's a real fact vs. an honest estimate

Metrics like QUIET 86/100 are disclosed estimates, not measurements - there's no honest source for a real decibel reading per hotel. Where a real, checkable fact exists instead, StayRank AI shows that fact alongside the estimate rather than replacing one with a guess:

Nearest transit stopReal fact

The actual named nearest station/stop and straight-line distance, via OpenStreetMap's Overpass API - the same public data Google Hotels and Booking.com's "X min walk to [station]" line draws from.

Noise contextReal fact

No honest decibel data exists per hotel, so nothing is invented. Instead: a real count of nearby nightlife venues and nearby major roads from OpenStreetMap, shown as plain-language context alongside the raw counts.

Walking routesReal fact

Real street-network routing via OSRM's public routing engine - not a straight-line guess - for distance/time to a landmark you search for.

Weather / best time to visitReal fact

Live forecast via Open-Meteo for trips within ~15 days; beyond that horizon, real historical averages for the matching dates, clearly flagged as historical rather than presented as a forecast for your specific trip.

Exchange ratesReal fact

Live daily rates from the European Central Bank via the free Frankfurter API - not a fixed or estimated conversion.

Hotel identity & photosReal fact

Name, coordinates, address, star category, and photos come from live booking-data APIs, or the Hotelbeds Content API as an independent fallback when the primary source's rate limit is hit for a city - never a generated placeholder.

QUIET / TRANSIT / VALUE scoresDisclosed estimate

Weighted-formula outputs built from the real signals above plus review text, explicitly labeled as a computed score - never presented as a measured fact.

What StayRank AI never does

Common questions

Is this a paid placement or ad system?

No. There is no mechanism in the app for a hotel to pay for a better score or position. The formula above runs identically for every hotel.

What happens if the AI intent parser is down?

The search doesn't fail. Every LLM call is wrapped so any failure (missing key, rate limit, timeout, malformed response) falls back to a rule-based keyword and TF-IDF parser, seamlessly, on the same request.

Why don't you show a "best time to visit" crowd score?

Because there's no honest data source behind one. The Best Time panel shows real historical temperature and rainfall by month instead of a fabricated popularity number.