Build your storefront

Languages and markets

A market is a business context: its locales, its currencies and its tax classes. Model it once and the storefront, the prices and the content follow.

"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 hasMeaningExample
LocalesThe language-and-country combinations it servesde / DE, de / CH, fr / CH
CurrenciesWhat it can be invoiced in, one of them the defaultEUR, CHF
Tax classesThe rates that apply, each with a code, name and ratestandard 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.

Splitting one market into two after it is live means re-pointing price lists, channels, pages and theme settings that were scoped to the original. It is a migration, not a setting. Spend the hour on the model before you create the first one.

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

  1. Go to Commerce Studio › Configuration › Markets.
  2. Select New market.
  3. 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.
  4. Set the default currency (ISO 4217).
  5. 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.
  6. 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