Skip to content

Money & currencies

A price is recorded in the currency it was actually paid in — any of the 155 ISO-4217 currencies — and shown in the one currency you chose under Settings → Units & formats. What happens between those two is this page.

There is exactly one currency setting, and it applies everywhere: flights, cruises, lodging, trips, statistics and achievements. Earlier versions had two — one under units that only flight surfaces read, and one under the lodging preferences that lodging, statistics and achievements read — so the general setting was domain-specific and the domain-specific one was general. They were merged in 2.6.0. Conversions already recorded keep the rate they were taken at.

Conversion asks the European Central Bank first — authoritative, self-hostable, back to 1999. For the currencies the ECB does not publish, a keyless public dataset is consulted. That fallback is a third party your instance talks to, so the administrator can switch it off entirely under Admin → Exchange rates; an instance that would rather report “no rate” than consult it may do so.

A rate is taken for the day of the spend — the stay, the flight — not for today, and stored with the record as a snapshot: the amount, the currency, the rate, and which source produced it. Changing your display currency later does not silently re-price your history.

What a total does with what it cannot convert

Section titled “What a total does with what it cannot convert”

Where no source has a rate, the amount is kept in its own currency, marked “no rate”, and left out of every total — on the stay, on the house, in the list and in the statistics strip. The total says how many entries it left out, rather than quietly summing what it could and presenting that as complete.

You may enter a rate yourself under the amount. It is always shown as yours, never as an official one, and it is what the totals use from then on.

An amount without a currency is refused by the API rather than assumed to be euros. Three places in the app used to default a missing currency to EUR, which turned “unknown” into a claim; every amount now goes through one formatter, and a missing currency yields a bare number.

A flight carries its price and currency, or none. A booking imported from a confirmation carries the total actually charged for everyone after discounts — on the booking, not spread over the legs — so a flight in a package booking has no price of its own on purpose, and its column says “package” with the reason on hover rather than “n/a”. Flight costs are converted at the rate for the day of the flight; what cannot be converted is reported per currency. 300 USD and 300 EUR are no longer “600 €”.

A year with no priced flight has no cost total, not “0 €”: the tile shows a dash and says how many flights had no price, and the trend pill appears only when both years have a number.

A stay carries a price with its currency and an FX snapshot taken on the check-in day. The lodging statistics — cost per night by year, country, chain and board — are computed over converted amounts and name the stays they left out. A planned, priced stay shows “planned: 149.90 €” beneath the house’s total, never inside it and never as “0 €”.

A cruise carries its price in its currency and no exchange-rate snapshot. So cruise money is reported per currency and never summed: “3 cruises in EUR, 1 in USD”, with a total for each. Adding the numbers would have repeated a bug that already existed one domain over. A trip that holds a cruise counts the cruise’s price in the trip’s total only where the currencies agree.

Amounts follow the interface language, not the browser’s: the amount and the exchange rate beneath it use one number format. Only a handful of currencies used to carry a locale of their own, so the other 148 were written in the browser’s language while the rate followed the interface — two formats in one card. One formatter now serves every amount in the app.

  • No bank import, no receipts OCR into amounts. A price arrives from a document the parser read, a list you imported, or your own typing. (A photographed hotel bill is read for its stay and its total — see Documents.)
  • No re-pricing. Changing the display currency does not recompute stored snapshots; a corrected rate applies from the moment you enter it.
  • No cruise conversion. By design, until cruises carry a snapshot.
  • No budgets, no categories beyond the record’s own. TravStats tells you what a night or a flight cost; it is not an expense tracker.