How to use hreflang and canonical tags together

Last updated on Jul 12, 2015

When you use hreflang tags 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 tags when you already have a canonical tag solution on your website.

hreflang and canonical tags both have similar functions: They suggest to Google which URLs to index. If you already have a canonical tag solution on your website, which asks Google not to implement certain URLs, and you then add hreflang tags to all of your URLs, you will confuse Google. You will be asking Google to index and not to index certain URLs at the same time.

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 ignore your instructions. So make sure your URLs know what they want!

hreflang-canonical

Conclusion

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.

Say thanks by sharing this:

88 Comments

  1. Husain
    17. July 2017

    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:
    https://www.zawya.com/uae/en/company/Ahramat_Engineering__Trading_Company-11025474/

    For audiences coming from Saudi Arabia:
    https://www.zawya.com/saudi-arabia/en/company/Ahramat_Engineering__Trading_Company-11025474/

    For audiences coming from rest of the world (we use this as our canonical for the above):
    https://www.zawya.com/mena/en/company/Ahramat_Engineering__Trading_Company-11025474/

    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.

    Reply
    • Eoghan Henn
      17. July 2017

      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!

      Eoghan

      Reply
      • Husain
        17. July 2017

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

        Reply
  2. buisine
    12. July 2017

    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
    https://www.dramisintl.com/en/index.php
    https://www.dramisintl.com/es/index.php
    https://www.dramisintl.com/fr/index.php

    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
    english

    french:

    spanishl:

    Could you please help me ?

    Reply
    • Eoghan Henn
      13. July 2017

      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:

      https://www.dramisintl.com/en/index.php > https://www.dramisintl.com/en/

      https://www.dramisintl.com/es/index.php > https://www.dramisintl.com/es/

      https://www.dramisintl.com/fr/index.php > https://www.dramisintl.com/fr/

      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=”https://www.dramisintl.com/en/”>
      <link rel=”alternate” hreflang=”fr-ca” href=”https://www.dramisintl.com/fr/”>
      <link rel=”alternate” hreflang=”es” href=”https://www.dramisintl.com/es/”>

      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=”https://www.dramisintl.com/en/about.php”>
      <link rel=”alternate” hreflang=”fr-ca” href=”https://www.dramisintl.com/fr/a-propos.php”>
      <link rel=”alternate” hreflang=”es” href=”https://www.dramisintl.com/es/acerca-de.php”>

      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.

      Reply
      • buisine
        17. July 2017

        Thank you Eoghan for your help, i will transfer your answer to our webmaster.

        Reply
  3. Göran Lindholm
    19. June 2017

    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?

    Reply
    • Eoghan Henn
      19. June 2017

      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.

      Eoghan

      Reply
  4. Nish
    25. May 2017

    Hello Eoghan,

    Great piece of content, have just one query:

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

    All my product pages have url as https://www.example.com/in/products/home-decor/blue-lampshade.html (Breadcrumb URL’s created) with canonical tags on https://www.example.com/in/blue-lampshade.html (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.

    Reply
    • Eoghan Henn
      26. May 2017

      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.

      Eoghan

      Reply
      • Nish
        29. May 2017

        Thank you Eoghan.

        Reply
      • Nish
        29. May 2017

        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?

        Reply
        • Eoghan Henn
          29. May 2017

          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: https://www.rebelytics.com/hreflang-annotations/#step3

          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: https://www.rebelytics.com/international-domain-strategy/

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

          Reply
  5. suresh ven
    15. May 2017

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

    link rel=”alternate” hreflang=”sv” href=”https://www.brommahobby.com/index.php?main_page=index&manufacturers_id=232″>
    link rel=”alternate” hreflang=”en” href=”https://www.brommahobby.com/index.php?main_page=index&manufacturers_id=232&language=en”

    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=”https://www.brommahobby.com/index.php?main_page=index&language=sv/” >
    link rel=”alternate” hreflang=”en” href=”https://www.brommahobby.com/index.php?main_page=index&language=en/” >

    Reply
    • Eoghan Henn
      16. May 2017

      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: https://www.rebelytics.com/hreflang-annotations/

      Reply
  6. vinoth
    10. May 2017

    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

    Reply
    • Eoghan Henn
      11. May 2017

      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.

      Reply
  7. suresh ven
    28. April 2017

    My main domain is : https://www.domain.com

    [ View page source ]

    Two language translator already in website [ English & Swedish ]

    https://www.domain.com/en

    [ View page source ]

    https://www.domain.com/sv

    [ View page source ]

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

    After giving above hreflang tag in website.it 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

    26
    18
    16
    4
    0
    0

    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

    Reply
  8. Dale
    26. April 2017

    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!

    Reply
    • Eoghan Henn
      27. April 2017

      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 (<) in Unicode (& # 6 0 ; without spaces). So you can either try that or just send me your code by e-mail, whatever you prefer 🙂 Sorry again!

      Reply
      • Dale
        27. April 2017

        Ah that’s OK Eoghan, I will shoot you an email.

        : )

        Dale

        Reply
  9. Husain
    7. February 2017

    Hi Eoghan,

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

    Originating URL:
    http://www.zawya.com/ar/company/profile/10200262/

    Implementation:
    link rel=”canonical” href=”http://www.zawya.com/ar/company/10200262/”
    link rel=”alternate” href=”http://www.zawya.com/mena/en/company/10200262/” hreflang=”en”
    link rel=”alternate” href=”http://www.zawya.com/ar/company/10200262/” hreflang=”ar”
    link rel=”alternate” href=”http://www.zawya.com/uae/en/company/10200262/” hreflang=”en-ae”
    link rel=”alternate” href=”http://www.zawya.com/uae/ar/company/10200262/” hreflang=”ar-ae”
    link rel=”alternate” href=”http://www.zawya.com/saudi-arabia/en/company/10200262/” hreflang=”en-sa”
    link rel=”alternate” href=”http://www.zawya.com/saudi-arabia/ar/company/10200262/” hreflang=”ar-sa”

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

    Cheers,
    Husain

    Reply
    • Eoghan Henn
      9. February 2017

      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,

      Eoghan

      Reply
      • Husain
        9. February 2017

        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?

        Cheers,
        Husain

        Reply
        • Eoghan Henn
          9. February 2017

          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.

          Reply
  10. Husain
    7. February 2017

    *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:
    http://www.zawya.com/ar/company/13010414/, with below tags:

    link rel=”canonical” href=”http://www.zawya.com/ar/company/13010414/”
    link rel=”alternate” href=”http://www.zawya.com/mena/en/company/13010414/” hreflang=”en”
    link rel=”alternate” href=”http://www.zawya.com/ar/company/13010414/” hreflang=”ar”
    link rel=”alternate” href=”http://www.zawya.com/uae/en/company/13010414/” hreflang=”en-ae”
    link rel=”alternate” href=”http://www.zawya.com/uae/ar/company/13010414/” hreflang=”ar-ae”
    link rel=”alternate” href=”http://www.zawya.com/saudi-arabia/en/company/13010414/” hreflang=”en-sa”
    link rel=”alternate” href=”http://www.zawya.com/saudi-arabia/ar/company/13010414/” hreflang=”ar-sa”

    ALTERNATE:
    http://www.zawya.com/uae/en/company/13010414/, with below tags:

    link rel=”canonical” href=”http://www.zawya.com/mena/en/company/13010414/”
    link rel=”alternate” href=”http://www.zawya.com/mena/en/company/13010414/” hreflang=”en”
    link rel=”alternate” href=”http://www.zawya.com/ar/company/13010414/” hreflang=”ar”
    link rel=”alternate” href=”http://www.zawya.com/uae/en/company/13010414/” hreflang=”en-ae”
    link rel=”alternate” href=”http://www.zawya.com/uae/ar/company/13010414/” hreflang=”ar-ae”
    link rel=”alternate” href=”http://www.zawya.com/saudi-arabia/en/company/13010414/” hreflang=”en-sa”
    link rel=”alternate” href=”http://www.zawya.com/saudi-arabia/ar/company/13010414/” hreflang=”ar-sa”

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

    Reply
  11. Guncel
    18. January 2017

    Can u give an example about these;

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

    just like en.domain.com …

    Reply
    • Eoghan Henn
      23. January 2017

      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,

      Eoghan

      Reply
  12. Richard Hearne
    17. January 2017

    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.

    http://www.example.com/en-page <- EN
    http://www.example.com/us/en-page <- EN-US
    http://www.example.com/uk/en-page <- 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.

    Reply
    • Eoghan Henn
      23. January 2017

      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,

      Eoghan

      Reply
      • Richard Hearne
        16. February 2017

        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:

        http://www.stateofdigital.com/hreflang-canonical-test/

        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
        Richard

        Reply
        • Eoghan Henn
          16. February 2017

          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,

          Eoghan

          Reply
  13. Jordi
    2. December 2016

    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 http://www.example.com or es.example.com, fr.example.com 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

    Jordi

    Reply
    • Eoghan Henn
      5. December 2016

      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: https://sites.google.com/site/webmasterhelpforum/en/faq-internationalisation#q20

      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!

      Eoghan

      Reply
      • Jordi
        9. December 2016

        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.

        Reply
        • Eoghan Henn
          14. December 2016

          OK, let me know how it goes and just ask if you have any other questions!

          Reply
  14. Maria
    3. November 2016

    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)
    http://www.mybrand.es
    http://www.mybrand.mx
    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?

    http://www.mybrand.mx will have the following tag:

    http://www.mybrand.es will have the following tag:

    It would be great if you could help out.
    Thanks!
    Pilar

    Reply
    • Eoghan Henn
      4. November 2016

      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 🙂

      Eoghan

      Reply
  15. Carlo
    21. September 2016

    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) http://www.example.it/category
    Page 2) http://www.example.it/category?View=1
    Page 3) http://www.example.it/category?View=2
    Page 4) http://www.example.it/category?View=ALL

    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) http://www.example.it/category
    meta name=”robots” content=”index,follow”
    link rel=”alternate” hreflang=”it” href=”http://www.example.it/category”
    link rel=”alternate” hreflang=”de” href=”http://www.example.de/category”
    link rel=”canonical” href=”http://www.example.it/category
    link rel=”next” href=”http://www.example.it/category?View=2″

    “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) http://www.example.it/category?View=1
    link rel=”canonical” href=”http://www.example.it/category

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

    Page 3) http://www.example.it/category?View=2
    meta name=”robots” content=”index,follow”
    link rel=”alternate” hreflang=”it” href=”http://www.example.it/category?View=2″
    link rel=”alternate” hreflang=”de” href=”http://www.example.de/category?View=2″
    link rel=”prev” href=”http://www.example.it/category?”

    “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) http://www.example.it/category?View=ALL
    link rel=”canonical” href=”http://www.example.it/category

    “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?

    Reply
    • Eoghan Henn
      27. September 2016

      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!

      Reply
      • Carlo
        27. September 2016

        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 🙂

        Reply
  16. Charlotte
    20. September 2016

    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.

    Reply
    • Eoghan Henn
      27. September 2016

      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!

      Reply
  17. Tom
    9. September 2016

    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.
    Thanks,
    Tom

    Reply
    • Eoghan Henn
      13. September 2016

      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 🙂

      Eoghan

      Reply
  18. Tom
    2. September 2016

    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)
    http://example.de/kategoriename1/produktname1.html
    http://example.de/kategoriename2/produktname1.html

    Same for English product description with /en/ in url and English names
    http://example.de/en/categoriename1/productname1.html
    http://example.de/en/categoriename2/productname1.html

    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=”http://example.de/en/categoriename1/productname1.html” hreflang=”x-default” /
    link rel=”alternate” href=”http://example.de/kategoriename1/produktname1.html” hreflang=”de” /
    link rel=”alternate” href=”http://example.de/en/categoriename1/productname1.html” 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.

    Result:
    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=”http://example.de/en/categoriename1/productname1.html” hreflang=”x-default” /
    link rel=”alternate” href=”http://example.de/kategoriename1/produktname1.html” hreflang=”de” /
    link rel=”alternate” href=”http://example.de/en/categoriename1/productname1.html” hreflang=”en” /
    link rel=”canonical” href=”http://example.de/kategoriename1/produktname1.html” /

    And on the 2 English page it is this:
    link rel=”alternate” href=”http://example.de/en/categoriename1/productname1.html” hreflang=”x-default” /
    link rel=”alternate” href=”http://example.de/kategoriename1/produktname1.html” hreflang=”de” /
    link rel=”alternate” href=”http://example.de/en/categoriename1/productname1.html” hreflang=”en” /
    link rel=”canonical” href=”http://example.de/en/categoriename1/productname1.html ” /

    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.
    Tom

    Reply
    • Eoghan Henn
      5. September 2016

      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="http://example.de/kategoriename1/produktname1.html" hreflang="de">
      < link rel="alternate" href="http://example.de/en/categoriename1/productname1.html" 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.

      Reply
  19. Pedro
    14. August 2016

    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.

    Reply
    • Eoghan Henn
      18. August 2016

      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!

      Reply
  20. Sanela
    22. July 2016

    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…

    Reply
    • Eoghan Henn
      28. July 2016

      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,

      Eoghan

      Reply
  21. Sanela
    22. July 2016

    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

    Reply
  22. Kara Shapiro
    14. July 2016

    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?

    Reply
    • Eoghan Henn
      15. July 2016

      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.

      Reply
      • Kara Shapiro
        15. July 2016

        Thank you Eoghan! Is there a way I could just email you the URL? Or, message you somehow?

        Reply
        • Eoghan Henn
          18. July 2016

          Sure! Just send me an email or a message on Linkedin or Twitter.

          Reply
  23. Derek
    8. July 2016

    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?

    Reply
    • Eoghan Henn
      11. July 2016

      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: https://www.rebelytics.com/multiple-hreflang-tags-one-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!

      Reply
      • Derek White
        15. July 2016

        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?

        Reply
        • Eoghan Henn
          15. July 2016

          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!

          Reply
  24. Jörg
    29. April 2016

    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 site:domain.com 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.

    Jörg

    Reply
    • Eoghan Henn
      16. May 2016

      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 😉

      Reply
  25. Jörg
    22. April 2016

    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 de.de (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.

    Reply
    • Eoghan Henn
      22. April 2016

      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: http://www.ebike-base.de. 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: https://www.nfon.com/sitemap.xml

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

      Eoghan

      Reply
      • Jörg
        22. April 2016

        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:
        http://www.stateofdigital.com/hreflang-canonical-test/

        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

        Jörg

        Reply
        • Eoghan Henn
          25. April 2016

          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 site:yourdomain.com 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,

          Eoghan

          Reply
  26. Jaap
    11. April 2016

    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!

    Reply
    • Eoghan Henn
      12. April 2016

      Great! Let us know how it goes!

      Reply
  27. Jaap
    8. April 2016

    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 😉

    Reply
    • Jaap
      8. April 2016

      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.

      Reply
      • Eoghan Henn
        11. April 2016

        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: https://www.rebelytics.com/multiple-hreflang-tags-one-url/

        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,

        Eoghan

        Reply
  28. Christo
    17. February 2016

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

    Reply
  29. Christo
    17. February 2016

    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: https://www.rebelytics.com/hreflang-annotations/#comment-8743 – 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 https://www.google.com/webhp?hl=es 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:
    http://screencast.com/t/3Cm6AIFN

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

    Thanks again for such an awesome post!

    Reply
    • Eoghan Henn
      17. February 2016

      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 google.com 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!

      Eoghan

      Reply
  30. PCT
    26. December 2015

    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! 🙂

    Reply
    • Eoghan Henn
      15. February 2016

      Thanks a lot, very kind of you!

      Reply
  31. JD
    2. November 2015

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

    Reply
    • Eoghan Henn
      2. November 2015

      Hi JD, thanks a lot! I’m happy you liked it. Eoghan

      Reply
  32. Adam
    28. August 2015

    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!

    Reply
    • Eoghan Henn
      28. August 2015

      Hi Adam, thanks for your kind words. Made my day. Eoghan

      Reply
  33. Ryan
    11. August 2015

    Hey Eoghan, I’ve got a .co.uk 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?

    OR

    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

    Reply
    • Eoghan Henn
      12. August 2015

      Hi Ryan! You will need to link your .co.uk 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: https://www.rebelytics.com/hreflang-annotations/

      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 .co.uk home page, you would be asking Google not to index the .ie home page, and to index the .co.uk 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 .co.uk pages with hreflang, you ask Google to show the .ie pages to Irish users and the .co.uk 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="http://www.yourwebsite.co.uk/" hreflang="en-gb">

      < link rel="alternate" href="http://www.yourwebsite.ie/" hreflang="en-ie">

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

      < link rel="alternate" href="http://www.yourwebsite.co.uk/about-us/" hreflang="en-gb">

      < link rel="alternate" href="http://www.yourwebsite.ie/about-us/" hreflang="en-ie">

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

      Reply

Leave a Reply