Tech for Retail 2025 Workshop: From SEO to GEO – Gaining Visibility in the Era of Generative Engines

Back to blog

Hreflang: The Implementation Guide, the Mistakes to Avoid and How to Check Them

SEO

Discover Incremys

The 360° Next Gen SEO Platform

Request a demo
Last updated on

24/10/2026

Chapter 01

Example H2
Example H3
Example H4
Example H5
Example H6

A version per market is useless if Google shows the wrong one to a Belgian or British user. The hreflang attribute links the equivalent versions of the same page and states the language, and where needed the country, of each one. This implementation guide covers valid codes, the three implementation methods, return tags, self-referencing and x-default, the mistakes that make Google ignore the signal and how to check them. The overall framework is covered in our guide to international SEO and multi-country structure.

 

What hreflang Does, and What It Does Not Do

 

The hreflang attribute, introduced in 2011, is carried by a <link rel="alternate"> element. It declares to Google a set of equivalent pages, each associated with a language and, optionally, a country. It is a signal, not a directive: Google applies it if the declarations are consistent and the pages genuinely equivalent.

 

Here is what it does, and what it is wrongly credited with:

 

  • It selects the version displayed based on the user's language and region: the fr-BE page for a query from Belgium, the en-GB page from the United Kingdom.
  • It stops close versions competing with each other: without it, two English pages for the United States and the United Kingdom may be treated as duplicates.
  • It does not rank pages: hreflang is not a ranking factor.
  • It does not replace localisation: an fr-CH label on a page priced in euros does not create a Swiss version.
  • It does not work alone: since Search Console's International Targeting tool was removed in 2022, country targeting relies only on the ccTLD or on hreflang, and the annotation is only credible if the content follows.

 

So first check that each version exists for a reason: a different language, or real differences in pricing, delivery or offer. Otherwise, a single version is enough.

 

Syntax and Codes: ISO 639-1 Language, ISO 3166-1 Country

 

The hreflang value combines an ISO 639-1 language code, in lower case (fr, en, es), and where necessary an ISO 3166-1 alpha-2 country code, in upper case (FR, BE, GB). Google does not read the case, but the convention makes reviews easier. The following table lists the codes most often found in audits:

 

CodeMeaningValid?
frFrench, whatever the countryYes
fr-FRFrench for FranceYes
fr-BEFrench for BelgiumYes
es-419Spanish for Latin America (UN M.49 regional code)Yes
x-defaultselector page or default versionYes
en-UK"UK" does not exist in ISO 3166-1: the United Kingdom is GBNo, use en-GB
ukUkrainian, not the United KingdomNo, to target the United Kingdom
es-LATAMinvented code, ignored by GoogleNo, use es-419
FR alonea country without a languageNo, the language is mandatory

 

The es-419 code deserves a mention: it covers Latin America in one go and avoids duplicating an identical version for each country. How it fits with es-ES and es-MX is explained in our guide to Spanish SEO, from Spain to Latin America.

 

Language Only or Language and Country

 

A language alone (fr) is enough when the offer is the same everywhere: same prices, same terms, same contact details. As soon as currency, delivery, VAT, returns or product range change, add the country (fr-FR, fr-BE, fr-CH). A useful test: if a user in country A lands on the country B version, is the experience degraded? If yes, the country version is justified; if not, an fr page avoids near-duplicates.

 

Both levels can be combined in the same cluster: fr-FR, fr-BE, and fr for the other French-speaking countries.

 

The Three Methods: Tags, XML Sitemap, HTTP Header

 

Google recognises three ways of declaring versions, and they carry the same weight. Choose one primary method per page type: two methods that contradict each other create clusters that are impossible to diagnose.

 

MethodWhen to choose itLimitationExample
Tags in the <head>smaller site, direct access to templatesadds weight to every page<link rel="alternate" hreflang="fr-BE" href="…/fr-be/" />
XML sitemaplarge catalogue, many templates, limited access to the <head>invisible when reading the page<xhtml:link rel="alternate" hreflang="fr-BE" href="…" />
HTTP Link: headerPDFs and files served without HTMLserver configurationLink: <https://www.example.com/fr-be/guide.pdf>; rel="alternate"; hreflang="fr-BE"

 

Tags in the Head

 

Each version lists every version, including itself, with absolute URLs. Here is the <head> of the French version of a guide page available in four versions, with a selector page as x-default:

 

  • <html lang="fr-FR">
  • <head>
  •   <link rel="canonical" href="https://www.example.com/fr-fr/guide/" />
  •   <link rel="alternate" hreflang="fr-FR" href="https://www.example.com/fr-fr/guide/" />
  •   <link rel="alternate" hreflang="fr-BE" href="https://www.example.com/fr-be/guide/" />
  •   <link rel="alternate" hreflang="en-GB" href="https://www.example.com/en-gb/guide/" />
  •   <link rel="alternate" hreflang="en-US" href="https://www.example.com/en-us/guide/" />
  •   <link rel="alternate" hreflang="x-default" href="https://www.example.com/guide/" />
  • </head>

 

The same list, unchanged, appears in the <head> of the fr-BE, en-GB and en-US pages. Only the canonical changes, since each version points to itself. Here, x-default designates the /guide/ selector page, not the homepage.

 

XML Sitemap With xhtml:link

 

A sitemap with xhtml:link annotations becomes the best option for thousands of URLs, multiple templates or limited access to the <head>. It requires the xhtml namespace to be declared at the top of the file:

 

  • <?xml version="1.0" encoding="UTF-8"?>
  • <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  •   xmlns:xhtml="http://www.w3.org/1999/xhtml">
  •   <url>
  •     <loc>https://www.example.com/fr-fr/guide/</loc>
  •     <xhtml:link rel="alternate" hreflang="fr-FR" href="https://www.example.com/fr-fr/guide/" />
  •     <xhtml:link rel="alternate" hreflang="fr-BE" href="https://www.example.com/fr-be/guide/" />
  •     <xhtml:link rel="alternate" hreflang="en-GB" href="https://www.example.com/en-gb/guide/" />
  •     <xhtml:link rel="alternate" hreflang="x-default" href="https://www.example.com/guide/" />
  •   </url>
  • </urlset>

 

Each version has its own <url> block with the complete list, self-reference included. The declared URLs must be exactly the indexable canonicals: same protocol, same trailing slash, no parameters that are not canonical.

 

HTTP Header for PDFs

 

For a PDF or a document served without HTML, the declaration goes through the HTTP Link: header, configured on the server. The rules do not change: each file lists all its versions and itself, and each URL returns 200 without a redirect. It is the only possible route when the resource has no <head> and no sitemap covers it.

 

Return Tags, Self-Referencing and x-default

 

Google treats the declarations as a cluster. Four rules determine whether they are taken into account, and a single break can make Google ignore all or part of the signal:

 

  • Return tags: if A declares B, B must declare A, with the same set of versions.
  • Self-referencing: each page lists itself in its own set.
  • Absolute, indexable URLs: full protocol and domain, 200 response, no noindex, no redirect, no robots.txt block.
  • Equivalent pages: same intent, same product or same article. Linking a French category page to a Belgian homepage breaks the cluster.

 

Building the Mapping by Template

 

At scale, return tags cannot be managed URL by URL. Build a mapping table by template: categories with categories, product pages with product pages, articles with articles. Tag generation then relies on this table. A template fix repairs thousands of pages at once, but a template mistake breaks them all. Roll out in stages and check a sample before each release.

 

Using x-default

 

x-default indicates the page to serve when no declared language or country matches the user: a language selector page, a neutral international page or the default version. Three mistakes recur in audits:

 

  • setting as x-default a page that is actually a country version, which muddies the signal;
  • pointing it to a redirected or non-indexable page;
  • sending users from a product page or article to the homepage rather than to an equivalent page.

 

The value remains optional: without a useful neutral page, you can do without it.

 

Aligning the Other Signals: Canonical, lang Attribute, Generative Engines

 

Google cross-checks hreflang against the page's other declarations about its language and status. When they contradict each other, hreflang rarely wins.

 

A Self-Referencing Canonical per Version

 

Each version's canonical points to itself. If the fr-BE page canonicalises to fr-FR, you are sending two contradictory messages: "this version matters" through hreflang, "do not index it" through the canonical. Google then arbitrates against your international intent and keeps the canonical page. The same logic applies to alternates: only declare URLs that are their own canonical.

 

The canonical chooses which URL to index among duplicates of the same version; hreflang links different, legitimate versions.

 

The lang Attribute and Bing

 

<html lang="fr-FR"> describes the language of the page itself, whereas hreflang links several versions together. Keep the two aligned. Bing relies more on the content-language declaration and URL signals than on hreflang: an accurate lang attribute and a readable URL structure therefore serve both search engines.

 

There is no <meta name="hreflang"> tag: only the three methods described above are read.

 

One Version per Language for Generative Engines

 

ChatGPT, Perplexity, Gemini, AI Overviews and AI Mode answer in the language of the query and cite sources in that language. One version per language, indexable and served to the right market, is therefore what makes it possible to be cited in each language. Entities stay consistent from one version to the next: same organisation name, same facts.

 

AI Overviews are rolled out in 200 countries (Sebastien Vallat, 2026). AI Mode has been available in France since summer 2026, and further benchmarks are in our GEO statistics. Structured data markup with the inLanguage property complements hreflang by stating the language of each piece of content.

 

Defining Clusters: Equivalent Pages and Edge Cases

 

Most broken clusters stem from a question poorly framed upstream: which pages exist in which versions, and which ones are equivalent? Answer it template by template.

 

Facets, Pagination and Partially Translated Content

 

Five edge cases need an explicit rule:

 

  • Facets and filters: a non-indexable filtered version is not declared as an alternate. See our e-commerce SEO guide.
  • Pagination: only link paginated pages that are strictly equivalent, with the same sorting and the same display rules.
  • Partially translated blog: incomplete clusters are acceptable, but each existing cluster stays reciprocal. An article without a translation carries no hreflang.
  • Mixed pages: a half-translated page blurs the detected language.
  • Non-indexable pages: noindex pages, pages blocked by robots.txt, temporary sort pages and internal search results stay out of the cluster.

 

No Automatic IP-Based Redirects

 

Redirecting based on IP address or the Accept-Language header creates three problems:

 

  • Googlebot mostly crawls from the United States: once redirected, it never sees some versions;
  • travellers, VPN users and bilingual users can no longer reach the version they want;
  • URLs lose their stability, since the same address returns different content depending on context.

 

Instead, offer a banner or selector that suggests the appropriate version, keep stable URLs and let hreflang do the routing in search results. Do not block Googlebot by country either.

 

The Most Common hreflang Mistakes and How to Fix Them

 

The same mistakes explain most cases of hreflang being ignored. The table links each one to the observed symptom and the fix to apply:

 

MistakeSymptomFix
Missing return tag (A cites B, B does not cite A)the relationship is ignored, the wrong version appears in a countrygenerate the complete list from a single mapping table
Missing self-referencecluster only partially taken into accountadd the page itself to its own list
Invalid code (en-UK, es-LATAM, uk for the United Kingdom)the annotation is ignored, the version is targeted nowherereplace with en-GB or es-419
Language only when countries differthe Belgian version, with Belgian prices, appears in Franceadd the country: fr-FR, fr-BE
Alternate pointing to a 3xx, 404 or 5xx URLcluster weakened, relationship brokendeclare the final 200 URL, remove dead alternates
Alternate pointing to a noindex page or one blocked by robots.txtpage declared in the cluster but impossible to indexremove the page from the cluster or lift the block
Canonical pointing to another versiononly the canonical version stays indexedself-referencing canonical on every version
Inconsistent tags and sitemapdifferent lists depending on the source, diagnosis impossiblekeep one primary method, align the other or remove it
x-default pointing to the homepage from a deep pagethe homepage is served instead of an equivalent pagepoint to a selector or an equivalent default version

 

Fix in this order, from the most blocking to the finest:

 

  • Blockers: 404 and 5xx, noindex, robots.txt, redirects, canonicals pointing to another version.
  • Cluster consistency: return tags, self-reference, missing versions, invalid codes.
  • Local quality: genuinely localised pages (pricing, delivery, legal terms) and intent equivalence between versions.

 

Checking the Tags: URL Inspection, Crawler and Code Review

 

Search Console's International Targeting report, which notably flagged missing return tags, was removed in 2022 along with the country targeting tool. At the time of writing, no Google report lists hreflang errors and there is no official hreflang tester. Checking combines three approaches.

 

URL Inspection in Search Console

 

URL Inspection in Google Search Console shows, for a given page, what Google has retained. The method comes down to four steps:

 

  • check that the page is indexable and returns 200;
  • compare the declared canonical with the canonical chosen by Google, as a gap signals a conflict;
  • check the rendered HTML for the expected alternates;
  • repeat on the equivalent version to confirm the return tags.

 

The Performance report filtered by country completes this check: a page receiving impressions in the wrong country reveals inconsistent mapping.

 

Crawler and Code Review

 

A test on a single URL can mask a problem elsewhere in the cluster. A crawler extracts alternates, HTTP statuses, canonicals and indexability in bulk, then spots missing return tags. Complete this with a review of the source code on a sample per template (categories, products, articles) and, where relevant, of the sitemap.

 

Pre-Release Checklist

 

Before publishing a new version or a new template, run through these seven points:

 

  • valid ISO codes, language in lower case, country in upper case;
  • self-reference present on every page;
  • return tags across all versions in the cluster;
  • absolute, final URLs returning 200 and indexable;
  • self-referencing canonical on every version;
  • same list in the tags and in the sitemap if both coexist;
  • clusters built on equivalent pages, x-default pointing to a selector or a default version.

 

Depending on Your Situation

 

Depending on where you are, these resources take the subject further:

 

  • You are preparing a full site diagnosis, beyond language versions alone: our SEO audit method.
  • You want to check that search engine and AI crawlers can access each version: our guide to the robots.txt file.
  • You want to be cited in AI answers, market by market: our guide to Generative Engine Optimization.
  • You are linking versions together in navigation and content: our guide to internal linking.

 

To spot missing return tags, contradictory canonicals and redirected or noindex alternates across an entire site, the Incremys 360° SEO & GEO audit checks hreflang, canonicals and indexing for each version, as well as the brand's presence in AI answers by country.

 

Frequently Asked Questions About hreflang

 

Is hreflang a ranking factor?

 

No. Hreflang does not push a page up the results. It tells Google which version to serve based on the user's language and country, and stops close versions competing with each other. A poorly ranked page stays poorly ranked, even with perfect annotations.

 

What is x-default for?

 

x-default designates the page to display when no declared version matches the user's language or country. It points to a language selector page or an equivalent default version, never to a redirected, non-indexable or unrelated page. Declaring it remains optional.

 

How do you check hreflang without a Search Console report?

 

By combining three checks. URL Inspection shows the canonical chosen by Google and a page's rendered HTML. A crawler extracts alternates, statuses and canonicals in bulk to spot missing return tags. Reviewing the code on a sample per template confirms the result.

 

Do you need a self-referencing canonical with hreflang?

 

Yes. Each version canonicalises to itself and declares the others as alternates. A canonical pointing to another version contradicts hreflang: Google indexes the canonical page and the version concerned disappears from the results in its market. Every declared URL must be its own canonical.

 

Should you write fr or fr-FR?

 

Both are valid. The fr code targets all French speakers, whatever their country; fr-FR targets France. Use the language alone when the offer is identical everywhere, and add the country when prices, delivery or terms differ. Both levels can coexist in a cluster.

 

Does Bing use hreflang?

 

Bing relies more on the content-language declaration and URL signals than on hreflang. To cover both search engines, keep an accurate lang attribute in the html element, a URL structure that makes language and country readable, and complete hreflang annotations for Google.

 

Do you need hreflang tags on a partially translated blog?

 

Only on articles that exist in several versions. An article without a translation carries no hreflang; a translated article lists its versions and itself, with return tags. Incomplete clusters are acceptable as long as each existing cluster links genuine, equivalent translations.

Discover other items

See all

Next-Gen GEO/SEO starts here

Complete the form so we can contact you.

The new generation of SEO
is on!

Thank you for your request, we will get back to you as soon as possible.

Oops! Something went wrong while submitting the form.