Skip to content

Countries & passport

“How many countries have you been to?” is the question a travel logbook exists to answer, and until 2.6.0 TravStats answered it by where an aeroplane touched down. That was too high and too low at once, which is why it looked plausible for so long: a four-hour connection counted as a visit, while a country reached by car and slept in for a week did not exist at all, and countries with completed hotel stays and no flight ever were missing.

Since 2.6.0 a country counts by what proves you were there. The counting rules on this page are live for every account. The passport page that shows them is behind the instance beta switch — the numbers are the same ones the statistics page shows, but the page itself had not been through a release review in time.

Every country carries the strongest evidence for it, in four rungs:

RungWhat puts a country there
SleptA completed lodging stay; a house on record with no stay at all; a flight arrival and departure on different local calendar days; a port call spanning a night; a location-history track holding two consecutive days
VisitedArrival and departure on the same local day; a recorded place; a same-day port call; a track day on which no other country was recorded
TransitedDriven through — a track day shared with another country, a border crossed by car. Only location history can produce this rung
ConnectionA change of planes and nothing else

Strongest wins: a country both flown through and slept in reports slept once, never twice. A day trip is not a connection — MUC–FCO–FRA is a day in Rome. A booking still ahead and a cancelled stay prove nothing, and a house whose stays were all cancelled proves nothing either.

There is deliberately no hour threshold. Six hours in Doha with a trip into the city and six hours airside are the same rows, and measured on a real account six hours and twelve hours returned the same set of countries — nobody sits between them. A dial would promise a precision the data does not hold. What is in the data is structure: the local calendar day either changed or it did not. So the rungs are derived, never configured, and the only setting is which rung the headline counts from.

Only attested days count: a landing in January and the next departure five years later no longer read as five years of presence.

Whether a connection counts is a personal definition, not a property of the server. So there are two settings:

  • The instance default — Admin → Instance → Country counting. A fresh install starts at transited: everything down to a border crossed by car counts, a change of planes does not.
  • Your own override — under your settings. Follow the instance default, or pick a rung of your own.

The choice is one of the rungs; there is no hours option on purpose. Changing it moves the headline and nothing else: the country list is identical at every threshold — a connection country is greyed and kept, never hidden, because the rung is inferred from recorded flights and flights are recorded incompletely. The year in review and the achievements read the same threshold, so tightening it can lower progress on a country badge not yet earned; a badge already earned stays earned.

The same rule feeds every consumer — the KPI strip, the hero tile the Companion app reads, the achievements, the year in review, the per-year country lists and the passport — so one account no longer answers “how many countries” twice, a swipe apart, with different numbers. Per-year figures key stays by their check-in year and flights by the airport’s local calendar, so “countries visited in 2024” no longer shows the lifetime set under a “2024” header.

Countries are joined by code, never by name: “Deutschland” and “Germany”, “Cesko” and “Tschechien” are one country, and a two-letter Japanese place name is never published as a country code. Continents resolve through one shared table, out of seven; the continents tile on the flights tab and the passport agree.

A Dawarich connection (beta) is reduced nightly to country-days — “on this day, in this country” — and folded into the passport as a fifth kind of evidence. Coordinates exist only for the length of one loop and are never stored, returned or logged; what a row keeps is the day, the country and a count of fixes, so a day held up by four hundred points and one held up by a single point can be told apart. A country is a connection when every point ever recorded there lay within the grounds of an airport you are known to have flown through; a point beyond that lifts it onto a stronger rung. The road rung and its filter appear only once an account has location history, because a filter that always returns nothing reads as a bug.

With the beta switch on, /passport shows stamps, a continent quota band and a country table. Each row names the country’s rung, the records that proved it, the days present, the time on the ground where a pair of flights bounded one, the port calls and recorded places, and for a country proved by a stay the city slept in most and the nights. A duration that cannot be derived reads “unknown”, never zero; a country no flight touched shows a dash — the two differ because only the first says “add the missing flight”. Expanding a row lists the flights, cruises, places and houses behind it, each linking to the page that edits it. A country reached only by ship or by a recorded place has a page of its own (GET /stats/countries/:code) instead of a 404 behind a clickable row.

The first time the old rule and the new one disagree on your rows, the passport says so once — “counting changed: 32 countries before, 35 now” — computed from the same rows so the two can never drift, with a link to this explanation and a dismiss remembered in your browser.

An address whose country differs from the stored one, coordinates outside the claimed country, a country resting solely on undated records, a check-out before its check-in — none of these is corrected silently and none changes a number by itself. Each becomes a question in the Inbox. Un-marking a house as visited removes its country from the passport and its flag from the inbox at the same moment; the house’s own address is still checked whether or not anybody slept there.

  • It cannot know whether you left the airport. The rungs are structure in the data, not a judgement about your layover.
  • A country you drove through without location history is not counted — nothing in a flight, a cruise or a hotel records a road crossing. Record a place there, or connect Dawarich.
  • Territories the offline outlines do not attribute, and a pin in the sea, raise no flag and prove no country.
  • The passport page is beta. Its numbers are live; the page itself may change.