If you run a bilingual site, hreflang is the difference between Google ranking your Chinese pages in Chinese results and Google treating your two languages as duplicate content competing against each other. It is about a dozen lines of HTML, and yet roughly every other multilingual site gets it subtly wrong. Google’s own analysis and most audit tools agree that over 60% of sites using hreflang ship at least one error — and because Google treats hreflang as a hint, not a directive, a broken setup is simply ignored with zero warning in Search Console.
TL;DR
Put a reciprocal <link rel="alternate" hreflang="..."> block in the <head> of every page. For a two-language article that block is three tags: the English URL, the Chinese URL, and an x-default. Every page must list itself plus every alternate, and both sides must point at each other — one-way hreflang gets the whole set dropped. Use absolute https:// URLs that match your canonical and sitemap character-for-character.
What hreflang actually does (and doesn’t)
hreflang tells search engines “this content exists in language X at URL A and language Y at URL B.” Google uses it for exactly two things:
- Serving the right language version to the right user in search results.
- Clustering your language variants so they aren’t judged as duplicate content competing against one another.
It does not directly boost rankings, and it is a hint Google can override. But a missing or broken hreflang on a bilingual site typically guts traffic to the non-default language, because Google ends up showing the English page to Chinese searchers (who bounce) or quietly indexing only one version of each pair.
Signs your hreflang is broken
- You have English and Chinese versions of the same articles at parallel URLs (
/en/articles/x/and/zh/articles/x/) but Google’s Chinese results show the English page, or vice versa. - Search Console reports “Alternate page with proper canonical tag” for one language version (this one is usually fine — see the FAQ).
- A crawler like Screaming Frog or Ahrefs flags “Missing return tags” / “no return-tag” on your hreflang pairs.
- Your Chinese page count in the Pages report is far lower than English, even though both languages are equally complete.
The exact tags
For an article in English (default) and Chinese, every page in the pair carries the same three-tag block. On both the English page and the Chinese page, put this in <head>:
<link rel="alternate" hreflang="en" href="https://yoursite.com/en/articles/slug/" />
<link rel="alternate" hreflang="zh" href="https://yoursite.com/zh/articles/slug/" />
<link rel="alternate" hreflang="x-default" href="https://yoursite.com/en/articles/slug/" />
Three rules make or break this block:
- Self-reference. Each page lists its own URL with its own language value. Google’s docs are explicit: “Each language version must list itself as well as all other language versions.” Skip the self-tag and Google may treat the set as incomplete.
- Reciprocity. The English page points at the Chinese URL, the Chinese page points back at the English URL. Google: “If two pages don’t both point to each other, the tags will be ignored.” This is the single most common failure mode.
- Fully-qualified URLs. Use
https://yoursite.com/zh/articles/slug/, never//yoursite.com/...or/zh/.... Protocol, host, casing, and trailing slash must match your canonical and sitemap entries exactly — even a dropped trailing slash breaks the match.
Canonical and hreflang are different jobs
Each language version gets its own self-referencing canonical. Do not canonical the Chinese page to the English page (or vice versa) “to consolidate authority” — that deindexes your Chinese pages from Chinese search, which is the opposite of what you want. The two tags cooperate: canonical says “this is the canonical URL of this content in this language,” hreflang says “and here are the other languages.”
Picking the right language code
Use a language-only code (hreflang="zh") unless you genuinely publish different content per region. If your distinction is Simplified vs Traditional script — the usual case for Chinese — the technically correct codes are the ISO 15924 script subtags zh-Hans (Simplified) and zh-Hant (Traditional), not the country codes zh-CN/zh-TW. Country codes conflate script with geography (e.g., Singapore also reads Simplified), so zh-Hans/zh-Hant target the actual differentiator. Only add a region (zh-Hans-CN, en-GB) when you serve country-specific content, because the region code commits you to maintaining that variant.
Where to put the tags: head vs sitemap vs HTTP header
| Method | Best for | Trade-off |
|---|---|---|
<head> <link> tags | Most sites; easiest to debug (view-source shows them) | Adds markup to every page |
XML sitemap (xhtml:link) | Hundreds of pages; keeps HTML clean | Harder to eyeball; must list every alternate per <url> |
HTTP Link: header | Non-HTML files (PDFs) or header-driven CDNs | Hardest to inspect and maintain |
Pick one method per URL. Google’s documentation is clear that you can combine all three, but “there’s no benefit in Search (in fact, it may be much harder to manage).” For a typical bilingual Astro/Next/Hugo site, <head> tags are the right default.
How to verify it works (the 2026 way)
Heads up: Search Console’s International Targeting report was deprecated and removed in September 2022, so the old “Language” tab that listed hreflang errors no longer exists. Verify like this instead:
- View source on one English page; confirm the three hreflang tags. Open the matching Chinese page; confirm the same three tags. Mismatched blocks are the #1 bug.
- Crawl the site with Screaming Frog (free up to 500 URLs) or Ahrefs/Semrush Site Audit and check the dedicated hreflang report for “Missing return tags,” “Non-canonical,” and “Inconsistent” flags.
- Spot-check in Search Console via URL Inspection one URL at a time — it won’t give you an hreflang panel anymore, but it confirms the page is indexed and shows the Google-selected canonical, which should be the page’s own URL per language.
- Re-audit every 3–6 months and after any domain, URL-structure, or CMS change, since these errors are invisible until they cost you traffic.
Common pitfalls
- One-way hreflang. English page references Chinese, Chinese page doesn’t reference back. Google drops the entire set silently.
- Missing self-reference. Each page must include its own URL with its own hreflang value, or Google considers the set incomplete.
- Canonical-ing one language to the other. Deindexes the non-canonical language from search. Never do it.
- Region codes for generic content. If
zh-CNandzh-TWwould serve identical pages, you don’t have country-specific content — usezh(orzh-Hans/zh-Hantfor script). - URL drift. A trailing slash,
httpvshttps, or a casing difference between hreflang, canonical, and sitemap breaks the match.
Who this is for / when to skip
This is for indie content sites running parallel English and Chinese versions (or any two-language combo) under one domain with matching article slugs. Skip it entirely if you run a single-language site — hreflang does nothing. And if your two language versions are wildly different (different articles, different structure), don’t force hreflang; run them as separate properties.
FAQ
- Do I need
x-default?: Strongly recommended.x-defaultis the fallback Google serves “when no other language/region matches the user’s browser setting.” Without it, Google guesses for users in third countries, and the guess is often wrong. - Can I put hreflang in the sitemap instead of
<head>?: Yes. All three methods (head tags, XML sitemap, HTTP header) are equally valid, but use only one per URL — Google says combining them adds no search benefit and is harder to manage. Sitemap-based hreflang keeps HTML clean for large sites;<head>tags are easier to debug. - Why does Search Console still say “Alternate page with proper canonical tag”?: For the non-default language version, that’s the correct, expected state — it means Google sees the page and treats it as an alternate of the canonical, not an error. You only worry if your primary language pages show it.
- Should I use
zh,zh-CN, orzh-Hans?: Usezhif you serve one Chinese version. If you serve Simplified and Traditional separately, use the script subtagszh-Hans/zh-Hant— they target the real difference (script) instead of assuming it from country. Reservezh-CN/zh-TWfor genuinely country-specific content. - Will hreflang help my Chinese pages rank in Baidu?: No. Baidu does not use
hreflang. For Baidu you need Baidu Webmaster Tools and an ICP filing, which is a separate effort.hreflangonly helps Google and Bing.