Statistics
The statistics are multi-domain. TravStats turns your travel log — flights, cruises and stays — into numbers in two places:
- Dashboard figures — the headline strip above the map, following the active tab
- Statistics page (
/stats) — the deep dive, organised into a domain tab bar: an All cross-domain overview plus one tab per enabled domain (Flights, Cruises, Lodging, and Places on an instance with the beta switch on)
All numbers are computed server-side, rate-limited per user and scoped to your own account. Because every domain counts, totals such as countries visited or active travel days are higher than in a flight-only logbook — they aggregate every enabled domain.
Which entries count
Section titled “Which entries count”The rule is the same in every domain: a thing counts once it has happened. What is merely booked is reported beside the total, never inside it.
- Flights —
flownplushistoricalcount. Historical entries (a date and a route, no precise departure time) contribute to your map, countries, airports and distance. Time-sensitive figures (time-of-day buckets, layovers, durations, fastest route) use only real instants: a flight saved with a date and no times carries placeholder clocks that nobody measured, and those are never subtracted. Such a flight’s duration is estimated from its coordinates and labelled as an estimate, or contributes nothing.plannedandcancelledflights appear only where that makes sense (the status pie, “(n planned)” beside a tab count). - Cruises — a voyage counts once its end date has passed. The itinerary map of a booked cruise keeps its port pins; it just does not claim you have been there.
- Stays — a stay counts once you have checked out. A booking for next month is not a night slept and a hotel merely bookmarked from a saved-places import is not a visit; both are reported separately. Counting is decided in one place and shared by every screen.
- A day is a day. “Active travel days” counts distinct calendar days, so a day with a flight and a hotel night is one day, not two, and the figure cannot pass 365 in a year.
Where a value cannot be derived it is shown as a dash or “unknown”, never as zero — a zero would silently drag every average down.
Dashboard strip
Section titled “Dashboard strip”The strip above the map follows the active tab. On the Flights tab: total flights (with planned ones named beside it), total distance, total flight time (marked when estimated), countries, airlines. On Cruises: voyages, ports, sea days, distance at sea. On Lodging: houses, nights, countries slept in. The next upcoming entry sits beside the tabs and names the trip it belongs to.
Statistics page
Section titled “Statistics page”All tab (cross-domain overview)
Section titled “All tab (cross-domain overview)”A pure cross-domain summary — no per-domain deep-dives — built from every enabled domain at once:
- Range control — a year dropdown that scopes the whole tab to a single year (or All years for lifetime), plus a “compare with…” toggle that adds year-over-year deltas. A year-over-year delta is only ever shown for two years; a lifetime set has nothing to compare against and shows none.
- KPI strip — the headline tiles: Total experiences (with a per-domain breakdown), Countries visited (counted by the evidence rule — see Countries & passport), Days away — the distinct calendar days on which you flew, sailed, slept away or recorded a place, per domain and as a union — Active travel days, and Achievements unlocked with points.
- Activity per year — a stacked bar chart, one coloured segment per domain, one bar per year. Domain toggle chips add or remove series.
- Activity heatmap — a 12-month × 31-day calendar for the selected year, shaded by activity and coloured by the dominant domain that day.
- Per-domain cards — one card per enabled domain with its headline figures, top items, badges, and a Details → link into that tab.
- The travel account — every year split into hotel, ship, aircraft and home, naming the days it cannot account for rather than hiding them.
Flights tab
Section titled “Flights tab”The full flight deep-dive. It leads with the scorecard, then the per-metric sections below.
Scorecard — a time-range control (Rolling 12 months / Year / All time) drives three hero tiles — Flights, Distance, Flight time — each with a sparkline, a trend delta vs. the previous comparable window, and a one-line takeaway. Below them one range-driven time-series chart plots the same window, bucketed by month or by year. The chart reads the clock at the departure airport, like every other “when did I fly” figure, so a flight leaving Bangkok at 06:00 on 1 January sits in the new year everywhere.
The sections below the scorecard:
- Overview — all-time tiles: total flights, total flight time, average duration, distinct airlines. Airlines are counted by IATA code, so “SWISS” and “Swiss” are one carrier, and a flight without one is counted apart and said so.
- Distance — total, average, longest and shortest leg, histogram.
- Flight breakdown — status pie, category pie, aircraft types.
- Punctuality — average delay, on-time rate (a 15-minute grace band), best and worst airline and route. “No delay recorded” is kept apart from “on time”, and no best or worst airline is named under three flights.
- Fun — timezone hopper, early bird / night owl buckets, weekend warrior, loyalty score, short-haul and long-haul counts, fastest day, CO2 in kilograms and elephants, milestone year, route master.
- Business — cost per km and per flight hour across priced flights (a booking counts once even if it produced several legs), total cost per currency, seat-class distribution, busiest month. A year with no priced flight shows a dash and says how many flights had no price — never “0 €”.
- Unique — time travellers, equator crossings, Arctic flights, ocean crossings (a 5,000 km heuristic, no coastline check), highest airport, northernmost and southernmost point, longest travel chain, fastest route, most countries in one day.
- Continents — counted against the one shared continent table the passport uses, out of seven. The denominator travels with the response, so the tile can never say “6 / 6” next to a caption that says seven.
- Airports — top 20 by visit count with first and last visit.
- Seats — window / aisle / middle, row histogram, consistency score.
- Routes — a route is the pair, not the direction: FRA→WAW and WAW→FRA are one route flown twice.
Two buttons sit at the top: Generate flight certificate and PDF year report.
Cruises tab
Section titled “Cruises tab”The cruise deep-dive: number of cruises, unique ports, sea days, ships, cruise lines, total distance at sea (measured along the sea route, the same distance the badges use), port calls, cruise days; region distribution and the sea-day vs. port-day mix; loyalty streaks; tag clouds for lines, regions and countries; and flag pills for canal transits, polar waters, dateline crossings, birthdays or New Year at sea. Cruise money is reported per currency and never summed: cruises carry no exchange-rate snapshot, and adding the numbers would invent a total. Cruise lines are ordered by how often they were sailed.
Lodging tab
Section titled “Lodging tab”A chapter of its own. What a night cost — by year, country, chain and board, with the median taken over nights rather than bookings — and what it was worth: the value of award nights, and all four rating columns separately. Where the nights happened: continents, the northernmost night, the centre of gravity of your travel computed on the sphere. When they happened: by weekday, by season, and the longest unbroken run away from home. Nights per loyalty programme per calendar year. An undated stay is left out of the calendar figures and the page says how many. Countries are grouped by ISO code, so “Deutschland” and “Germany” are one country.
Places tab (beta)
Section titled “Places tab (beta)”Shown only when the instance has the beta switch on and the places domain is enabled: cities, countries, continents, streaks, latitudes and ratings across your recorded places. See Places.
Hiding blocks
Section titled “Hiding blocks”Someone who records no prices had a cost block on every screen. Each tab lets you hide the blocks you do not want. Only the hidden blocks are remembered, so a section added in a later release still appears rather than being silently swallowed by an old preference.
Year heatmap (Flights tab)
Section titled “Year heatmap (Flights tab)”The Flights tab carries its own yearly calendar grid: each cell is a day, shaded by the number of flights. Hover for airlines and IATA codes; click a date to jump to that day’s flights. This is distinct from the cross-domain activity heatmap on the All tab.
Year report PDF
Section titled “Year report PDF”Generate flight certificate opens a shareable card (total flights, distance, flight time, top airline, favourite route, years active). PDF year report downloads a one-page PDF summarising the selected year.
Where the numbers come from
Section titled “Where the numbers come from”Everything sits under /api/v1/stats. The families you are most likely
to read from a script:
| Endpoint | Returns |
|---|---|
GET /summary | The headline numbers, including daysAway per domain and in total |
GET /timeseries | Bucketed series plus current/previous window totals that back the scorecard |
GET /records | The seven records — longest and shortest leg, longest time aloft, streaks, delays — as numbers with units |
GET /network | Every airport with coordinates and every route with a count and a distance, deliberately unbounded |
GET /wrapped?year= | The year in review; a favourite the year cannot support is absent, not zero |
GET /passport | Countries with their evidence rung, days present, port calls and recorded places |
GET /countries/:code | One country’s page, including one reached only by ship or by a recorded place |
GET /cruise | The Cruises tab |
GET /lodging | The Lodging tab |
The complete list with request and response shapes is in the OpenAPI
spec on your instance — see REST API.
Authentication is via cookie (UI) or a PAT with read scope.
Limitations
Section titled “Limitations”- Flight distance is great-circle, not the actual flight path. Real flown distance is typically 1–3 % higher.
- Timezone-aware figures need the airport’s IANA timezone. Coverage is good for commercial IATA airports; a private strip may be skipped rather than guessed.
- CO2 figures are rough — a per-kilometre factor and a single-cabin assumption. Use a dedicated calculator for anything that matters.
- No multi-user aggregates. Every stat is scoped to your own account; there is no instance-wide dashboard, by design.