✈️ BDL family flight watch

Hartford (BDL) round trips · 4 passengers · nonstop preferred · trips 1–6 months out

How this works

What is scraped. The cheapest round-trip fare from Hartford (BDL) to each destination, read from the public Google Flights results page with a headless browser. One page load per route per run, run one after another with 8–15 seconds between loads.

How often. Every 6 hours (minute 17). Each run scrapes the same set of 7-night trips for a route: the pinned trip departing on the first Saturday of the month two months out, plus two alternate trips departing on the 2nd and 3rd Saturdays of that month. The card shows the cheapest of these; the chart, median and percentile only ever compare prices for the same departure and return dates. The window rule lives in fw.scrape_windows() and rolls forward when the calendar month changes (history for new dates starts fresh).

History starts from the pinned window. Rows scraped before this scheme mixed different date pairs; they are kept, tagged "legacy" and never used in a percentile, median, badge or alert.

4 passengers. The search URL asks for 4 adults and every page is checked for Google's "Prices include required taxes + fees for 4 adults" line. If that line were missing, the per-person price would be multiplied by 4 and the card would say so. Prices are round-trip totals including taxes and fees, excluding bags.

Nonstop preferred. The headline price is the cheapest nonstop result. If none exists for those dates, the card says "no nonstop" and shows the cheapest fare with stops; those rows are kept but never count toward deal statistics.

What "good deal" means. GOOD DEAL = at or below the 25th percentile of earlier nonstop prices for those exact dates; HIGH = above the 75th; otherwise TYPICAL. With fewer than 5 observations for those dates the card says BUILDING instead, because a percentile of a few points means nothing. It is a statement about the past, not a prediction that prices will rise or fall.

Google's own signal. When shown, Google's "typical range" and low/typical/high verdict are saved in separate columns and labelled as Google's. The "vs Google typical" figure compares to the midpoint of that range. Google's price-history graph and a "lowest in 60 days" hint were not present on the pages we scraped; if they appear they are stored too.

Email alerts. An email goes to Alex only if a nonstop total is at or below the 25th percentile and at least 12% under the 90-day median of its own same-dates group (5+ observations in that group), or at least 15% under Google's typical midpoint. At most one per route per 72 hours.

Failure modes