A French prospect Googles your product, lands on the English page, bounces. Your site has a French version — search engines just never learned it exists. Multi-language sites in HubSpot CMS work well when configured carefully and break in subtle ways when not. The hreflang tags and the URL structure carry most of the weight.
URL strategy
Three valid patterns:
- Subdirectory:
example.com/fr/produit - Subdomain:
fr.example.com/produit - ccTLD:
example.fr/produit
Subdirectory is the easiest in HubSpot CMS and the easiest for SEO authority consolidation. Pick one and never mix. Mixed setups confuse Search Console and dilute link equity.
Setting up a language variant
In Content > Website Pages, open a page > Settings > Language. Add a variant in the target language. HubSpot creates a sibling page with the same template and asks for translated content. The slug should be localized:
EN: /products/data-platform
FR: /fr/produits/plateforme-de-donnees
DE: /de/produkte/datenplattform
ES: /es/productos/plataforma-de-datos
Translated slugs rank better in local search than /fr/products/data-platform.
Hreflang generated automatically — verify it
HubSpot inserts hreflang tags when you link variants properly. Verify in production:
<link rel="alternate" hreflang="en" href="https://example.com/products/data-platform">
<link rel="alternate" hreflang="fr" href="https://example.com/fr/produits/plateforme-de-donnees">
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/datenplattform">
<link rel="alternate" hreflang="x-default" href="https://example.com/products/data-platform">
Common bug: a forgotten variant breaks the reciprocal hreflang and Google ignores the entire group. Run a weekly crawl with Sitebulb or Screaming Frog and compare hreflang sets.
Language switcher that preserves the path
A header switcher that always sends users to the homepage is a UX failure. Use the language_switcher HubL module so users stay on the equivalent page:
{% language_switcher
"lang_switcher"
display_mode="localized",
display_format="name_native",
page_languages=content.translated_content
%}
If the current page has no variant, fall back gracefully to the section landing page in the target language, not the homepage.
Translation workflow
Three patterns, ranked by team size:
- Manual editor: small site, single translator, in-HubSpot editing
- Translation memory tool: Lokalise, Phrase, Smartling — pull HubSpot content via API, translate, push back
- Hybrid: marketing writes EN in HubSpot, exports to TM tool, translator reviews, push back
API export pattern:
// Pull all EN pages with French variants for translation
const pages = await hsClient.cms.pages.basicApi.getPage(undefined, undefined, {
language: "en"
});
for (const page of pages.results) {
const fr = page.translations?.find(t => t.language === "fr");
if (!fr || fr.updated_at < page.updated_at) {
await pushToTranslationTool(page);
}
}
Search Console per market
Verify each subdirectory or domain in Google Search Console as a separate property. Watching example.com aggregate impressions hides the truth — France traffic might be tanking while Germany compensates. Per-market dashboards drive per-market action.
Localized content, not translated content
Translating “Save 20%” word-for-word into German produces awkward copy that converts poorly. The buyer in Berlin processes pricing and trust signals differently from one in Boston. Brief translators on tone, allow paraphrasing, review against locals before publishing.
What to do this week
Audit your existing multi-language pages for hreflang completeness, consolidate to one URL pattern if you have mixed structures, and verify each market in Search Console as its own property before next month’s traffic review.