Skip to main content

When you use hreflang as well as canonical tags on your website, you have to be careful not to send confusing signals to Google. Here’s how to implement hreflang when you already have a canonical tag solution on your website.

Note: This article was first published on in 2015 and has since then been updated several times and moved to this blog.

hreflang and canonical tags both have similar functions: They suggest to search engines which URLs to index or to show to users in search results. If you already have a canonical tag solution on your website, which asks Google not to include certain URLs, and you then add hreflang tags to all of your URLs, you will most likely confuse Google. You will be asking Google to show and not to show certain URLs to users at the same time.

Let’s have a look at what URLs with canonical tags or hreflang annotations “say” to Google:

What do URLs with canonical tags want?

A URL that has a canonical tag pointing to another URL says to Google:

“Hey Google, how’s it going? I don’t want to be indexed. But you can index my twin sister here instead of me?”

A URL that has a canonical tag pointing to itself says to Google:

“Howdy Google, please index me and not my stupid twin brothers.”

Now you have to make sure that your URLs with canonical tags still know what they want after you’ve implemented hreflang on your website:

What do URLs with hreflang want?

A URL with correctly implemented hreflang implementations could say to Google:

“Bonjour Google, comment ça va? I speak French and I want to be indexed. Here are my cousins from other countries. Can you please index them too?”

So URLs with hreflang annotations always want to be indexed and always want additional URLs (their equivalents in other language and country versions) to be indexed along with them.

What do URLs with canonical tags and hreflang annotations want?

Now let’s see what a URL that has a canonical tag pointing to itself and hreflang annotations says to Google:

“Hola Google, ¿qué tal? I am the most mature out of my twin brothers and I want to be indexed. I speak Spanish and these are my cousins from other countries. Can you please index them too?”

This is a very clear and easy to follow instruction for Google. But what if the URL has a canonical tag pointing to another URL and hreflang annotations at the same time?

“Guten Tag Google, wie geht’s? I don’t want to be indexed, please index my twin brother instead. I speak German, so please index me and here are my cousins from other countries. Please index them too.”

And then Google will say:

“What a nutcase! Let’s see what his cousins say.”

And then Google will visit the other URLs in the hreflang annotations and hear a choir of:

“Buon giorno, 今日は, добрый день! We don’t want to be indexed, please index our twin sisters instead of us. But we really want to be indexed, so please? And please, please index all of us because we are all cousins from different countries.”

And then Google will say:

“Shut up! I’m not listening to you and I will just figure out who to index myself.”

If you send confusing signals, Google will probably just ignore your instructions. So make sure your URLs know what they want!


If you are using a canonical tag solution on your website, make sure that URLs that have a canonical tag pointing to another URL do not receive hreflang annotations. hreflang annotations are okay for URLs that point to themselves via canonical tag and for URLs that do not have canonical tags.

Possible exceptions: Mobile and AMP URLs

I really hope that now, in 202X, very few people are working on websites that have separate mobile URLs or still use AMP. But just in case, here are some additional non-conclusive hints for using hreflang and canonical tags on separate mobile and AMP URLs:

After the announcement of the mobile-first index in 2016, Google changed their recommendations for hreflang on mobile URLs. In the past, it was clear that mobile URLs should have canonical tags pointing to their desktop equivalents and therefore should not receive hreflang annotations. In 2017, the new recommendation was to add hreflang to the mobile URLs and to the desktop URLs:

According to this source, the same recommendation is valid for AMP pages: Canonical tags from AMP versions to desktop versions and hreflang between AMP pages and between desktop pages.

Eoghan Henn

Author Eoghan Henn

Eoghan Henn is responsible for searchVIU's marketing. Before joining searchVIU, he worked as an SEO consultant for 6 years and built a reputation as a blogger and conference speaker.

More posts by Eoghan Henn

Join the discussion 152 Comments

  • Damien says:

    Hello Eoghan,

    Thx for this great post.

    I have a specific question for our homepage. This homepage has a javascript redirection based on user browser language (we are in Belgium). As a consequence, a user typing in the url bar will land on or or based on his browser language (after being redirected).

    At the moment, the page is indexed which doesn’t really make sense as it’s a duplicated content of This results for the lack of canonical and hreflang tags on page. Thus, I’m considering adding on
    – a canonical tag pointing to
    – hreflang tags mentioning our,, pages

    I just want have this validated (if it makes sense ;))

    • Eoghan Henn says:

      Hi Damien,

      The JS redirect sounds like a bit of a messy situation, but to answer your question: If you set a canonical tag from to, then I would not recommend including any hreflang annotations on, as it wouldn’t a canonical URL anymore.

      hreflang annotations only really make sense when they link canonical URLs with each other. They shouldn’t be placed on non-canonical URLs or point to non-canonical URLs.

      I hope this answers your question!

      Best regards,


    • Roberto says:

      hi Damien i have exactly the same situation as yours,
      then what solution did you choose for the main url ? and for and ?
      i’m a bit confused!!
      thank you 🙂

  • Nowaker says:

    Your article is the highest ranked article in Google search for “link rel canonical hreflang”. However, it fails to pass the actual knowledge in a concise understandable non-prose way. I suggest that you provide an actual code example of multiple different HTML files with their own unique and tags.

  • Alex BILLINGSLEY says:

    Hi – great post.
    I am trying to figure out this scenario:

    Say I have /contact.html (lang: en-gb) canonical to itself.
    Then I have /en-us/contact.html (lang: en-us) – should this be canonical to itself? (eg. /en-us/contact.html) OR should it be canonical to the default version of the page? (/contact.html)

    I just cant seem to get that bit clear i my head – no matter how many articles I read!!

    • Eoghan Henn says:

      Hi Alex,

      If you have several language or country versions that you mark up with hreflang, then each of these versions should have a canonical tag pointing to itself.

      This means that in your case, both your en-GB and your en-US versions should have canonical tags pointing to themselves.

      I hope this helps! Please let me know if you have any additional questions.

  • Johnson says:

    Seriously fed up with this hreflang issue. Actually went through the article, can get what you are saying, but still, I am not able to fix it.
    Facing this issue for a long period of time and still not able to fix it.

    1. 24 hreflang conflicts within page source code and asking me to do this:

    2. 24 issues with incorrect hreflang links

    Also, I target for only one language that is “English”

    If I give specifically “en-us” it is again showing an error not to specify a particular location, So I removed and gave only “en”. Gonna get mad with this issse. Please help.

    <link rel="canonical" href=";


  • Low says:

    “Hreflang and canonical tags both have similar functions”

    Absolutely wrong! Do you know what geo-serving errors are? Do you know their origin?

    • Eoghan Henn says:

      Hello Low,

      Thank you for your interesting questions. No, I’ve never heard of “geo-serving errors” and Google does not return a single result for the expression, so it looks like nobody has ever used it on the publicly accessible part of the internet.

      I’m sorry that my article hasn’t been helpful for understanding the similarities between the functions of hreflang and canonical tags. If you have any questions about the topic, please feel free to ask.

  • afsina says:

    my canonical tag href is
    whereas google does indexing for
    which is not mentioned at all. the later is mobile website url.

    I am getting the error message as “Duplicate, submitted URL not selected as canonical”

    Thanks in advance

  • Hakan says:


    First of all thank you for this amazing content. We have Shopify websites in many languages and the main one is Turkish. However, our almost 3/4 Turkish links had beed deindexed by Google and replaced with links. So, we placed hreflang tags below:

    We waited about a week but it didn’t work and still international links were indexing in, so we decided to kill in Google search because our main website is more more important than int version. Then, we put canonical in as <link rel="canonical" href=";. Now, we can see right links in Google as, but meta titles and descriptions are coming from Additionaly, when we check Google Search Console for a specific link it says the link not in Google (for, but we can see the link in Google (but with international meta title and desc).

    In Google Search Console, we changed targeted locations as Turkey for and US for However, still Google doesn't care what we say. What we are gonna do to fix it? Any idea?

    Thanks in advance.

    • Eoghan Henn says:

      Hi Hakan,

      Thank you for your interesting question and sorry about the formatting problems with your comment! Our WordPress strips out code examples by default and we haven’t been able to fix this problem yet.

      Your problems sounds like Google is seeing your Turkish and international pages as duplicates. When I visited your website, I noticed that the language of the content I see does not seem to depend on the URL I visit. I am automatically sent to and I can change the language of the content without the URL changing.

      I haven’t analysed your situation further, but I imagine that Google might sometimes “see” your Turkish shop in English and therefore not notice any important difference between your Turkish and international pages.

      This is probably the very first problem you should fix: Each URL version should represent exactly one language version.

      I hope this helps for now! Please do let me know if you have any additional questions.

  • Christie says:

    Hi Eoghan,

    I have a similar issue that I’d like some clarification on but, due to your website stripping out code it may be better to send me an email so we can discuss the question properly.

    I work with a website currently in 34 languages that implements hreflang tags (solely through xml sitemaps). We can add self-referencing canonical tags to every page (not via the xml sitemaps but in the head of each page) but we have not implemented this because we’ve found Google does not show the correct locale version of the page, probably due to the page content being seen by Google as duplicate content, thus Google ignoring our hints and choosing its own canonical version of the page.

    My question is as follows: do we have to add self-referencing canonical tags or can ‘non at all’ allow Google to correctly interpret the hreflang tags on a site with this many languages?

    Happy to send you page examples to discuss further via email.

    Thank you

    • Eoghan Henn says:

      Hi Christie,

      Thank you for your question. I will send you an e-mail so we can discuss this further.

      One thing I can already tell you: It is always a good idea to implement self-referencing canonical tags on URLs that you want indexed and there is no risk of your self-referencing canonical tags colliding with hreflang annotations in any way, if both your canonical tags and your hreflang annotations are set up correctly.

      Best regards,


  • Christian says:

    Hi Eoghan,

    thanks for this really helpful article.

    I have one question: Our shop includes regions and languages. Our main focus is UK, US, DE and FR. For all those 4 countries, we offer the shop in English, French and German. In addition we have shops for Australia, Switzerland and more countries with other currencies, that we also offer in this 3 languages.

    Our URL structure is:
    shop,com /us/fr/ etc…

    We included a canonical tag to itself (every version, because it differs by the price, currency and shipping methods at least) and set hreflang tags to every other region/language combination, eg. for

    In the search Console we also set the country settings for the properties, so –> United States
    shop,com /de/ –> Germany –> France

    But now we have the problem, that Google starts indexing the US-Shop for all the different regions, means –> United States, which is correct –> Germany –> France –> United Kingdom (should be

    Do we also have to add something else or should we delete the language versions for each region which are not common there?

    Thank you very much,

    • Eoghan Henn says:

      Hi Christian,

      Thank you very much for sharing this interesting case. I think your comment contained some hreflang code examples that my website swallowed, but I still understand your questions.

      It looks like you did everything right, but unfortunately, it often happens that Google still has problems showing the correct version of a website to users from different countries and languages.

      hreflang and Google Search Console country targeting are only two out of many signals Google uses to determine which URL is the most relevant for a certain user in a certain place and situation. There are some other signals that you don’t have much control over, like, for example, inbound links. If your US version, for instance, has strong links from UK websites pointing to it, this might be a reason for Google to show the US version to users from the UK.

      There are other signals that you do have control over, and you should make sure to send them. In the past, I have seen cases where it helped to mention the country the version was for in the title tags and page content. It also helps to make sure that the content on each version is as localised as possible: Vocabulary, orthography and information displayed on the pages can be adapted to every country, even if the same language is used. Linking the different country versions with each other on a page-to-page level also helps.

      Your idea of removing irrelevant country/language combinations also makes sense, in order to take away some unnecessary complexity.

      I hope this helps for now! If you send me some more details, I’ll be happy to have a closer look at your case.

      • Hi Eoghan,

        thank you very much!

        It really kills me, because we now are losing a lot of traffic and also customers who are already in the shop because they can’t buy in there currency and can’t get their stuff delivered to their country if they are in the wrong version.

        We have a language switcher in the header, so you can switch between languages and regions on every site. If you want to switch both you have to do it in a row, means if you want to switch from /us/en/ to /de/de/ you need to switch first to /de/en/ or /us/de/.

        Also we try to have local differences on the sites, e.g. all the UK English is of course in UK orthography (like colour instead of color etc.).

        Yes, it would be really nice if you would have a closer look. Thanks so much!


        • Eoghan Henn says:

          Hi Christian,

          I had a closer look at your website and the fact that it is a PWA that relies heavily on JavaScript for the rendered version certainly complicates the matter even more.

          Here are some first steps I would suggest to take care of the specific problems you described:

          1. Remove irrelevant language and country combinations like de-JP, fr-AU, etc.
          2. Make sure the different language/country versions are actually linked with each other. Right now, the language/country switcher does not contain
          3. In the cases where you still have different country versions with the same language after removing all irrelevant combinations, make sure you make it clear on the page and also in places like title tags and meta descriptions which country the version is for.

          Most importantly though, I would recommend improving general crawlability and indexability of the website even further (I do see that you have already been working on this). I think there are some additional problems you can work on, like for example the links in the dropdown main navigation not being available in the rendered HTML.

          I hope this helps for now. Please let me know if you have any additional questions.

      • Can you please assist me to do how we can Implement International SEO, please

  • Alex Villalobos says:

    Hello, thank you for the simple explanation for us who are not SEO experts.

    My question is when:

    Now let’s see what a URL that has a canonical tag pointing to itself and hreflang annotations says to Google:

    “Hola Google, ¿qué tal? I am the most mature out of my twin brothers and I want to be indexed. I speak Spanish and these are my cousins from other countries. Can you please index them too?”

    If each page has a canonical tag pointing to itself, each page will say to google: “Im are the most mature” “Im are the most mature” “Im are the most mature”

    What does google think about that? What is the benefit if all pages tell google that they are the most mature.

    • Eoghan Henn says:

      Hi Alex,

      Thank you very much for your good question.

      The “I am the most mature out of my twin brothers” part refers to a URL that wants to be indexed instead of its duplicates in the same language. So the twin brothers here are pages of the same language that have identical or nearly identical content, but different URLs. This could be the case when you have canonical tags pointing from lots of versions of a URL with different parameters to the version of the URL without parameters.

      The cousins, in this case, would be versions of the canonical URL in other languages or for users from other countries.

      So in each country/language version, only the canonical URL (the most mature twin brother) will get indexed, but every country/language version will have one of those. The hreflang annotations help tell Google which of the cousins is the right one for users from certain countries or users who are searching in certain languages.

      I hope this is clearer now! Please let me know if you have any further questions.

      • pedro teixeira says:

        Hi both,

        @Eoghan: fantatic post – love the metaphors.
        @Alex: great question, I had exactly the same one.

        My situation is the same as Alex and this is all still a bit blurry.

        When you say ” the “I am the most mature out of my twin brothers” part refers to a URL that wants to be indexed instead of its duplicates in the same language”, does this mean that Google gives precende to the hreflang, understands which URL is for each country, and only then looks at the self-canonical already with this information in mind?

        How about the “cousins” that speak the same language? eg: English in US, UK, AUS, IN, IR, AZ, NZ…

        This brings me back to my initial confusion, and Alex’s question. The messaging for Google of all pages with a self-canonical, using your is the same: “hey Google I am the mature page and theseare my cousins from other countries.” …then Google would visit each of the cousins that say exactly the same thing “hi, im the cousin and I AM the mature page, here’s my cousins again”, and so on so forth through that hreflang implementation where all have a self-canonical tag.

        Meaning that:
        a) if Google sees everything as a whole, then all cousins are claiming they are the canonical/mature/original version. or,
        b) if Google first understands the “cousins relationship” (hreflang tags) and only then, starts ruling out evil twin brothers without the self-canonical, then this makes sense.

        In all honesty, b) seems a bit far fetched right?

        This situation is very dear to me as my website implements the hreflang tag but also self-canonicals in all of them. However, I still have severe issues with cannibalisation on the SERPs with countries that speak EN and their markets more developed. Nameley US vs GB. Any thoughts?

        • Eoghan Henn says:

          Hi Pedro,

          Thank you very much for your comment. I’m glad you liked the article.

          It’s important to keep in mind that canonical tags and hreflang serve two different concepts:

          Canonical tags should be used within one country/language version, and not between URLs from different country/language versions. A canonical tag should normally not point from a URL in one country/language version to a URL from another country/language version (although, as I recently learnt, there are cases where this can make sense and works – see my conversation with Chris below). So canonical tags help mark up duplicate URLs within one country/language version and signal which of the duplicates should be the preferred version of this URL (or, in other words, the canonical URL).

          Once this is sorted out within each country/language version, hreflang helps you link canonical URLs from each country/language version that are versions of each other for users that search in different languages or that are located in different countries. The main purpose of hreflang is to signal which version of a URL should be surfaced for which user, depending on the user’s language and country. Every URL that is linked via hreflang is a canonical URL within its country/language version, but only one of them is the right one for the user, because they are all targeted at users with different language/country combinations.

          So yes, it’s option b), even if it seems far fetched 😉

          The problems you describe often happen when there aren’t enough additional signals that support what your hreflang annotations are saying. hreflang is just one out of many signals, and it’s important to send as many signals as possible and align them. Some other signals that can help Google understand that your US and GB versions are for users from the US and the UK, respectively:

          – Localised content (including the country name in title tags/descriptions/page content, using US vs UK grammar/orthography/vocabulary, exclusively relevant content for users from each country)
          – Internal linking signals (US and GB pages linked with each other 1:1 with the name of the country in the link text)
          – External linking signals (links from US websites to your US version and links from UK websites to your GB version)
          – Correct use of the country targeting option in Google Search Console for each version

          I hope this helps for now! Please do let me know if you have any additional questions.

          • pedro teixeira says:

            All makes sense! Thanks so much for taking the time to review the situation.

            Makes sense the use of the canonical within one country/language version as well. I guess the whole tricky part of my particular situation is the “self” canonical tag. I reckon one solution to audit my current cannibalization would be to drop this tag for good and rule it out of the equation.

            In all honesty, I don’t have duplicates per say within country/language – the near duplicates we have are targeted for each country with their small local variations. So I wonder, do we really need the self-canonical at all? I’ve read about some minor benefits of this tag from an SEO POV, but maybe not worth it VS the whole cannibalization going on.

            Thanks as well for the extra tips on the hints one can implement for Google to understand which page to serve where. I’m affraid the populaty of the US version is massive VS GB, so Google always picks it up first but I guess it’s worth the shot.

            • Eoghan Henn says:

              Hi Pedro,

              I’m not aware of any cases where self-referencing canonical tags do any harm, but if you really don’t have any problems with duplicate URLs per country/language directory, it might be worth a try to remove them, in order to take away some complexity.

  • Ammar says:


    I have an issue of constant the usa-en version of my page showing up instead of the global-en version even if I search from the UK. The x-default is set as the global-en page.

    This is the hreflang placed on the USA page:


    This is the hreflang placed on the Global-en page:


    I’d be really glad if you can help tell me if what’s currently placed is correct, and if not, what is the proper thing to place?

    Thank you,

    • Eoghan Henn says:

      Hi Ammar,

      Thank you very much for your comment. Unfortunately, your code examples have been deleted form the comment by WordPress (this is something I’ve been wanting to find a solution for for a long time). I’ll send you an e-mail now, so that we can discuss your question properly.

      Best regards,


  • Chris says:

    Hi. Google followed many canonical for 5 months. Since we were switched to mobile first index google dropped many canonicals for similar content. We are running D-A-CH ecommerce websites. I am thinking of implementing the hreflang together with non-self-referencing canonicals, just to get google follow one of the two hints. Will it be really a problem to implement both hints? I think the hreflang tag is not an indexing signal. It just changes the URL for the user. Even if google canonicalised our .de, .at pages to a .ch page – google send the user to the correct hreflang version. This was and is really confusing. Please take a look here: – Number 3 : Add any hreflang or other redirects appropriate for the page. – John Mueller’s advise is not to combine hreflang with no self-referencing canonicals.

    • Eoghan Henn says:

      Hi Chris,

      You can always try out configurations that go against Google’s advice or best practices, if you believe that your situation requires a special solution. If something works for you, there is no reason why you shouldn’t do it that way.

      On the other hand, from my experience, it is always best to send clear signals, and that’s what this article is all about. What have you been using canonical tags for exactly? And how did you test whether Google followed or dropped them?

      If Google canonicalised your .de or .at pages to your .ch version at some stage, then you probably have bigger problems you should take care of. This should not happen if you have versions that are localised properly for users in the three countries and if you have hreflang set up properly.

      I can’t think of a scenario where it would help to use hreflang annotations for pages that have canonical tags pointing to another URL. Also, you should not use canonical tags pointing from one country version to another, if you want the versions to show in search results for users from different countries.

      If you are experiencing problems with your international search results, it would be a good idea to start by making sure that your hreflang implementation is 100% correct. I had a quick look and I found some minor issues (nothing very serious): Usage of country codes not always aligned with ccTLDs & overuse of x-default. I also saw that your country switcher doesn’t seem to be implemented as an HTML link ( element), so Google probably can’t find direct links between the different versions of a page, a factor that can help Google understand the international structure of a website.

      If you have additional questions about any of this, please feel free to ask. I hope this helps you for now!

      • Chris says:

        Hi Eoghan.

        We are using canonicals to send google to the main product from the product variation pages. Today, I talked to John Mueller in the german webmaster hangout. His advice was to test configurations. Yesterday, he published a tweet about hreflang:

        In today’s hangout a webmaster from the company snowtrex asked a question about canonicalisation with a hreflang setup. Their setup is: all german domains (AT and CH) are canonicalised to the DE domain with a valid hreflang setup. What I can see is, that this setup seems to work. Content is taken from DE, but google links to correct hreflang urls when you search in AT or CH.

        I think I will give a try like that. At the moment we have self-referencing canonicals with hreflang in D-A-CH. Content is nearly the same. Only prices and ratings differ.

        Thanks Chris

        • Eoghan Henn says:

          Hi Chris! Thanks for bringing the Snowtrex example to my attention. This is a really interesting case, because it’s the first time I see Google actually respecting canonical tags between country versions (tested with an info: search for Austrian and Swiss URLs) and showing the right country version in the different country SERPs (test with hl and gl parameters on the respective Google country domains).

          I see that they have the same setup for English with their .ie, .us and domains and for Dutch with their .nl and .be domains. In these two languages, the setup isn’t working as smoothly as in German, because Google shows sitelinks from the canonicalised domains in the Irish, US and Belgian SERPs.

          Also, when you look beyond the home pages, you will see that the targeting in the German speaking countries isn’t working too well at all. Check this Swiss result for “snowtrex langlauf les deux alpes”, for example: Swiss Google SERP for snowtrex langlauf les deux alpes. I guess if you monitor their international SERPs in Google Search Console, you will find plenty more problems of this type. This might or might not be related to the use of canonical tags across country versions.

          I wonder if they have any advantages from using this setup. Did they share any more info during the hangout or can you think of any benefits this could bring?

          Another disadvantage that comes to my mind, which might not be relevant to all businesses, but certainly to some, is that you can’t localise your snippets this way. It looks like Google always pulls the information for the snippet from the canonicalised version, so if you use different title tags, meta descriptions, structured data (and so on) for your different country versions, this would probably have no effect, although it is highly recommendable to have localised snippets.

          Please do test if such a setup works for you and let me know how it goes. Thank you very much for sharing your interesting thoughts and insights!

          • Chris says:

            Hi Eoghan.

            Yes. The webmaster asked if there will be any ranking problems if they change to self-referencing canonicals:

            If I search for “langlauf les deux alpes” on google CH, I get the CH version. Same on AT and DE. It’s normal to get more result if you add the brand to the search query.

            Yes. Rich snippets with ratings and prices will be lost on the non-canonical pages, but if the outcome will be a stronger page than maybe the benefit from a better ranking is higher.

            Today I asked John, if hreflang is an indexing signal:

            I was in spain in march and in september. I did many search from my hotel’s wifi in german. I nearly got everytime a bad result (a non working hreflang). Sometimes I got the AT version and many times the CH version. By legal reasons we can only deliver to spain from the DE domain.

            Thanks Chris

            • Eoghan Henn says:

              Thanks for providing more context by sharing the videos. I don’t see any big differences between John Mueller’s advice and the message of this article. I think he explains the advantages and disadvantages of both options quite well in the German video.

              Yes, it is normal to get more results from the same website when you add the brand, but with good hreflang implementations, you don’t normally get results from different countries and other countries outranking the country version you are meant to see.

              When you search in Spain, you will always get Spanish results, no matter which Google country domain you search on. This is an important change Google made about a year ago: In the same way, if you search from Germany, you will always get German results, even if you switch to or In order to avoid this, you can use hl and gl parameters on the Google domains, so for testing, you can use these URLs:


  • koviSearch says:

    In addition, all brotherds .de, .at and .ch are actually tripplets – all have exactly the same content in german language. : D

    • Eoghan Henn says:

      You might run into problem with this – it’s always a good idea to localise the three versions as much as possible, so they’re not 100% identical. Otherwise, Google might decide to canonicalise them, even if they have correct hreflang annotations in place.

  • koviSearch says:

    Hi. The mature brother .de has newly born twin brothers .at and .ch. Mature brother .de says to Google: hey, please index me (canonical to same url) and have a look at my brothers (hreflang tags for .ch and .at). Is it okay if the newly born brothers say to Google exactly the same: for .at – canonical = .at + hreflang tags to .de and .ch. Thanks in advance : )

    • Eoghan Henn says:

      Yes, it’s OK if each of the three URLs (.de, .at, .ch) have a self-referencing canonical tag. Did I understand you correctly?

  • mike_bgr says:

    Hi Eoghan
    I carefully read your really clear article and also your reply to people with similar problems, but still I can’t understand why SemRush detects “No self-referencing hreflang” error on all my website pages… first of all on
    It seems to me that canonical and hreflang annotations are correct as you suggested to other users…

    Could you help me?

    Thank you.

    • Eoghan Henn says:

      Hi Mike! I had a quick look at the example page you provided and the self-referencing hreflang annotation is indeed missing.

      The page ( currently has the following hreflang annotations:

      <link rel=alternate href= hreflang=it-IT />
      <link rel=alternate href= hreflang=es-ES />
      <link rel=alternate href= hreflang=fr-FR />
      <link rel=alternate href= hreflang=pt-BR />
      <link rel=alternate href= hreflang=nl-NL />
      <link rel=alternate href= hreflang=ru-RU />

      In addition to this, you should also assign an hreflang value to the page itself and include an annotation for it:

      <link rel=”alternate” href=”” hreflang=”en” />
      <link rel=”alternate” href=”” hreflang=”it-IT” />
      <link rel=”alternate” href=”” hreflang=”es-ES” />
      <link rel=”alternate” href=”” hreflang=”fr-FR” />
      <link rel=”alternate” href=”” hreflang=”pt-BR” />
      <link rel=”alternate” href=”” hreflang=”nl-NL” />
      <link rel=”alternate” href=”” hreflang=”ru-RU” />

      Another thing that I noticed and that I recommend you change is the following: You are currently using country codes for all of your website versions, although these are optional. It would be advisable to have at least one generic language version for every language that you target. Generic language versions target all users of a language, except for those that another version already exists for. As you only have one version per language, it would make sense to make them all generic by removing the optional country codes:

      <link rel=”alternate” href=”” hreflang=”en” />
      <link rel=”alternate” href=”” hreflang=”it” />
      <link rel=”alternate” href=”” hreflang=”es” />
      <link rel=”alternate” href=”” hreflang=”fr” />
      <link rel=”alternate” href=”” hreflang=”pt” />
      <link rel=”alternate” href=”” hreflang=”nl” />
      <link rel=”alternate” href=”” hreflang=”ru” />

      This way you could target more users, for example Spanish speaking users in South America, instead of just in Spain.

      I hope this helps. Please let me know if you have any further questions.

  • David says:

    Great article!
    What is your recommendation for a homepage that serves two languages (via language switch button) the URL remains the same however we can dd a parameter which loads that language

    for ex. will load french
    and ex. will load spanish
    The default loads english and calling loads english too

    • Eoghan Henn says:

      Hi David,

      This is not an ideal setup. If the URL stays the same after switching languages, search engines won’t be able to access your content in any language other than the default one. Working with parameter URLs can be a temporary solution, but then you’d have to make sure that you also link to those parameter URLs internally. The best solution would be to create a directory with speaking and translated URLs for every language version.

      I hope this helps!

  • Pedro Trivino says:

    Hi Eoghan,
    I have a doubt, making a Seo Audit with SemRush, it notice me some errors with hreflang e canonical.

    For example:



    This is my situation now, i look for any solution, do you think the problem is that all indicators are pointed to the first page?



    Change it to this do you think we will fix these issues?

    • Eoghan Henn says:

      Hi Pedro,

      I’m sorry, your code examples were deleted from your comment. I will send you an e-mail now so that we can discuss your question.

  • Aura says:


    I have the following situation while building the hreflang/canonical tags for my website.

    Page A in English (http://dev.local/UK/en/PageA) is the preferred one, thus the canonical/hreflang links look like below:

    Page B in English(http://dev.local/UK/en/PageB) is duplicate of Page A, thus the canonical tag looks like below:

    My doubts are regarding the canonical URL for Page B in Chinese(http://dev.local/hk/zh/PageB)

    ? option 1:

    ? option 2:

    Does it matter to Google which of the alternate page I am pointing it to ?

    • Eoghan Henn says:

      Hi Aura,

      I’m very sorry, my website deleted your code examples from your comment. I will send you an e-mail now so that you can send them to me again.

  • Hi Dear,

    We have implemented hreflang in our website, we have multilang and multi country,

    the same content in arabic for 5 country, and same english content for 5 country, we have this:

    Ar version:

    En version:

    we implemented hreflang, but in google search console the hreflang tag decreased from thousands to 10-100 only

    can you check please if there is any problem in our implementation?

    and can you give me an example of how canonical links should be with hreflang please..

    I try to get answers from a lot of blogs and google support, but really no body help me, I hope you can help me

    • Eoghan Henn says:

      Hello Motasem,

      Thank you very much for your comment.

      I had a very quick look at your hreflang implementation and I could not find any big problems. Did you change anything about your implementation before the numbers in GSC went down? It is difficult for me to tell you what might be going on without seeing the data, but feel free to send me more information.

      Also, in order to really check your hreflang implementation, it would be advisable to run a full crawl of your website with a tool like Screaming Frog and check the hreflang annotations for errors and conflicts.

      Are you currently using canonical tags on your website? If so, just make sure that you do not include hreflang annotations on non-canonical URLs. Here’s an example: The URL has the hreflang annotations of (because the second URL should be the canonical one). The first URL should either be redirected to the second one, or at least have a canonical tag pointing to it.

      I’m sorry I can’t spend more time checking your page right now. I hope this points you in the right direction. Please do feel free to let me know if you have any additional questions.

      • this is great answer i think, we don’t using canonical links at all pages, but if some pages didn’t included canonical links then hreflang will not working 100%, right?

        • Eoghan Henn says:

          I don’t think that’s what I meant exactly. The problem is on pages that have canonical tags pointing to other pages but still have hreflang annotations. Pages that don’t have canonical tags should be fine.

  • andrea says:

    Hi Eoghan,
    thank you for your tutorial. I have an Italian website and I am adding only some pages translated in English. Please note that page-1 is the exact translation in english of Italian pagina-1.
    I use canonical tag.
    So I will have and the english version
    then put canonical on italian page and on English page. For hreflang I will put

    link rel=”alternate” href=”” hreflang=”it-IT” on Italian page and
    link rel=”alternate” href=”” hreflang=”en”

    Reading your article I think this the correct way, Is this true?

    Last question, In the last part of this article you speak about Mobile Index. Are there any posts on your site explaining how to deal with it?
    Thank you

    • Eoghan Henn says:

      Hi Andrea,

      Thank you for your questions. The self-referencing canonical tags you are using on both pages will not cause any problems, so that’s all fine. The hreflang annotations also look good, but please make sure to add both lines on both pages. So /page-1/ and /pagina-1/ bot receive the following two hreflang annotations:

      <link rel="alternate" href="" hreflang="it-IT">
      <link rel="alternate" href="" hreflang="en">

      I’m sorry, I don’t have any more detailed info about mobile pages, but you only have to worry about this if you have separate mobile URLs. If you are using responsive design and the same URL shows on mobile devices, there is no need to act. If you have any other questions on this topic, just let me know.

      I hope this helps!

  • Miko says:

    Hi, Eoghan
    I am totally confused now about the mobile urls. Google was clear that mobile URLs should have canonical tags pointing to their desktop equivalents. And you said add hreflang to the mobile URLs.

    For example, I have a mobile site and its pc site is, also has a french mobile site and the french pc site is

    And in the mobile site, the code is:

    And I use hreflang tool test, it says something wrong, “Alternate URL has a non-self-referencing canonical tag (source code)”.

    How to repair this error? Need your help!

    • Miko says:

      And in the mobile site, the code is:

      • Eoghan Henn says:

        Hi Miko,

        I’m very sorry, my website swallowed your code examples.

        I understand that you are confused. Google’s current recommendations are confusing.

        Let’s see… You say that Google was clear that mobile URLs should have canonical tags pointing to their desktop equivalents. This is still valid. Google still recommends having canonical tags pointing from mobile URLs to their desktop equivalents. So there’s no need to make any changes to this.

        The different country and language versions of your desktop URLs should have hreflang tags pointing to each other. This is also not new.

        What changed recently is that Google now recommends to also link the different country and language versions of your mobile URLs with each other with hreflang.

        The image in this Tweet from Aleyda Solis is very helpful for understanding the new structure:

        I hope this helps! Please let me know if you have any further questions.

  • Peter says:


    Say I have a page that contains an article:

    The article is from an external webpage, and therefore canonical is poiting to that external web page:

    I have translated that article to multiple languages, and therefore specific language pages exist for the article:

    What about canonical on the translated pages? Should they point at the external page, even though they are translated?

    And what about Hreflang? Can that not be used when canonical is pointing to an external page?

    Best regards,

    • Eoghan Henn says:

      Hi Peter,

      Thanks a lot for this interesting question. This is certainly an edge case that requires a creative solution.

      Let me reply to the easy part first: “What about canonical on the translated pages? Should they point at the external page, even though they are translated?” No, I would not recommend using canonical tags to point from a translated version to the original version. Canonical tags are for pages with identical or very similar content. Translated versions of a piece of content are for different users and different search queries (in different languages), so they should not be marked up as equivalents with canonical tags.

      Now the “correct” use of hreflang in this case would be linking your translations with the original version on the other domain. This might not be possible, if you do not have access to the other domain or if you are not cooperating with owner of the other domain, because this would require hreflang annotations on the original version pointing back to your translations.

      So you might have to choose between two alternative hreflang implementations that are slightly incomplete or incorrect:

      1. Linking your translations with your adaption of the original article. In this case you would generate the problem described in the article above (confusing signals).
      2. Using hreflang on your translations only and pointing them at the original on the other domain without having hreflang annotations pointing back at your translations from the original.

      I’m not sure which option I would recommend in your case. The ideal solution would obviously be the “correct” use described above. Let me know if that works for you or if you have to go with one of the alternative solutions. In that case, it would be great if you could share how it works out for you.

  • selma says:

    is this necessary or preferred?

  • Husain says:

    Hello Eoghan,

    Having trouble understanding the canonical and hreflang implementation on our website and this has resulted in thousands of no-return tag errors.

    One important thing to know is that we have certain pages in English, with the same content, but served to audiences based on their country of access.

    For example:

    For audiences coming from UAE:

    For audiences coming from Saudi Arabia:

    For audiences coming from rest of the world (we use this as our canonical for the above):

    Is it all right for us to use the canonical version the same as the country edition page? I fear being penalised by search engines for duplicate content.

    • Eoghan Henn says:

      Hello Husain,

      Thanks a lot for your comment. It is not recommended to use canonical tags to point from one country version to another. This will result in only the canonical version being indexed and displayed in search results. You surely want the other country versions to be shown to users in those countries too, right? I suggest you remove the canonical tags that point to the /mena/ version and only use hreflang to link the different country versions with each other. If you set this up correctly, you don’t have to worry about duplicate content. Different versions of a URL for different countries are not seen as duplicate content by search engines.

      Please let me know if you have any further questions. I’ll be happy to help!


      • Husain says:

        Thanks a lot for clarifying this, Eoghan. My primary concern was duplicate content penalty, which you have put to rest 🙂

  • buisine says:

    Hello Eoghan, thank you so much for your article !! as i am not a programmer, my webmaster doesn’t understand some errors detected by Semrush :
    on these pages

    semrush detected these errors :

    en-ca Conflicting hreflang and rel=canonical
    No self-referencing hreflang

    idem for “fr” and “es”

    when i look at the source code page i have



    Could you please help me ?

    • Eoghan Henn says:

      Hello Bruno,

      Thanks a lot for your comment. The problem with the three example pages you sent me is that they are not canonical URLs. They have canonical tags pointing to URLs that should be shown in the search results instead: > > >

      So far, so good, although in this case it would be probably best not to link to the /index.php versions at all and redirect them to their canonical versions. But let’s say you keep the canonical tags because you don’t have any other solution. In this case, the hreflang annotations would have to be removed from the pages, because non-canonical URLs can’t receive hreflang annotations (see article above).

      The two errors SEMrush gave you are both related to the same problem: “Conflicting hreflang and canonical” because there are hreflang annotations on non-canonical URLs, and “no self-referencing hreflang” because the URLs contain hreflang annotations but none that point to the URL itself (because the annotations that would normally be self-referencing point to the canonical version instead).

      Now there is another big problem with the hreflang annotations on the rest of your pages. Your pages only contain self-referencing URLs. But they should also point to the other language versions of each page. For the home page, each of the three versions would receive these three lines of code:

      <link rel=”alternate” hreflang=”en-ca” href=””>
      <link rel=”alternate” hreflang=”fr-ca” href=””>
      <link rel=”alternate” hreflang=”es” href=””>

      And this structure needs to be continued on all sub-pages, so the three versions of the “about” page should each get these three lines of code:

      <link rel=”alternate” hreflang=”en-ca” href=””>
      <link rel=”alternate” hreflang=”fr-ca” href=””>
      <link rel=”alternate” hreflang=”es” href=””>

      and so on…

      And one other thing that I would recommend is to change “en-ca” to just “en” and “fr-ca” to just “fr”, because that way you don’t limit your versions to just English and French speaking users in Canada, but send a signal to Google that the content is interesting for English and French speaking users in the whole world.

      I hope this helps! Please let me know if you have any further questions.

  • Göran Lindholm says:

    I have ONE website and just moved it from http to https (secured site).
    Google has just started to index the https site, but only a few pages are indexed so far. I have already switched all my canonical to https-adresses.
    The website is in English language and most readers are from the UK.
    So. It is possible to use both canonical and hreflang tags for my pages?

    • Eoghan Henn says:

      Hi Göran,

      Yes, you can use hreflang annotations and canonical tags together on your website, but if you only have one language version of your website, there is really no need for hreflang. It wouldn’t do any harm to implement hreflang annonations on a website with only one language, but it probably wouldn’t have any benefits either.

      If you still decide to use hreflang, just make sure you don’t add it to pages that have a canonical tag pointing to another URL.

      Please let me know if you have any further questions.


  • Nish says:

    Hello Eoghan,

    Great piece of content, have just one query:

    I am using a website say and want to expand in US with sub-folder http://www.example/us.

    All my product pages have url as (Breadcrumb URL’s created) with canonical tags on (Default Page)

    While using href tags: which is the URL I am suppose to mention, breadcrumbs or the default pages to which canonical is pointed.

    • Eoghan Henn says:

      Hi Nish,

      Thanks a lot for your comment. The answer to your question is quite straightforward:

      When implementing hreflang, you should completely ignore your non-canonical URLs. Only canonical URLs should get hreflang annotations and hreflang annotations should only point to canonical URLs.

      Your “breadcrumb” URLs should thus not receive any hreflang annotations and also, all hreflang annotations should only point to your default pages.

      I hope this helps! Please let me know if you have any further questions.


      • Nish says:

        Thank you Eoghan.

      • Nish says:

        Hi Eoghan,

        Just one small doubt, Is it absolutely fine to have HREF’s implemented across different ccTLD ?

        I currently have a .com/in site and expanding to US and Canada market soon.

        I am confused choosing between ccTLD and sub-directory. Would you suggest going for ccTLD as the content is anyways going to be same?

        • Eoghan Henn says:

          Hi Nish,

          Yes, it is absolutely fine to implement hreflang across different domains. See this chapter of my hreflang implementation guide for a detailed discussion about hreflang on ccTLDs vs. gTLDs:

          In most cases, I would recommend using one gTLD (like a .com domain) for all of your language and country versions. This advice is not related to hreflang, but rather to the fact that hosting all of your content on just one international domain has some interesting SEO performance advantages. See this article for more details:

          I hope this helps! Please let me know if you have any further questions.

  • suresh ven says:

    Hi Man,
    Regarding hreflang return tag error.You have gave me solution to solve above, but not able to reply your I’m posting hear

    link rel=”alternate” hreflang=”sv” href=”″>
    link rel=”alternate” hreflang=”en” href=””

    i need to add this above tag to all pages??

    What should i for existing tag ? (example given below)

    link rel=”alternate” hreflang=”sv” href=”” >
    link rel=”alternate” hreflang=”en” href=”” >

    • Eoghan Henn says:

      Hi Suresh,

      You need to add a pair of tags like this to each pair of language version of a page.

      The “existing tag” you are referring to only works for your home page. Every other page gets its own hreflang annotations.

      If you want to learn more about how hreflang works exactly, you can check out this guide:

  • vinoth says:

    Hi Mr. Eoghan Henn

    My website has two language translator one is swedish and another one is english.Main launguage is swedish below code was already implemented in all pages

    So i gave hreflang tag like this ,

    Successfully showing signal in webmaster tool after a week i got few url with some error as below mentioned

    URLs for your site and alternate URLs in ‘en’ that do not have return tags.
    URLs for your site and alternate URLs in ‘sv’ that do not have return tags.

    Could you please tell me the clear explanation to solve

    • Eoghan Henn says:

      Hi Vinoth,

      Thanks a lot for your comment. When you get the error “no return tags”, this can have two reasons:

      1. The alternate URL that you refer to in your hreflang tags has not been crawled yet, so the return tags have not been found yet. This sometimes happens shortly after you have implemented hreflang on your website and is no reason to worry. Just wait and re-check the report again in a few days or weeks.
      2. The alternate URL you refer to in your hreflang tags actually doesn’t have any return tags. You can check every error you get in the report and see if the URLs you refer to in your hreflang annotations link back to the original URL. hreflang tags are only valid if they are reciprocal, so if the English version of a page of yours links to a Swedish version, the Swedish version always has to link back to the English version in order for the hreflang annotations to work.

      If you are sure that everything is implemented correctly and if you know that the right users see the right results (you can check that with country filters in you search analytics data in Google Search Console or by doing manual tests in Google, using different country versions of Google in different languages), you can ignore the hreflang errors in Google Search Console. They often show although everything is in order.

      I hope this helps! Please let me know if you have any other questions.

  • suresh ven says:

    My main domain is :

    [ View page source ]

    Two language translator already in website [ English & Swedish ]

    [ View page source ]

    [ View page source ]

    Please have a look on below hreflang tag signal which i gave

    After giving above hreflang tag in was successfully showing like this in webmaster tool

    For main domain 26 Hreflang Tags 0 Hreflang Tags with Errors
    sub domain(1) – 18 Hreflang Tags 0 Hreflang Tags with Errors
    sub domain (2 )- 16 Hreflang Tags 0 Hreflang Tags with Errors
    sub domain (3) – 4 Hreflang Tags0 Hreflang Tags with Errors
    sub domain( 4) – Your site has no hreflang tags.
    sub domain (5 )- Your site has no hreflang tags.

    I’m new to international targeting .My question is

    what is mean by the count of hreflang tag


    Another question when i checking my website in technical seo checker

    Missing return tag(s) (page does not link back) ..please anyone clear my doubt or did i mistake anything

  • Dale says:

    Hi Eoghan,

    Thank you for your post, really nice detail and explanation. Can you tell me if I have followed your tutorial correctly.

    Thanks man!

    • Eoghan Henn says:

      Hi Dale, thanks for your comment!

      Sorry, my website ate your code 🙁 When you use HTML tags in a comment, WordPress does not display them. A handy workaround is to write the first bracket (

  • Husain says:

    Hi Eoghan,

    Amongst many no-return tag errors, here’s one for ’en-sa’ no return tags in Search Console:

    Originating URL:

    link rel=”canonical” href=””
    link rel=”alternate” href=”” hreflang=”en”
    link rel=”alternate” href=”” hreflang=”ar”
    link rel=”alternate” href=”” hreflang=”en-ae”
    link rel=”alternate” href=”” hreflang=”ar-ae”
    link rel=”alternate” href=”” hreflang=”en-sa”
    link rel=”alternate” href=”” hreflang=”ar-sa”

    Can you please help in pointing out where am I going wrong?


    • Eoghan Henn says:

      Hi Husain,

      First of all, sorry about the delay. I’ve had trouble catching up.

      There is nothing wrong with your hreflang implementation in the examples you provided.

      Something did catch my attention though. In the second example, the “en-sa” version of the URL is not indexed at all. You can verify this by performing a site search for the URL here.

      All the other five versions of the URL are indexed. The missing “en-sa” version explains why Google complains about there not being any return tags for this hreflang value.

      The error “no return tags” often occurs because Google hasn’t found or processed the tags, not because they don’t exist.

      Check if you see a similar pattern for other errors of this kind. Then try to find out why these pages aren’t indexed yet and fix your indexation problem. The hreflang errors should disappear once you have taken care of this.

      Please let me know if you need any support with this.

      Best regards,


      • Husain says:

        Thanks a lot Eoghan, I really appreciate it.

        The said page not indexed has no problem accessibility wise, but will check why it hasn’t been indexed. Could it be because Google thinks it’s a duplicate since the canonicals of these are /mena/en/, hence other variation of the URL isn’t indexed?


        • Eoghan Henn says:

          Yes, you’re right! Sorry, I hadn’t checked the canonical tags yet.

          You should remove the canonical tags that point from one country/language version to another. They contradict the hreflang annotations, just as described in the article above.

          Let me know how this goes for you and feel free to get back to me if you have any further questions.

  • Husain says:

    *Code got stripped out previously, resending comment* …

    Hi Eoghan,

    I stumbled upon your article out of desperate measures to understand the implementation of canonicals and hreflangs for multi-language and country sites.

    I am still struggling along with my IT team to understand the right implementation for our site. We are getting lots of “no return tag” errors in Search Console, and just not able to find the solution nor able to test our fixes.

    Here’s an example of our implementation on one of the site sections (“en-ae” no return tag):

    ORIGINATING URL:, with below tags:

    link rel=”canonical” href=””
    link rel=”alternate” href=”” hreflang=”en”
    link rel=”alternate” href=”” hreflang=”ar”
    link rel=”alternate” href=”” hreflang=”en-ae”
    link rel=”alternate” href=”” hreflang=”ar-ae”
    link rel=”alternate” href=”” hreflang=”en-sa”
    link rel=”alternate” href=”” hreflang=”ar-sa”

    ALTERNATE:, with below tags:

    link rel=”canonical” href=””
    link rel=”alternate” href=”” hreflang=”en”
    link rel=”alternate” href=”” hreflang=”ar”
    link rel=”alternate” href=”” hreflang=”en-ae”
    link rel=”alternate” href=”” hreflang=”ar-ae”
    link rel=”alternate” href=”” hreflang=”en-sa”
    link rel=”alternate” href=”” hreflang=”ar-sa”

    Can you please help in understanding where we are wrong and what to do?

  • Guncel says:

    Can u give an example about these;

    How should i use hreflang and canonical tags if i prefer an subdomain ?

    just like …

    • Eoghan Henn says:

      Hello Güncel,

      the use of a subdomain does not really change the way you use hreflang annotations and canonical tags. Both are implemented on a URL level and it does not matter which subdomain or directory the different URLs are located in.

      Feel free to ask a more specific question if anything remains unclear.

      Best regards,


  • Richard Hearne says:

    Nice post, however this always optimal. In cases where you have the same language and multiple locales it’s perfectly good to point the canonical to one version of each particular page group, e.g. <- EN <- EN-US <- EN-UK

    Each page in the group must reference the other in hreflang, but all pages in group can be canonicalised to a single URL, e.g. /en-page. If you add other languages to the group those localised pages should self-caonicalise, but you can still keep the EN variants canonicalised to just one URL.

    You'll find it works a treat if properly set up.

    • Eoghan Henn says:

      Hello Richard,

      Thanks a lot for sharing your experience with the setup you described. I’m happy this worked out for you! Nevertheless, I would not recommend replicating this setup on other pages. Let me explain.

      With the setup you describe, you send confusing signals to Google. The hreflang annotations between the three pages in your example ask Google to index all three alternative versions and decide which one to show to each user based on the user’s location or language. The canonical tag that points from all versions of the URL to one version, on the other hand, asks Google NOT to show any of the versions except for the canonical one to any user.

      When you send confusing signals to Google, you force Google to decide on its own which signals to use and which to ignore. In your case, the hreflang setup works because Google ignores your canonical tags. Canonical tags are always just a suggestion for Google and never a directive and they are often ignored when other strong signals contradict the canonical tags.

      I hope this helps!

      Best regards,


      • Richard Hearne says:

        Hi Eoghan

        I’m not sure if you have tested this yourself, but here’s a post from a few years back where someone set up quite a robust test. Sadly their test domain is no longer active, but their results are still quite valid:

        FWIW I have used the exact set-up for clients and the results have always been as I expected – Google is happy to combine HREFLANG and canonicalisation of duplicated content without any problems. From experience I can tell you that Google is accepting both signals as requested, and is not ignoring canonicals or HREFLANG.

        Hope this helps

        • Eoghan Henn says:

          Hello Richard,

          Thanks a lot for your reply.

          I believe that we have different perceptions of the signals that hreflang annotations and canonical tags send.

          Which role do the canonical tags play in your setup? From my point of view, a canonical tag asks Google to show the URL it points to instead of the URL it is placed on to all users. Do we agree here or do you have a different opinion on this?

          hreflang annotations, on the other hand, send a different kind of signal. They ask Google to show one URL to a certain group of users and another URL to another group of users.

          The case study you shared does not clear this up either. It does not mention which role the canonical tags play in this kind of setup. I believe that in the case described in the case study, just like in the cases you have observed, the canonical tags are simply ignored by Google. Why do you claim that Google is accepting both signals as requested? What is the role of the canonical tags here and how is Google interpreting them?

          I am looking forward to hearing your thoughts on this.

          Best regards,


  • Jordi says:

    Hi Eoghan

    Thanks for putting some light on this topic. We have much more clear how to deal with hreflang and canonical thanks to this post. We’d appreciate though to know your opinion on the following doubts that we still have:

    In our user generated pages one topic is written in a single language but we have the site translated to 22 languages and 22 subdomains or, and so on.

    If a user writes a topic in English, then each of the 22 translated pages (chrome is translated, the user content is only in the user’s language) we’ll put the 22 hreflangs one for every language:

    … (etc…)

    Should we indicate that the content is only written in say English in some way? If so, what would you recommend to do it properly?

    We see two possible options:

    Adding a “canonical” to indicate that the content is only in English:

    or adding a an “x-default” hreflang for the English version:

    Or both? What do you recommend in this case?

    Thanks in advance for your extra help on this subject


    • Eoghan Henn says:

      Hello Jordi,

      Thanks a lot for your comment. Unfortunately, my website swallowed your hreflang code examples. I am very sorry about that! Still, I understand your comment without the examples, so here we go:

      I think that the problem you describe cannot be solved with canonical tags or hreflang annotations.

      Let’s talk about the two options you suggested first.

      Option 1: Adding a canonical tag to the language version the user-generated content is written in.
      It is never a good idea to use a canonical tag across language versions. If you have several language versions, you want Google to be able to show the right language version to each user. This is what hreflang annotations are for. Canonical tags across language versions, on the other hand, would have a different effect: Only the canonical version would be indexed and displayed to users. Google also recommends not to use canonical tags across language versions here:

      Option 2: Adding the x-default value to the version the user-generated content is written in.
      This would only mean that you want this version to show to all users that there is no language version specified to. So if a user uses Google in a language that is not covered by your 22 versions, this would be the default version displayed to this user. I do not think this is the solution you are looking for.

      So what does this mean for your hreflang annotations?
      For now, I would not change anything and leave the hreflang annotations the way you described it first: Each URL gets the correct hreflang value for the language version/subdomain it belongs to.

      Now the actual problem is that you are mixing languages within pages and this will most likely send confusing signals to Google. Why would you even want to do this? Also, it is not really user-friendly to show content in the “wrong” language.

      Here are some suggestions:

      – You could decide to only show user-generated content in the correct language version. This would obviously mean that you would have less content in the other language versions, but from an SEO point of view this would help you rather than harm you: You will not get traffic for, let’s say, Spanish search queries anyhow with German, French or English content. And also, for most users, content in the “wrong” language will rather harm than help you.
      – Another option that might work would be to translate the user-generated content. This would obviously cost a lot of money if you did it manually, but maybe you can find a solution to it automatically. Tripadvisor, for example, does it automatically, and although it is not a perfect solution, it looks like it does work for them.

      I hope this helps and feel free to let me know if you have any other questions!


      • Jordi says:

        Many thanks Eoghan for your insights on the subject. We really appreciate it and we’re going to proceed as you suggest avoiding the use of ‘canonical’ since thanks to your explanation we now see it is not intended for our case.

  • Maria says:

    hi Eoghan,

    Thanks for the article! Just a quick question on Hreflang tags. If I have 2 domains in Spanish (one for Spain and another one for Mexico)
    And they have the same or very similar content. The question is: How do I implement hreflang?
    Is adding these tags in these pages a correct way? Also, do I need to do this on a page level, I mean page by page or is it ok if only the homepage has it? will have the following tag: will have the following tag:

    It would be great if you could help out.

    • Eoghan Henn says:

      Hi Pilar,

      Thanks a lot for your comment!

      Unfortunately, your code examples don’t show in your comment. This is my fault, because I haven’t had time to fix this problem in WordPress 🙁 I’ll take care of it soon!

      Anyhow, to answer your questions: If you implement hreflang only for your home pages, it will only work for your home pages. hreflang is a page-level annotation, so if you want it to work for all pages of your websites, you need to implement it on a page level.

      I will send you an e-mail now so that you can send me your code examples again 🙂


  • Carlo says:

    That’s a very well written article! Thanx a lot for it!
    Now I have got a more clear idea about hreflang and canonical!

    Anyway I really wanted to go a little bit deeper with a classical e-commerce situation (nobody on the web talks about the correct implementation of this):

    Let’s suppose this example of category:

    Page 1)
    Page 2)
    Page 3)
    Page 4)

    In wich /category and /category?View=1 are exactly the same (?View=1 exists only for a complete use of URL’s and to not obtain a broken page)

    And let’s suppose I have got both .it and .de domains….

    What is the right way to implement tags?
    I know Google says that in some case you can index the ALL page, but in my case the ALL page is too long and it needs too much time to load…. so I don’t want it to be the canonical page.

    I was thinking about something like the following:

    Page 1)
    meta name=”robots” content=”index,follow”
    link rel=”alternate” hreflang=”it” href=””
    link rel=”alternate” hreflang=”de” href=””
    link rel=”canonical” href=”
    link rel=”next” href=”″

    “Hey Google, I want to be indexed and this is my cousin from Germany. Oh, I’m the first page of a list and ?View=2 comes after me”

    Page 2)
    link rel=”canonical” href=”

    “Hey Google, I dont want to be indexed, please index my twin brother”

    Page 3)
    meta name=”robots” content=”index,follow”
    link rel=”alternate” hreflang=”it” href=”″
    link rel=”alternate” hreflang=”de” href=”″
    link rel=”prev” href=””

    “Hey Google I want to be indexed and this is my cousin from Germany. Oh, I’m the last page of a list and /category comes before me”

    Page 4)
    link rel=”canonical” href=”

    “Hey Google, I dont want to be indexed, please index my twin brother”

    Is this the correct way? Or one of the possible correct ways?

    • Eoghan Henn says:

      Hello Carlo,

      Thanks a lot for your comment and for sharing your interesting problem.

      Everything you say makes sense and I do not see any problems with your use of hreflang and canonical tags.

      The only thing I’m wondering about is whether it’s a good idea to have page 4 point to page 1 via a canonical tag. Normally, when you use a canonical tag, the content of the page that has the canonical tag should be fully included on the page it is pointing to. This would not be the case here.

      I suggest you test the implementation you described to see whether Google will follow or ignore your recommendation (i.e. you canonical tag).

      Let us know how it goes!

      • Carlo says:

        Thank you very much for the answer and your time.
        I will test this so we can see if the canonical tag of page 4 is right o wrong….only Google knows 🙂

  • Charlotte says:

    Hi Eoghan,

    Thank you for a very interesting and well written article. I truly enjoyed reading it, as well as the questions and answers below it 🙂

    Unfortunately, I’m a little confused as to what to do in my situation so I hope you can point me in the right direction.

    I have a website in the following markets: UK, US, Norway, Sweden, and Denmark (so 5 websites in total). The content on these websites are almost identical, and I have therefore added hreflang tags on all pages to avoid confusing Google with duplicate content.

    The problem is this: the products, that are the same for each website, come in regular size, travelsize and supersize, and all of these sizes have their own product page, which contains the exact same content. In other words, the structure looks somewhat like this:

    Individual product page 1: Product A Regular Size
    Individual product page 2: Product A Travel Size
    Individual product page 3: Product A Supersize

    Individual product page 4: Product B Regular Size
    Individual product page 5: Product B Travel Size
    Individual product page 6: Product B Supersize

    All of these pages contain identical content and they are all indexed, which, in other words sums up to A LOT of duplicate content within each of my 5 websites.

    I have a feeling that this isn’t very beneficial for my rankings, and I therefore want to clean up the structure a bit. I basically want Google to only pay attention to the Regular Size product pages, as this is where I want the traffic to end up.

    As a result, I was thinking of adding canonical tags to each Travel Size and Supersize product page, pointing to the Regular Size product page to show Google that this is the page I want it to pay attention to. However, since these pages now has a hreflang tag on them, I’m guessing that adding a canonical tag can confuse Google even more. How do I solve this? Do I have to remove the hreflang tags from the travelsize and supersize product page on each website and add a canonical tag to them instead? I would be truly grateful if you could provide me with some advice as to what the right approach would be.

    Many thanks for the article and any help would be greatly appreciated.

    • Eoghan Henn says:

      Hello Charlotte,

      Thanks a lot for your comment. I’m glad you enjoyed the article.

      You have already come up with the right solution yourself 🙂 If you want only the pages for one size per product to be indexed, you can include canonical tags on the other sizes that point to the URL of the size you want to be indexed. You should indeed remove the hreflang tags from the URLs that have canonical tags pointing to other URLs.

      Please just let me know if you have any further questions!

  • Tom says:

    Hello Eoghan,

    many thanks for your explanation. Now my programmer has added the Canonical and the duplicate content indeed goes down. guess it will take some more weeks to clear this in GSC.
    Because of some programming challenges he just could add the canonical to all pages and not distinguish between cat1 and cat to place different tags like you explained (cat1: hreflang + optional canonical and cat2: canonical only)
    Thats now cause rising hreflang errors in GSC, because the missing pointing to itself.
    Exactly as you mentioned it.

    Concerning your last item: de or de-DE.
    We have chosen “de” because we want to address other Geman speaking countries like Austria and Switzerland.
    So still confused if we should change to de-DE to get more visitors also from AT or CH.
    Could you give short recommendation in this?
    I really appreciate the time you spend for helping.

    • Eoghan Henn says:

      Hi Tom,

      Google strongly associates ccTLDs (country-specific domains like .de, .at, .ch, etc.) with the countries they stand for. You can verify this by going to the Google Search Console property for your .de domain and navigating to “Search Traffic > International Targeting > Country”. Here, the country will be set to “Germany” and you will not be able to change this.

      What does this mean for your hreflang annotations? On a .de domain, there will be no real difference between marking up a website version as “de” or “de-de”. The country association is already incorporated into the domain. Your German content on a .de domain will always be “de-de”, so to say.

      Now, of course a .de domain can rank in Austria and Switzerland (many do), but if you really want to be successful in those countries, a .de domain is not the right choice. Not from an SEO perspective and certainly not from a Swiss or Austrian user’s perspective. In general, I strongly believe that international websites should use gTLDs (generic, non-country domains such as .com).

      This doesn’t mean that I recommend that you change your domain. This would be a big change and it might not be worth the effort and risk. I would just like to make clear that a .de domain is not really suited for good performance in AT & CH and that marking your content up as “de” instead of “de-de” will not change this.

      If you have any further questions, please don’t hesitate 🙂


  • Tom says:

    Hello Eoghan,

    great to have found this thread with very interesting information.
    Seems that the usage of hreflang and canonical can be so much different.
    Actually I have not found the right configuration for my website yet although lots of expert told me how to do.
    Explanation sometimes is very confusing therefore I am using examples in detail.
    Would you be so kind to check this and in case something still is wrong, to please show me the correct code also as example.

    I try to describe my situation and experience which I already have made. Guess some more are interested in.
    My situation and need:
    I am running an online shop in two languages. And products are available and linked internally in different categories with the result of different urls, but same content for each language.
    Example for the german product (named produktname1 in two different categories)

    Same for English product description with /en/ in url and English names

    So the demand is
    a) To tell google about the 2 different languages
    b) To tell google that the 2 urls for this product shows the same and to prevent duplicate content

    Expert group one told me use hreflang only:

    link rel=”alternate” href=”” hreflang=”x-default” /
    link rel=”alternate” href=”” hreflang=”de” /
    link rel=”alternate” href=”” hreflang=”en” /
    These code has been implemented in all these four URLs above.
    They explained that google can understand that because all tags show all time the same big brother for English and German page.
    No canonical required.

    Google Search Console showed me endless duplicate content for meta and title within two weeks 

    So I have contacted other experts. They told me to use canonical only. What a nonsense.
    After long research in internet. Yes both must be used, but how?
    – Canonical only on the canonical pages and hreflang on the “big brother”-pages?
    – Combination of both on all pages? If yes, what is the right code.

    Expert group two suggested this and at the moment we do like this:

    On the 2 German pages we put this code:
    link rel=”alternate” href=”” hreflang=”x-default” /
    link rel=”alternate” href=”” hreflang=”de” /
    link rel=”alternate” href=”” hreflang=”en” /
    link rel=”canonical” href=”” /

    And on the 2 English page it is this:
    link rel=”alternate” href=”” hreflang=”x-default” /
    link rel=”alternate” href=”” hreflang=”de” /
    link rel=”alternate” href=”” hreflang=”en” /
    link rel=”canonical” href=” ” /

    And according to these examples for all other categories and productnames.
    So we use hreflang and caonical now.

    Actually I do not know, what google search console will say. Results in changes take long time. Still I am not sure about the correct code.
    Therefore it would be great you could confirm this configuration or help to find the right setup.
    Many Thanks.

    • Eoghan Henn says:

      Hello Tom,

      Thank you for your comment and your interesting question. Here is what I would recommend:

      First of all, let’s talk about the canonical tags. You only want the URL of the product in the first category to be shown in the search results, so the other version (in the second category) should have a canonical tag pointing to the first version (in the first category). Optionally, the URL in the first category can have a canonical tag pointing to itself, but this is not required.

      Now the hreflang tags should only be used on URLs that you want to be shown in the search results. Why is this so? > hreflang annotations always require a link pointing to the URL itself, and they also require reciprocal links, so the linked pages have to link back via hreflang. Also, hreflang annotations that link to a page (be it a different page or the page itself) automatically ask for this page to be indexed. In this sense, they have a function that is very similar to that of canonical tags.

      All of this entails that a URL that has a canonical tag pointing to another URL should not have any hreflang annotations at all.

      So, in your example, the pages in the second category do not get any hreflang annotations.

      Here’s the hreflang code for the German and English version of the product page in the first category:

      link rel="alternate" href="" hreflang="de">
      link rel="alternate" href="" hreflang="en">

      Optionally, you can add "x-default" for the English version (like in your example) and the self-referencing canonical tag to each of the URLs.

      The URLs in the second category only get the canonical tag pointing to their equivalents in the first category and no hreflang annotations.

      I hope this helps!

      One last remark: If you use a .de domain, strictly speaking, your hreflang values should always include the "DE" country code. You should be using "en-DE" and "de-DE" instead of "en" and "de". This is because Google automatically associates .de domains with users in Germany, so using "en" and "de" in hreflang annontations on a .de domain automatically means "en-DE" and de-DE".

      Let me know if anything remains unclear.

  • Pedro says:

    Hi Eoghan – great post! 😉

    Just a couple questions.

    1) If I want to implement the hreflang but not necessarily have a “big brother” to be indexed (I want each to be a big brother in their own country). Is the canonical mandatory for the hreflang to work correctly? I read on a Google webmasters blog post (from 2012) that they no longer advise the canonical and recommend not to use it for the sake of a more simple implementation.

    2) If I am to put the self-referencing canonical on one site along with the hreflangs tags. I still need to add hreflangs on the other sites but do I need to have a self-referencing canonical on them as well?

    Many thanks in advance.

    • Eoghan Henn says:

      Hello Pedro,

      Thanks a lot for your comment. Here are my answers to your questions:

      1) hreflang works absolutely independently from canonical tags, so you so not need canonical tags in order to make hreflang work correctly. In fact, the self-referencing hreflang tag has a very similar function to the self-referencing canonical tag and basically makes the self-referencing canonical tag unnecessary.
      2) If you have a self-referencing canonical tag and hreflang tags on one URL, this does not mean that you need self-referencing canonical tags on the other versions of this URL that you link to with hreflang. You can have two or more URLs that link to each other with hreflang, but only one of them pointing to itself with a canonical tag.

      I hope this helps!

  • Sanela says:

    This are tags I find when I open the site in Italian version (homepage):

    This are tags I find when I open the site in English version (homepage):

    Sorry, I try in this way…

    • Eoghan Henn says:

      Hello Sanela,

      I am sorry you had problems with inserting code examples into the comments. I will work on the comment function of this website. You can send me your questions via email and I will have a look at your problem.

      Best regards,


  • Sanela says:

    Hello, thank you for your post. But I still haven’t understand…
    So, in this case, is correct?

    This are tags I find when I open the site in Italian version (homepage):

    This are tags I find when I open the site in English version (homepage):

    The same for other pages (category, products, CMS….)
    Thank you

  • Kara Shapiro says:

    Great article! I have a question in the opposite direction. I have a site that is only available in English (USA). I just received a notice from Google: “Incorrect hreflang implementation on…” but am using WordPress. This is automatically and dynamically programmed. Do you know if this is something that is detrimental to a site or can we simple ignore it. Or, do you know how to remove that feature that’s adding it?

    • Eoghan Henn says:

      Hello Kara,

      I guess this is nothing you have to worry about. Incorrect hreflang implementations are ignored by Google anyhow.

      On the other hand, the less you confuse Google, the better. If you like you can send me the domain of your website and I will have a quick look to try to figure out where the hreflang annotations are coming from and how you can remove them.

  • Derek says:

    We have a situation very similar to the previous couple comments. We have content in multiple regions and languages. For the most part, the content for any given language is mostly identical i.e. English / North America is pretty much the same as English / Europe. For that reason, we have set our robots.txt to only allow crawling of 1 region per language thinking that we did not want similar pages competing with each other in Google. But then we also setup full hreflang entries for each url for every country / language combination we care about using the sitemap. Of course, we only have urls in the sitemap for the language / region combinations that we have chosen to be indexed. That has resulted in errors from Google Search console about hreflang entries that do not have return tags because they are pointing to pages that we have prohibited via our robots.txt and are not in the sitemap. Based on your great article, my thinking is that we should change our robots.txt to no longer prevent any of these pages from being indexed and add all of these to the sitemap with the full hreflang entries. Having all pages setup correctly with hreflang entries should take care of the pages competing with each other in Google because Google will realize they are for different audiences and sort them out appropriately. Is my line of thinking on this correct?

    • Eoghan Henn says:

      Hello Derek, thanks a lot for your comment. I fully agree with your thinking here.

      It would be a good idea to have all the different region versions indexed, especially because you would want users to land on the right region version straight away when they find your website in Google, right? if you only have one region version indexed, a big part of your visitors from organic search will always land on the wrong content.

      With hreflang set up correctly you can eliminate any problems related to different versions competing for rankings. From what I can see, your hreflang structure might end up being a bit complex, but I’d be happy to help if you encounter any problems or if you have any questions.

      Check out this article about assigning more than one country value to a URL: You will need a structure like this if you have website versions for groups of countries like Europe, North America, and so on.

      Let me know if there is anything else I can help you with!

      • Derek White says:

        Thanks for the response Eoghan! After investigating some of the webmaster tools warnings more, I can’t find anything wrong with them. They all seem to have the correct hreflang entries (both directions) and they don’t seem to be blocked by robots.txt. Have you heard of Webmaster tools incorrectly giving the “no return tags (sitemaps)” warning? The only thing I can think of is that we have our sitemap structured so that each language / region / industry is in its own file. Is it possible that it is processing 1 file and finding missing return tags because it hasn’t yet processed the other files?

        • Eoghan Henn says:

          Hi Derek,

          Yes, the hreflang error messages in Google Search Console are often irrelevant and misleading.

          Google often has issues with hreflang annotations in sitemaps. I would normally recommend to implement hreflang in the head section of the source code of each page. As far as I know, these problems are caused by the fact that sitemaps are crawled and processed less frequently than website URLs, which can cause errors like the ones you describe (you already assumed it in your last sentence).

          What I would recommend is not to pay too much attention to the error messages in Google Search Console and rather check to see if the right version of your content is displayed in different countries and for users of different languages. You can use the “search analysis” report in Google Search Console (apply country filters), or you can use SEO tools that collect ranking data, like Sistrix or Searchmetrics. You can also check your organic traffic from different countries in Google Analytics to see if users are entering through the correct landing pages.

          I hope this helps!

  • Jörg says:

    Hey Eoghan.

    I was busy with my classes and only just had time to reply.

    I am not totally sure if the current implementation is correct, but I dont think that the internal implementation, the linking structure or contradicting signals are the real issue.

    We already have identified one problem we had with our previous sitemap. The submitted Sitemap only had Short-URLs, that were a redirect to the long version and didn’t include hreflang tags.
    We then uploaded a testsitemap with …en-ww and then all the other languages and regions as hreflang with rel=alternate. We had like 10 of these and although all of them are identical from the setup the indexing worked quite differently. There were pages with 100 indexed from 300 but others where only 6 from 300 were indexed.

    All of these factors and research led to our canonical idea. Do you have a source that the case study I mentioned is not working anymore the way we would like it.
    Additionally I think I have misinterpreted the Image from your article. I thought the pages on the bottom are the canonicals and should not have hreflang tags to the other canonical. But I just saw the Canonicals are pointing to the both pages above. If I would use our canonicals to this image, the top 2 pages would be de-ww and en-ww and the pages on the bottom would be de-de and en-de. De-ww would point to en-wwh hreflang but de-de would not point to en-de.

    A google search with shows over 3 Million pages. The Webmaster Tools show 2 totally different numbers though. If we check Google Index -> Index Status it says over 6 Million, but if we look at Crawl -> Sitemaps it only says a little over 70 000. I am not sure what I should think about this.

    I like to hear your further opinion.


    • Eoghan Henn says:

      Hello Jörg,

      About the case study: I said it was “out of date” because I didn’t want to be too harsh. I should have just said that it is wrong. The implementation used in the described case is contrary to what Google recommends (see here) and shows a lack of understanding of the signals canonical tags and hreflang annotations send (see the article above). The reason the results in the case study were positive is probably that Google simply ignored the canonical tags, as it does in so many cases where signals are mixed. Here’s another case from a couple of years ago where Google ignored canonical tags in favour of hreflang annotations (text in German): SEO-Schnick-Schnack-Schnuck.

      If you like, we can continue this discussion via e-mail so you can share more details about your page with me. I am not sure if I can help you any further without knowing which page we are talking about 😉

  • Jörg says:

    Hello Eoghan,

    I am a student in Germany and at the moment working as an intern for a company that is trying to rework their SEO strategy. I tried to come up with ideas but am not totally sure if my thinking is correct.

    We have a lot of Product Information Pages that all should be indexed by Google. All of them are available in 6 languages and about 150 regions. The region pages in the same language itself do not differ from other pages in the same language, i.e. de-ww is identical to de-at or de-de.
    So our plan was to implement canonical tags for the international websites and then have all the other languages and regions as hreflang Tags available.

    en-ww is the standard page for English international users
    de-ww is the standard page for German international users
    en-uk is the English page for UK users (but identical to en-ww)

    We have a canonical tag on every en page referring to en-ww. (en-uk & en-de to en-ww)
    We have a canonical tag on every de page referring to de-ww. (de-de & de-uk to de-ww)
    We have hreflang tags from en-ww to en-uk, to en-de and also to de-ww (de-ww is the canonical link for german content).
    We have hreflang tags from de-ww to de-at, de-ch and en-ww (en-ww is the canonical link for English content).
    We have hreflang tags from en-uk to en-de and vice versa.
    We have hreflang tags from de-de to de-at and vice versa.

    Do we need href lang from en-uk to de-uk or (same content but different language/region)
    Do we need href lang from de-ww to en-uk (from the canonical page to another language that is not the canonical link)

    If I understand your article correctly we should not have hreflang tags from en-ww to de-ww because this will send mixed signals to Google. But what do you think about the rest.
    And if this would be a possible solution how would a sitemap look like. Should it only contain the canonical URLs or is it important to have all other 150 hreflang links also in there.

    Thanks for this article and help would be greatly appreciated.

    • Eoghan Henn says:

      Hello Jörg,

      Thanks a lot for your comment and your interesting questions.

      First of all, I would NOT recommend having canonical tags that point from one language/region version to another. So you should NOT use canonical tags that point from en-uk to en-ww etc.

      You want users in the UK to see the UK version in the search results and users in Switzerland to see a version for Switzerland in French, German or Italian, right? If you use canonical tags on these pages that point to a ww-version, these region pages will not be indexed and users will only see the ww-versions in search results.

      So, first of all, get rid of these canonical tags! What you need to do here is to link all versions of one page with hreflang tags. So the en-uk version, for example, will have hreflang annotations pointing at all the other versions that exist of this page (in all languages and for all regions).

      Here’s a nice example of a similar hreflang implementation that I came across this week: Yours would look similar, just with far more different version.

      Concerning your question about the sitemap: All of the URLs should be in there, but it makes sense to create one sitemap per language/country version and then link to the different sitemaps from a sitemap index file. Here’s a good example for that:

      I hope this helps! Please let me know if you have any further questions.


      • Jörg says:

        Hi Eoghan,

        first of all thank you for your fast answer.

        At the moment everything is handled the way you are suggesting with 150 hreflangs per page. And with that implementation we are not 100% satisfied with the ranking of the pages in the Google result pages and the regionalization. That is the reason we are trying to change something on the page and came to canonical links.

        Another reason we were trying to go for canonicals is the bad indexation rate when looking through Webmaster Tools. Our Sitemape pretty much has 40000 links in it and not 2000 are indexed.

        Our goal is pretty much what you described. Give an english talking person from Switzerland en-ch, give the german talking person de-ch and the french talking person fr-ch.

        So our mindset was that google just indexes the 6 main URL (de-ww, en-ww, fr-ww…) sees the hreflang on these pages (de-de, de-ch or en-de, en-it …) and then gives the user the correct result based on the internal process done by google (IP-adress, language of search terms, etc).

        I found following test online and I thought this could work for us as well:

        He is only doing it for 1 language and multiple regions. So we were like thinking to do this exact thing for all 6 languages. If I understand that test correctly they also tested the search engine with proxys, real searches from other countries and they got exactly the correct URL, depending on their location.
        This would also reduce the number of indexed links by a lot and still help the regionalization.

        Am I wrong with that idea. What would you suggest to have better search results after knowing we already have the hreflang implemented.

        Greetings and I am looking for your answer


        • Eoghan Henn says:

          Hi Jörg! Thanks for the additional information. Here are my remarks:

          It’s great news that you already have the hreflang solution implemented. If the results are not satisfying yet, I would recommend looking for errors in the implementation or contradicting signals you are sending in other places. Are you using the internationalisation settings in Google Search Console to send additional signals to Google? Is the content on your pages in the actual language the hreflang annotations say it is? Do you have a clear internal linking structure?

          If only 2000 URLs out of the 40000 you submitted in your sitemap are indexed, it looks like you might have other technical problems that are not related to hreflang and internationalisation. Are your URLs available with and without https, with and without www, with and without trailing slashs or something similar? How many URLs do you have and how many are indexed in total (do a search in Google)? How many URLs are supposed to be indexed?

          Pointing from one language or region version to another with canonical tags is NOT an option if you want all language versions to be indexed and shown to the right users in the right places.

          The case study you linked to is very interesting, but I’m afraid it’s slightly out of date. Again: Canonical tags should not point from one language or country version to another.

          The solution you have a the moment is the right one, as far as I can tell. You should find out why it’s not working for you yet instead of changing it completely. I would be happy to help you look for problems if you provide me with more information.

          Best regards,


  • Jaap says:

    Thank you Eoghan, I will try the multiple hrelang approach (without x-default) and monitor if Google will indeed show us in the search results for each of those targeted countries. Thank you for this great advice!

  • Jaap says:

    Let’s say there are 3 versions, two of them are an exact duplicate in english, the 3rd is in italian. The first should target Europe (unfortunately there is no region tag), the second should target the world. If I would want the Europe version to be THE ONE AND ONLY for english, should the 1st link be canonical when you visit either the Europe version OR the world version? And when you visit the italian version, would the 3rd link then become the canonical (for italian) or would all of them be alternate because there is no other italian version anyway?

    Your article is really funny 😉

    • Jaap says:

      Unfortunately my hreflang examples could not enter my questions. The 1st hreflang would be the one for europe, the 2nd for world, the 3rd for italian.

      • Eoghan Henn says:

        Hello Jaap,

        Thanks a lot for your comment. I’m glad you enjoyed reading this article. Sorry about the trouble with inserting code examples into the comments. I’ll have to work on that.

        You are right, there is no region tag for Europe, but I recently learnt from John Mueller that you can assign several country values to one URL. Read about it here:

        I think you should definitely try this out! Just mark up your worldwide English version as “en”, your Italian version as “it”, and your European version with one hreflang tag per country you target (“en-gb”, “en-ie”, “en-nl”, etc., just like in the example in the article I linked to above). I am really curious to see the results of this. Let me know if you need a hand getting the hreflang implementation right.

        By the way, I would generelly NOT recommend using canonical tags between language versions.

        Talk soon,


  • Christo says:

    Absoltutely PERFECT. Thank you SO much! I really appreciate your quick and thoughful answer.

  • Christo says:

    Wow. This is SO well done. Thanks very much for putting this together. So well done. so funny.

    (Please note that I mistakenly posted this here: – please delete that. Sorry 🙁 )

    Now back to the topic ;). I have a follow-up question if you don’t mind:

    Let’s say I’m a business in Miami, FL USA and the population in that DMA speaks an almost equal mix of English and Spanish. For each of my main SEO focused landing pages I have an English and a Spanish version. I would assume that Spanish speaking users go to as their default search.

    In this case, I want Google to index both English and Spanish version (without penalty) AND of course I want the users to be directed to the correct page by Google.

    So, can you please confirm that the following is the best approach for being cool with Google for indexing (and no penalties) AND proper user of hreflang?

    1) I should have NO canonical tags since I want Google to love me AND my brother when searching from the Miami area via the english OR spanish versions of the Google search page (noting that oftent spanish users use spanish searches in the English version of Google and vice versa, since they are bi-lingual).
    2) The hreflang tags should look like the following on both the English and the Spanish version of the pages:

    Do you agree? Or do you have any corrections / insights?

    Thanks again for such an awesome post!

    • Eoghan Henn says:

      Hi Christo! Thanks for your comment and your kind words. I deleted that other version of your comment that you left on the other article 🙂

      About your question: Yes, you did everything just right!

      Some remarks:

      The “-us” part is optional, you could just mark up your English version as “en” and your Spanish version as “es” (to also reach users outside of the US), but if you are only targeting users in your region, then it is fine this way. Have you set your Google Search Console setting to “Target users in: United States”? You find this setting under Search Traffic > International Targeting > Country and it is a good idea to have it aligned with the signals you send in your hreflang annotations.

      About the users that search in Spanish on the English version of and vice versa… Google will figure this out for you. If a user enters a search query that would be the same in either language (like your business name, for example), he or she will see your result in the language that they are using Google in. If Google, on the other hand, can detect the language of the search query, this will normally override the language of the Google version the user is on and show results in the language of the search query. So, if you search for, let’s say, “comprar coche segunda mano” on the English version of Google, you will see Spanish results. Your hreflang annotations will help Google figure this out, obviously.

      I hope this helps!


  • PCT says:

    Most clear info regarding canonical and hreflang by far, very useful for me as I’ve had trouble on how to implement those two at the same time. Think I’ve got it right now! 🙂

  • JD says:

    Hi Eoghan, This is definitely the funniest explanation of using canonicals & hreflang’s that I’ve seen. Well done. Makes perfect sense too!

  • Adam says:

    Loved the article, Eoghan. We just launched a Spanish language version of our homepage and I was having trouble deciding whether to canonical or not canonical the Spanish version.

    Your article made things very clear and was quite funny. I LOLed several times. 😛 Thanks for the help and doing so in a humorous way!

  • Ryan says:

    Hey Eoghan, I’ve got a site and want to duplicate the content onto an .ie site with slight variations in regards to location, sponsors etc

    Do I need a canonical tag or would the hreflang tag suffice?


    Is this a situation where I would need both a canonical tag and a hreflang tag?

    I want them both to be indexed and display in the correct SERPS but I don’t want to be penalized for duplicate content

    There is conflicting advise out there and Google are saying they no longer recommend using rel=canonical.

    Thanks in advance for your help

    • Eoghan Henn says:

      Hi Ryan! You will need to link your and .ie versions with hreflang annotations. Here is some additional info on how to get your hreflang annotations right, although not all of it will be applicable to your case:

      It is NOT ADVISABLE to have canonical tags pointing from one country version to the other. If you had, let’s say, a canonical tag pointing from the .ie home page to the home page, you would be asking Google not to index the .ie home page, and to index the home page instead. But this is not what you want! You want users in Ireland to see your .ie pages in the SERPs. This is where the hreflang annotations come in handy. By linking the .ie and the pages with hreflang, you ask Google to show the .ie pages to Irish users and the pages to British users.

      Here’s what your hreflang annotations on the home pages of both country versions would look like (both lines on both versions!):

      link rel="alternate" href="" hreflang="en-gb">

      link rel="alternate" href="" hreflang="en-ie">

      And here's an example for another page. The annotations have to be implemented on page level:

      link rel="alternate" href="" hreflang="en-gb">

      link rel="alternate" href="" hreflang="en-ie">

      I hope this helps! If you have any more questions, I will be happy to follow up on this.

Leave a Reply