Skip to content
HotelSEO Lab
← The Lab
International & Inbound Markets

Advanced Hreflang for Multi-Market Hotel Sites (Without the Errors)

A technical, first-person deep dive on hreflang for language-plus-region targeting, x-default, return-tag mismatches, and the audit steps that keep it from silently breaking.

HotelSEO LabMarch 1, 2025 11 min read

If you run an independent hotel that pulls guests from more than one country, hreflang is the most quietly destructive piece of technical SEO you will ever touch. Get it right and German searchers see your German page, US searchers see your dollar-priced page, and everyone is happy. Get it wrong and Google does something far worse than ignore it: it shows the wrong page to the wrong person, your German guest lands on a pound-priced English booking flow, and you never find out why your conversion rate on paid international traffic is in the toilet.

I have audited a lot of multi-market hotel sites, and I would say four out of five have hreflang that is silently broken. Not broken in a way that throws an error anyone notices. Broken in a way that just sits there, leaking. So let me walk you through how this actually works, where it breaks, and the exact audit steps I run before I will sign off on an international hotel site.

What hreflang actually does (and what it does not)

Hreflang is an annotation that says: “this page exists in these other language and region versions, and here is where each one lives.” That is it. It is a routing hint for the search engine, not a ranking signal.

Here is the part people get backwards. Hreflang does not make you rank higher. It does not pass authority. What it does is two things:

  1. It tells Google which version to serve a given searcher based on their language and location.
  2. It tells Google that your near-duplicate pages (same hotel, same rooms, different language) are intentional translations, not spam or thin duplicates.

That second point is the one that quietly saves hotels. When you have an English and a German page describing the same suite, Google can read them as duplicate content competing with each other. Hreflang clears that up. So the win is not “rank #1” — nothing here is a guaranteed ranking lever. The win is maximizing the odds that the correct page surfaces for the correct searcher, which is exactly what you want when you are paying to bring international travelers to your direct site instead of handing them to the OTAs.

Hreflang is a tie-breaker, not a booster. If your English and German pages both have a shot at ranking for a query, hreflang decides which one shows. It cannot make a page rank that would not have ranked anyway.

Language-plus-region: where most setups go wrong

The hreflang value has two parts: a language code and an optional region code. This is where the wheels come off.

The language code uses ISO 639-1. The region code uses ISO 3166-1 Alpha 2, and it is a country, not a continent or a language. Two mistakes I see constantly:

First, people invent codes. There is no en-UK. The United Kingdom’s code is GB. There is no en-EU, because the EU is not a country. If you write en-EU, Google throws out that annotation entirely. It does not guess what you meant.

Second, people use a region code when they only mean a language. If your German content is identical for German, Austrian, and Swiss guests, do not split it into de-DE, de-AT, and de-CH pointing at the same URL. Just use de. Over-targeting creates more pages to maintain, more chances for a mismatch, and zero benefit.

Here is when you actually want the region split: when the content genuinely differs by country. A US page priced in dollars with US phone formatting is a real en-US. A UK page priced in pounds is a real en-GB. Same language, different region, different content — that is the textbook case for language-plus-region.

ScenarioUse thisWhy
One English page for the whole worldenNo regional difference exists
US page in dollars, UK page in poundsen-US, en-GBSame language, content differs by region
German content shared across DE, AT, CHdeSplitting buys you nothing
Fallback for unmatched visitorsx-defaultCatches everyone else

x-default: the page you forgot to point anyone at

x-default is the annotation that tells Google “if none of the other versions match this searcher, send them here.” It is your fallback. A Japanese-speaking traveler from Brazil who matches none of your language-region pairs has to land somewhere — x-default decides where.

Most hotels skip it, and I think that is a mistake. Without an x-default, Google picks a fallback for you, and its pick is rarely your best converting page. I usually set x-default to either the English page or a language-selector landing page, depending on the site.

A few rules I hold to:

The single most common thing I find on a “professionally built” hotel site is a complete set of language pages with no x-default anywhere. It is not an error Google reports loudly. It just quietly fills the gap with whatever it feels like, usually not the page you would have chosen.

Return-tag mismatches: the silent killer

This is the one that breaks the most clusters, and it breaks them completely. Hreflang annotations must be bidirectional and reciprocal. If your English page points to your German page, your German page must point back to your English page. If it does not, Google treats the entire set of annotations as unreliable and ignores it.

Not “ignores the one bad link.” Ignores the whole cluster. All your careful work, gone, because one page in the set forgot to point back.

And there is a subtlety that trips up even careful developers: each page must also reference itself. A complete cluster of three pages — English, German, French — means every single one of those three pages lists all three URLs, including its own. Nine annotations total across three pages. Miss the self-reference and some validators will flag it, and Google gets less confident about the set.

The reason return-tag mismatches are so common is that templating is hard. Most hotel CMS setups generate hreflang from a loop. If the loop on the German page does not have the full, current list of sibling URLs — because someone added a French page last month and only updated the English template — you get a one-directional reference and a dead cluster. It compiles fine. It deploys fine. It is broken.

Return tags are all-or-nothing. One page that fails to point back does not weaken the cluster a little — it invalidates the cluster entirely. This is why a single forgotten template edit can silently kill hreflang across an otherwise perfect site.

Where to put the annotations: pick one method and never mix

You have three places you can declare hreflang. Pick exactly one and be religious about it.

  1. HTML head link elements. A link tag with rel="hreflang" in the head of each page. Easiest to inspect, easiest to get wrong at scale because every page carries the full list.
  2. HTTP headers. Good for non-HTML files like PDFs. Rare for hotels.
  3. XML sitemap. My preferred method for anything beyond a handful of pages. You declare the entire cluster in one place, it is far easier to keep reciprocal, and it does not bloat your page head.

The XML sitemap approach is the one I reach for on real multi-market hotel sites because reciprocity is generated from a single source of truth instead of scattered across dozens of page templates. One file, one loop, every URL references every sibling including itself. When a new language launches, you update one generator, not forty templates.

What you must never do is mix methods for the same pages. If you have head tags and sitemap annotations and they disagree, you have created a conflict that is genuinely painful to debug. Pick one.

My hreflang audit, step by step

Here is the actual sequence I run. Nothing here is exotic — it is just disciplined.

Step 1 — Crawl the whole site and extract every hreflang annotation. I run a full crawl that pulls hreflang from head, headers, and sitemap separately so I can see if more than one method is in play. A crawler like Screaming Frog has a dedicated hreflang report that flags missing return links, missing self-references, and non-canonical confirmation links automatically. This is the single highest-leverage step.

Step 2 — Check reciprocity on every cluster. For each page, does every URL it references point back? Does each page reference itself? Any cluster that fails goes on the fix list immediately, because a failing cluster is a fully dead cluster.

Step 3 — Validate every language and region code. I check each code against ISO 639-1 and ISO 3166-1 Alpha 2. I am specifically hunting for en-UK, en-EU, made-up codes, and region codes used where only a language was meant.

Step 4 — Confirm exactly one x-default per cluster. Zero is a gap, more than one is a conflict.

Step 5 — Cross-check hreflang against canonical tags. This is the trap that catches good developers. Every hreflang URL must be self-canonical. If your German page hreflang-points to a French URL, but that French URL has a canonical tag pointing to the English page, you have told Google two contradictory things and it will distrust the lot. Hreflang URLs and canonical URLs have to agree.

Step 6 — Verify the pages actually return 200 and are indexable. Hreflang pointing at a redirect, a 404, or a noindex page is wasted. Every target must be a live, indexable, self-canonical 200.

Step 7 — Watch the International Targeting and pages reports over the following weeks. Hreflang changes are not instant. Google has to recrawl every page in a cluster before the annotations take effect, and on a small hotel site with modest crawl frequency that can take several weeks. Set the expectation honestly: you are not flipping a switch, you are waiting on a recrawl cycle.

A realistic example

Say you run a boutique property and you sell strongly into the US and Germany alongside your home UK market. A clean setup looks like this: a en-GB page in pounds, an en-US page in dollars, a de page in German, and an x-default for everyone else. Every one of those four pages lists all the others plus itself. The codes are real. Each page is self-canonical and returns 200. That is a healthy multi-market configuration — illustrative, but it is exactly the shape I aim for.

Now the failure version, which is what I usually inherit: the de page was added last and its template never got the US sibling, so the US-German reciprocity is broken, the cluster is dead, and German searchers have been getting served the pound-priced UK page for months. Nobody noticed because nothing errored. That is the whole problem with hreflang in one sentence.

Why this matters for your direct-booking strategy

Here is the connection to the thing you actually care about: margin. When you pay to bring international travelers to your own site to book direct — and clawing back bookings from the OTAs is the entire point, since OTA commissions run roughly 15 to 25 percent of every reservation — the last thing you want is Google serving a German guest a page they cannot price or trust. Broken hreflang quietly hands those high-intent international searchers a worse experience than the OTA would have, which pushes them right back to the OTA. Getting language-region targeting right is part of the same work as the rest of your book-direct CRO and your fight to reduce OTA dependence. It is plumbing, but it is plumbing that decides who lands where.

If your international pages are also fighting to outrank the OTAs for your own brand and city terms, that is a related-but-separate battle — I dug into it in why your hotel ranks below OTAs for your name, and the broader technical foundation lives in the hotel SEO 2026 starter guide.

The short version

Hreflang does not boost rankings — it routes the right page to the right searcher and stops your translations from competing with each other. The errors that kill it are quiet: invented region codes, missing x-default, hreflang-canonical conflicts, and above all return-tag mismatches that invalidate an entire cluster because one templated page forgot to point back. Crawl it, check reciprocity, validate the codes, confirm one x-default, reconcile against canonicals, and then wait for the recrawl. No drama, just discipline.

If you want a second set of eyes on a multi-market setup before it quietly leaks another quarter of international bookings, book a free intro call and I will run the audit above on your actual site and tell you exactly what is broken.

FAQ

Quick answers

Does hreflang improve my hotel's rankings?

Not directly. Hreflang does not boost rankings. It tells Google which language and region version of a page to serve to a given searcher, which improves the right-version match and reduces the duplicate-content confusion that can quietly suppress your pages.

Do I need separate URLs for each language and region?

Yes. Hreflang annotations point from one URL to another, so each language-region variant needs its own indexable URL. A cookie or auto-redirect that swaps content on the same URL cannot be annotated and tends to break crawling.

What is the most common hreflang mistake hoteliers make?

Return-tag mismatches. If page A points to page B but page B does not point back to page A, Google ignores the whole cluster. The fix is making every page in a set reference every other page, including itself.

Do I still need hreflang if I only have an English site?

Usually no. Hreflang only matters when you publish the same content in multiple languages or for multiple regions. A single-language site does not need it, though a single en x-default tag does no harm.

Keep reading

More from the Lab

Free intro call

Let's go find out why the OTAs are outranking you for your own name.

20 free minutes. We'll look at your hotel live, show you where you're invisible — on Google and in the AI answers — and tell you straight whether we can help.

No lock-in · No 12-month handcuffs · You talk to the strategist