Travel tooling — live, refreshing daily

Farewatch

A deal tracker that ranks on what a trip would actually cost you, not on the number in the headline. The fare is the smaller half of the truth, and no deal feed anywhere prices the other half.

The deal newsletters broadcast. They find a $340 fare to Lisbon and mail it to two million people, most of whom cannot fly those dates, do not live near that airport, and are not interested in Lisbon. Personalisation is the thing they charge for, and even the paid tiers are shallow.

Farewatch inverts that. It pulls the same public feeds — flights, hotels, packages, cruises — works out what each deal would cost once currency and on-the-ground prices are counted, and ranks what survives against constraints you actually have. Every score carries its reasons with it.

3  71.4  flight  Los Angeles > Bangkok   $1,482  all-in $3,144
      est. 25% below typical · on your list · add $554 to reach Los Angeles

The fare is the smaller half

A $300 flight to Zurich and a $450 flight to Bangkok are not a $150 difference. On measured prices, a week for two costs $4,027 on the ground in Zurich against $1,108 in BangkokHotel medians from listings, food and local transport from Numbeo, converted at the day's European Central Bank rate. Checked 2026-08-29. — so the expensive fare is the cheaper trip, by a margin no fare comparison can see.

$2,619 How much cheaper the "expensive" $450 Bangkok fare is to actually take, once seven nights on the ground are priced. Two travellers, mid-range style.

Currency is the third piece, and it moves exactly the half that fares do not. A fare is already quoted in your own money; food, hotels and taxis are not. A country whose currency has slid 15% against yours is 15% off before any deal is applied. Farewatch compares today's rate against the trailing year and folds the difference into the trip cost.

What a score is made of

Eight components, each bounded and each returning its own explanation, so a ranking is auditable rather than a number to take on faith.

ComponentWeightAsks
value28How far below the expected price for this route and kind?
reachable18Does it leave from an airport you would use?
affordable15Does the all-in total fit the budget?
wishlist12Do you want to go there?
fx8Is your money unusually strong there right now?
fresh8How long ago was it posted?
timing6Does it travel in a month you would travel?
urgency5Is there a booking deadline?

A deal leaving from an airport you cannot reach is not discarded. It is priced — the hop to the deal's origin is costed and folded into the total, so an unreachable bargain competes on its honest number rather than on a fiction.

What validation found

The model was built first and checked against real market data afterwards, on 2026-08-29. Two of the three checks found it wrong, which is the only reason the check was worth running.

The parsing was right

Top-ranked deal, Asiana Los Angeles to Bangkok, quoted at $741 roundtrip. The cheapest fare on those exact dates was $742. Price, route, cabin, roundtrip flag and the seven-night assumption were all correct.

The value judgement was not

Farewatch called it 25% below typical. Google called prices "currently typical", and the same fare appeared on a February 2027 search — so it was the going rate, not a sale. The cause is structural: fares scale sub-linearly with distance and the model's curve is a straight line, running $0.129 per km on short haul against $0.068 on long haul, so it overestimates long routes badly.

The constants were not refitted. Seventeen noisy deal prices and one verified fare is not enough to replace one eyeballed number with another. Instead the claim now states its own provenance: est. 25% below typical from the curve, against cheaper than 15 of the 16 tracked to Bangkok from observation. One is a guess, one is a measurement, and they no longer look alike.

The cost data was wrong in both directions at once

CountryFieldAuthoredMeasuredError
United Stateshotel per night$165$10557% high
United Statesdinner for two$75$10428% low
Japanhotel per night$95$6840% high
Switzerlandhotel per night$200$15727% high
Thailandtaxi per km$0.50$1.0552% low
Thailandtransit ticket$0.60$1.0040% low

The two large errors pulled in opposite directions, which is why they had never produced anything obviously broken. The model was overstating what it costs to sleep in rich countries while understating what it costs to get around cheap ones — and both biases flattered exactly the comparison the whole project is built on.

How it runs

No third-party packages, no API keys, no paid data. Feeds are cached, one bad source never stops a run, and an unreadable deal is dropped rather than guessed at. Observed prices are banked as ratios at five levels of specificity and correct the fare curve where the evidence supports it — so the model gets less wrong the longer it runs.

FactFigure
Places resolved150 countries, 350 cities, 384 airport codes, 198 aliases
Currencies~160 live rates; one-year history for the ~30 the ECB publishes
Tests187, with real captured feeds as fixtures
OutputOne self-contained HTML file. No assets, no CDN, light and dark
RefreshWindows scheduled task, 07:00 daily, unattended

Status

Live. The scheduled task reports ready and the report refreshed at 07:00 today with nobody present. That is a claim about the machinery, not about the numbers: the fare curve is still a heuristic that overestimates long routes, and it is labelled as one everywhere it appears.

It also runs for exactly one person on one machine. Nothing here has been tested against what a second set of constraints would do to it.