Languages and markets
"We need English" and "we need Switzerland" sound like the same request and are not. The first is a language. The second is a market: a different currency, a different VAT rate, different terms, often a different assortment, and only incidentally sometimes a different language.
What a market is
A market is a distinct business context. Country, region or brand. It is the unit that carries:
| A market has | Meaning | Example |
|---|---|---|
| Locales | The language-and-country combinations it serves | de / DE, de / CH, fr / CH |
| Currencies | What it can be invoiced in, one of them the default | EUR, CHF |
| Tax classes | The rates that apply, each with a code, name and rate | standard 19.00, reduced 7.00 |
Plus a code, a name, a default currency, a status and a sort position. One market is the tenant default.
A locale is a language plus a country, not a language alone. That distinction
does real work: de/DE and de/CH share every translated string and differ
in price, tax and terms. Modelling Switzerland as "German" loses that, and you
find out at the first Swiss invoice.
A new language is a locale
Adding English to your German shop is a locale on the existing market. Nothing about the money changes. Do it that way and you avoid duplicating price lists, tax classes and content for no reason.
Create a second market when at least one of these is true:
- The currency differs.
- The tax treatment differs: a different VAT rate, or gross versus net display.
- The assortment differs.
- It is a separate legal entity or a separate brand.
If none of those is true, you want a locale.
What follows the market
Once markets exist, a lot of the platform becomes market-aware:
- Channels are scoped per market, which is how a Swiss storefront gets a different assortment from the German one.
- Price lists are scoped per market, and carry their own currency and net-or-gross basis. See Price lists.
- Pages and Forms are scoped per market, so a landing page can exist in one country and not the other.
- Theme settings have a global baseline with per-market overrides. See Themes and branding.
- Transactional email templates carry their languages and markets, so an order confirmation can differ per market.
That is the payoff for modelling it properly: you configure the difference once, in one place, rather than maintaining two of everything.
Create a market
- Go to Commerce Studio › Configuration › Markets.
- Select New market.
- Enter a code (permanent; treat it like a database key:
de,ch,eu_south) and a name. Add per-locale labels if the market name itself should be translated. - Set the default currency (ISO 4217).
- Save, then open the market and fill its three sections:
- Locales: Add locale for each language/country pair. Mark one as default. A market with no locale has no language to render in.
- Currencies: Add currency for every currency this market may be invoiced in. The default currency must be among them.
- Tax classes: New tax class for each class with its code, name and rate in percent. Mark one as default. A market with no tax class cannot tax anything.
- Set the sort position to control the order markets appear in, and status to activate it.
If a second market resembles the first, use Clone market on the existing one. It copies locales, traded currencies and tax classes into the new market, each of the three optionally, so you edit the differences rather than retyping the rates. A market that already exists can pull what it is missing from another one with Fill gaps from another market; anything it already has, by code, stays as it is.
Translations are not here
The market defines which languages exist. The translated content lives with the thing being translated:
- Product data: localizable attributes hold one value per language. See Channels, locales and completeness.
- Category names: labels per language on the category.
- Pages: each page has translations per language, edited in the visual editor with the language selector.
- Forms: field labels are translated per language; empty translations fall back to the default language.
Adding a locale is five minutes. Filling it is the project. Check completeness per locale before you promise anyone a launch date.
One domain or several
Both work, and the choice is an SEO decision more than a technical one:
- One domain, path per locale:
acme.com/de/,acme.com/en/. Simpler to run, one certificate, one set of pre-launch checks. - A domain per country:
acme.de,acme.ch. Clearer to buyers, stronger local signal, and sometimes a legal requirement for imprint and terms.
Either way the storefront must emit hreflang links so search engines serve the right language and country version instead of guessing. Getting this wrong is the classic multi-country failure: the Swiss page outranks the German one in Germany, and buyers see prices in the wrong currency.
What to check
- Open Configuration › Markets and confirm the locale, currency and tax class counts on each row are what you expect. A market with zero tax classes will not invoice correctly.
- Open the storefront in each locale and check a product page: language, currency symbol, and whether prices show net or gross for that market.
- Confirm one price resolves in the second market's currency rather than falling back. See Check a price.
Next
- Price lists: currency and tax basis per market.
- Search and product discovery: search behaves differently in each language.
Domains and going live
Add a hostname, point DNS at the platform, get a certificate, decide what it serves, and take the password off on launch day.
Search and discovery
Facets, part-number entry, synonyms and the zero-results list: how a buyer gets from a vague idea to one article, and what to fix when they cannot.