Hreflang Tags for Indian Language Sites: The Setup Rules
Most hreflang advice is written for US/UK/AU country sites. India is usually one country and several languages — which changes the codes you write and the reason you write them.
hi-IN and en-IN, not two country sites.The return-link rule, the Indian pattern, and what hreflang is not.
What hreflang actually does — and what it does not
Hreflang is an annotation that says "this URL is the same page as that URL, in a different language or for a different region". Google uses it to serve the version that fits the searcher.
That is the whole job. It sits in the same family of crawl-and-index signals as the rest of our technical SEO pillar — useful, specific, and narrower than people assume.
Google's own documentation frames it that way: the point is to "tell Google about these different variations" so Search can point users to the most appropriate version by language or region (Tell Google about localized versions of your page, last updated 21 September 2026).
Three things it is not, stated plainly, because getting this wrong is why so many Indian sites implement it for the wrong reason:
- It is not a ranking boost. Neither of Google's international documents lists hreflang as a ranking factor. The multi-regional guide names it as one of the locale signals Google relies on to work out who a page is for (Managing multi-regional and multilingual sites, last updated 10 December 2025) — and the same page warns that geotargeting "can improve your page rankings in the target country, but at the expense of results in other locales or languages". Better targeting, not more authority.
- It is not a duplicate-content fix. The localized-versions doc is explicit that localized versions are only treated as duplicates if the main content of the page remains untranslated. Properly translated pages were never the duplicate problem; hreflang does not rescue the ones that are.
- It is not a directive. Google processes it as an annotation it can ignore — most obviously when the links are not reciprocal, which we come to below.
The Indian case: one country, many languages
Almost every hreflang article you will read is built around a multi-country setup: en-US, en-GB, en-AU, one site per market. Copy that pattern onto an Indian site and you will write the wrong codes.
The common Indian situation is the opposite shape. One market — India — and several languages inside it. A Hindi page and an English page serving the same customers in the same country.
That is hi-IN and en-IN. Two language versions for one region, not two country sites. The region half of the code is identical; only the language half changes.
Why it matters practically: if you treat it as country targeting you start reaching for separate ccTLDs, separate properties and separate geotargeting — infrastructure for a problem you do not have. And if you write hreflang="IN" because "the market is India", the annotation is invalid. Google's guideline is blunt about it: you cannot specify the country code by itself.
A language code on its own is allowed, and often the better choice. If your Hindi page is for Hindi speakers wherever they are, hi is enough. Use hi-IN only when you genuinely also have, or plan, a Hindi version for a different region.
Which Indian languages you can actually use
Google supports only language codes listed in ISO 639-1 and region codes listed in ISO 3166-1 Alpha 2. That constraint matters more in India than anywhere else, because several widely spoken Indian languages have no two-letter code at all.
The codes below are taken from the Library of Congress ISO 639-2 registry, which carries the ISO 639-1 column (ISO 639-2 code list, codes last updated 15 January 2026).
| Language | ISO 639-1 | With India region |
|---|---|---|
| Hindi | hi | hi-IN |
| Bengali | bn | bn-IN |
| Marathi | mr | mr-IN |
| Gujarati | gu | gu-IN |
| Tamil | ta | ta-IN |
| Telugu | te | te-IN |
| Kannada | kn | kn-IN |
| Malayalam | ml | ml-IN |
| Panjabi / Punjabi | pa | pa-IN |
| Oriya (Odia) | or | or-IN |
| Assamese | as | as-IN |
| Urdu | ur | ur-IN |
| Sanskrit | sa | sa-IN |
| Nepali | ne | ne-IN |
| Kashmiri | ks | ks-IN |
| Sindhi | sd | sd-IN |
Checked in the same registry and carrying no ISO 639-1 code: Maithili, Konkani, Manipuri, Santali, Dogri, Bhojpuri and Awadhi. There is nothing valid to put in the attribute for those, so the annotation is not available to you — publish the pages, link them internally, and let Google's own language detection do the work.
One naming note: the registry still labels the language "Oriya" rather than "Odia", but the code is or either way.
The three implementation methods — pick one
Google documents three ways to declare the set, and says they are equivalent from its perspective: HTML link elements in the <head>, an HTTP Link header, or annotations in your XML sitemap.
You can use all three at once. There is no benefit in Search for doing so, and three implementations to keep in sync is how sets drift out of agreement. Choose one and keep it.
| Method | Best for | Cost |
|---|---|---|
HTML link elements | Small sets; sites where you control the template | Page weight grows with the number of versions, on every page |
HTTP Link header | Non-HTML files — Google gives PDFs as the example | Needs server or CDN configuration |
| XML sitemap | Large sets; when you cannot touch the <head> | Build and ship a correct sitemap every time the set changes |
HTML method, for an EMI calculator page in English, Hindi and Marathi. The identical block goes in the <head> of all three URLs:
<link rel="alternate" hreflang="en-IN" href="https://example.in/emi/" /> <link rel="alternate" hreflang="hi-IN" href="https://example.in/hi/emi/" /> <link rel="alternate" hreflang="mr-IN" href="https://example.in/mr/emi/" /> <link rel="alternate" hreflang="x-default" href="https://example.in/emi/" />
Sitemap method, same set. Every URL gets its own <url> entry listing all the variants, including itself — see how to structure an XML sitemap for the rest of the file:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.in/emi/</loc>
<xhtml:link rel="alternate" hreflang="en-IN"
href="https://example.in/emi/"/>
<xhtml:link rel="alternate" hreflang="hi-IN"
href="https://example.in/hi/emi/"/>
</url>
</urlset>
HTTP header method, for a rate card published as a PDF. Note the angle brackets around each URL — Google's spec requires them:
Link: <https://example.in/rates.pdf>; rel="alternate"; hreflang="en-IN",
<https://example.in/hi/rates.pdf>; rel="alternate"; hreflang="hi-IN"
Whichever you pick, every URL in the set must be fully qualified, protocol included. Google rejects //example.in/foo and /foo; it wants https://example.in/foo.
Return links: every page links to every page, including itself
This is the single commonest failure, and it is worth stating in full. Each language version must list itself as well as all other language versions. The self-reference is not optional padding — it is part of the rule.
And the links have to be mutual. Google's guideline: if two pages do not both point to each other, the tags will be ignored. The reason it gives is sensible — otherwise anyone could add a tag on their own site naming themselves as an alternative version of your page.
So in a three-language set, each of the three URLs carries four annotations: one for each of the three versions, plus x-default. The block is identical on all three. If you find yourself writing a different block per page, something has gone wrong.
Google does allow a pragmatic shortcut: if a complete bidirectional set becomes unmaintainable, you can omit some languages on some pages, and it will still process the pairs that do point at each other. It adds that newly added language pages should at minimum be linked bidirectionally to your original or dominant language. Treat that as a fallback, not a plan.
x-default: what it is actually for
The reserved x-default value is used when no other language or region matches the user's browser setting. It is the "none of the above" entry in your set.
Google documents it as designed for language selector pages, and its guidelines suggest a fallback for unmatched languages especially on language or country selectors and auto-redirecting home pages. You can point it at any page, including one of your specific versions.
What it is not: a way to say "this is my main page". A set without x-default is still valid. If you have no selector and no auto-redirect, pointing it at your widest-reach version — usually the English one on an Indian site — is a reasonable default rather than a requirement.
Hreflang and canonical tags, in one sentence
Every language version should canonicalise to itself, never to another language's URL — because a cross-language canonical tells Google the translated URL should not be indexed, which leaves the hreflang set pointing at pages Google has dropped.
Google's canonicalisation doc backs this up from both ends: it says to specify a canonical page in the same language, that rel="canonical" annotations carrying hreflang, lang, media or type attributes are not used for canonicalisation at all, and that Google prefers URLs that are part of hreflang clusters when choosing a canonical (How to specify a canonical URL, last updated 10 July 2026). If canonicals are the part you are least sure about, read our canonical tags guide before you touch hreflang.
Every rule, the mistake it invites, and the fix
One table to check an implementation against. If you are auditing someone else's work, start here.
| The mechanic | The rule | The commonest mistake |
|---|---|---|
| Method | Three exist; they are equivalent; pick one | Sitemap annotations and <head> tags both shipped, disagreeing with each other |
| Return links | Every version lists every version, itself included | The self-referencing link left out, so the set is incomplete everywhere |
| Reciprocity | Both pages must point at each other or the tags are ignored | English links to Hindi; Hindi never links back |
| Language code | ISO 639-1 only | A three-letter or invented code for a language that has no 639-1 entry |
| Region code | ISO 3166-1 Alpha 2, optional, and never on its own | hreflang="IN" written to "target India" |
| Reserved codes | EU, UN and UK have no effect in Google Search | en-UK instead of en-GB |
| URL form | Fully qualified, with the protocol | Relative or protocol-relative URLs; HTTP URLs left in after an HTTPS migration |
| Canonical | Each version canonicalises to itself | All language versions canonicalised to the English URL |
| x-default | Fallback when nothing else matches the browser setting | Used as a "primary version" marker |
The three errors behind most broken implementations
- A set that is not reciprocal. Usually because the self-reference was dropped, or because a new language was added to the template on the new pages only. The annotation silently stops counting — nothing breaks visibly.
- Codes that are not in the standard. A region code on its own, a reserved code like
UK, or a language with no ISO 639-1 entry. Google ignores the part it cannot parse. - URLs in the set that Google cannot index. An alternate that 404s, redirects, carries a
noindex, or canonicalises somewhere else. Google's canonicalisation doc specifically says not to include the HTTP version of your pages in your sitemap or hreflang annotations — a classic leftover after a migration.
All three are crawl-level problems, which is why we fold hreflang checks into the same pass as redirects and indexation rather than treating it as a separate project. The broader checklist sits in our technical SEO post, and the implementation itself is part of how we scope SEO services for multilingual sites.
How to check whether yours is working
Be realistic about Search Console here. It no longer reports on this. The International Targeting report has been deprecated, and Google's help page says country targeting for search results is no longer supported because it was judged to have little value for the ecosystem (The International Targeting report is deprecated — no last-updated date is printed on that page; read 8 October 2026). It names no replacement tool and confirms hreflang itself is still supported.
What you can still do inside Search Console:
- URL Inspection → View crawled page. The tool's help page does not mention hreflang, but it does give you the raw HTML Google fetched — which is how you confirm the
linkelements survived your template, your cache and any JavaScript. - URL Inspection → canonicals. It reports the user-declared and the Google-selected canonical. If the Hindi URL's Google-selected canonical is the English URL, your hreflang has nothing to serve.
- Performance report → Countries and Queries. Both are dimension tabs. Useful for the outcome question — are Hindi queries landing on the Hindi URL — not for validating markup.
(Both Search Console Help pages above carry no printed last-updated date; read 8 October 2026.)
For the markup itself, crawl your own site and assert three things: every URL in a set returns 200, every set is reciprocal, and every set includes the self-reference. That is a crawler's job, not a dashboard's.
What we ask before we agree to implement it
Before we write a single annotation, we ask one question: show us the Hindi page you want us to point at — who wrote it, who owns it, and what changed on it in the last six months?
The answer that means the client should not implement hreflang: "it was run through a translation plugin when the site launched, and nobody has touched it since."
Hreflang is a pointer. If it points at a page nobody maintains, all you have done is make an unmaintained page easier for Google to serve to the people most likely to notice. A machine-translated page with no owner is a liability, and the annotation does not fix the quality problem underneath it — it advertises it.
When that is the answer, the honest sequence is: fix or retire the translation first, then annotate. Hreflang is worth implementing only when you genuinely have equivalent, maintained pages in each language.
When not to bother
- A single-language site. No alternate versions, nothing to annotate. A self-referencing hreflang on a one-language site does nothing.
- Pages that differ only by a city name. "Dentist in Pune" and "Dentist in Nagpur" are not language or region variants of one page — they are different pages. Hreflang is the wrong tool; that is a content and internal linking question.
- Translations you cannot maintain. Covered above. Publish them unannotated, or not at all.
- A language with no ISO 639-1 code. There is no valid value to write.
Where to go from here
The payoff is correctness rather than growth: the right version in front of the right searcher. If the languages are not the issue and the underlying pages are, that is a planning problem before it is a markup problem — start with how to build an SEO strategy and come back to the annotation when the content set is real.
hi-IN and en-IN rather than two country sites.Frequently asked questions
Does hreflang improve rankings?
No. Google's documentation describes hreflang as a way to tell Search about language and regional variations so it can serve the right one, and never lists it as a ranking factor. The multi-regional guide names it among the locale signals Google relies on to work out a page's target audience, and warns that geotargeting can lift rankings in the target country at the expense of other locales. Better targeting, not more authority.
Do I need hreflang for a Hindi and an English version of the same page in India?
Yes, if both pages genuinely exist and are maintained. The codes are hi-IN and en-IN — two language versions for one region, not two country sites. Each page must carry the same complete set of annotations, including a link to itself. If the Hindi version is an unmaintained machine translation, fix or retire it before annotating it.
What is hreflang x-default used for?
The reserved x-default value is used when no other language or region in your set matches the user's browser setting. Google documents it as designed for language selector pages, and suggests a fallback especially on language or country selectors and auto-redirecting home pages. It is not a way to mark a primary version, and a set without it is still valid.
Can I use hreflang="IN" to target India?
No. Google's guidelines state you cannot specify the country code by itself. The first code is the language in ISO 639-1 format, optionally followed by a region code in ISO 3166-1 Alpha 2 format — so en-IN or hi-IN, never IN alone. A language code on its own, such as hi, is allowed.
How do I check hreflang in Search Console?
You cannot check the markup directly any more. The International Targeting report has been deprecated and Google names no replacement. What remains useful: URL Inspection's "View crawled page" shows the raw HTML Google fetched, so you can confirm your link elements are there, and it reports the Google-selected canonical. The Performance report's Countries and Queries tabs show the outcome. Validating reciprocity and self-references needs your own crawl.
Several languages, one search strategy
We audit the pages before we annotate them — and tell you when the translation, not the markup, is the problem.
Make Digital Hangover a preferred source
One tap tells Google to show more of our SEO and marketing coverage in your Top Stories.
