Milestone 10 mock Sample data · 15 Sep 2026 · Nothing is saved

Subscriptions in more than one currency

Each subscription keeps the currency it is billed in, and that amount is what the list, the next-charge strip and Coming up show. Every total is converted into your currency (euros here) at the European Central Bank's reference rate and marked ≈. Under the headline, a short statement shows how much charges in each currency.

Use All in euros to check that an account with one currency looks exactly as it does today. Use Rates stale to see what changes when the rate source can't be reached.

Outside the dashboard

Where the currency is chosen, where it is fixed, and where the setting lives.

Add a subscription: the currency joins the cost field

Editing in place: the currency is fixed

NameCategoryStatusCost Per monthStartedNext renewal
about €17.05

The currency is set when a subscription is added and doesn't change after that, because its past charges were in that currency. If a service starts billing in another currency, cancel it and add the new plan: the two runs group together, like any restart.

Account dialog: a Currency section after Language

How it's counted, and what's still open

The rules

  1. What charges stays in its own money. A row, the next-charge strip, Coming up and the trial section all lead with the amount the service will actually take: “$20.00”. The converted figure follows in hint ink, “≈ €17.05”, and only when the currency differs from yours.
  2. Every total is in your currency, marked ≈. The hero, the KPI band, categories and the chart add up converted charges. An account in one currency never sees “≈” or the breakdown: nothing changes for it.
  3. Each charge at its own day's rate. A charge already taken is converted at the ECB rate of its day: the latest published on or before it, so a weekend uses Friday's. A charge still to come uses the latest rate. Paid to date and a group's lifetime line add up charges converted the same way.
  4. Rounded per charge, then summed. The lines of the per-currency statement add up to the hero total exactly, to the cent.
  5. Change since… says when it's only the rate. If the same charges simply cost more or less in euros, the KPI note says so (switch the toolbar to compare: August and September hold the same charges).
  6. Stale is said, never hidden. If the rates can't be refreshed, the last stored rates are used and the note under the breakdown names their date. No banner and no red: the user's own data is fine. If no rate has ever been stored for a currency, its charges stay out of the total and the breakdown lists them as “not converted yet”, without a ≈ figure.

Behaviour

  • Sorting by Cost, Per month or Paid compares converted values, so $20.00 sorts beside €17.05, not beside €20.00.
  • Search also matches the code and the symbol: “usd”, “$20”.
  • On mobile, the row's right column keeps the native cost on top, and the per-month line under it is in your currency, with ≈ when converted. The detail sheet lists “Billed in: US dollar (USD)”.
  • The add form starts on your currency. Choosing another shows one line of hint: “Totals show it in euros, at the ECB rate.”
  • Backups gain a currency column. An old file without one imports in your currency. An unknown code is a row error, like a bad date.
  • Changing your currency in Account re-renders every total. No subscription changes.

Open questions

  • A wrong currency typed by mistake can't be corrected in an edit. The fix is to delete the row and add it again. That follows the 2026-09-06 mock (“currency cannot be changed”). The alternative is to allow the change and treat it as a correction to every past charge of that run.
  • One setting, not two. The mock uses one Currency setting for both the display currency and the default for new subscriptions. Splitting them has no use case yet.

New strings

WhereEnglishSuomi
Hero prose (mixed)…in 3 categories and 3 currencies, shown in euros.…3 kategoriassa ja 3 valuutassa, euroiksi muunnettuna.
Breakdown labelIn each currencyValuutoittain
Breakdown noteConverted at European Central Bank reference rates: a charge already taken at its own day's rate, one still to come at the latest rate (14 Sep 2026).Muunnettu Euroopan keskuspankin viitekursseilla: jo veloitettu maksu oman päivänsä kurssilla, tuleva maksu uusimmalla kurssilla (14.9.2026).
Breakdown note (stale)…at the latest rate we have (9 Sep 2026). Newer rates couldn't be fetched, so charges still to come may be off by a little.…uusimmalla saatavilla olevalla kurssilla (9.9.2026). Uudempia kursseja ei saatu haettua, joten tulevat maksut voivat heittää hieman.
Not convertednot converted yetei vielä muunnettu
KPI note, rate onlyThe same charges as August. The difference is the exchange rate.Samat maksut kuin elokuussa. Ero johtuu valuuttakurssista.
Add form hintTotals show it in euros, at the ECB rate.Yhteissummissa se näkyy euroina EKP:n kurssilla.
Locked currencyThe currency is set when a subscription is added…Valuutta valitaan, kun tilaus lisätään…
Account sectionCurrency · Totals, the chart and categories are shown in this currency…Valuutta · Yhteissummat, kaavio ja kategoriat näytetään tässä valuutassa…
Screen reader, ≈aboutnoin

Currency names come from Intl.DisplayNames and amounts from Intl.NumberFormat with the currency style, so Finnish reads “20,00 $” and “≈ 60,28 €” without new strings.