Hreflang generator:Do all your language versions point to each other?
Paste a table of your language versions and get a complete set of hreflang tags for every page, as HTML, an XML sitemap or HTTP Link headers.
First row: the hreflang codes (hr, en, de-AT, x-default). Then one row per page with the full URL of each version; leave a cell empty when that version doesn’t exist. Paste straight from a spreadsheet.
Processed in your browser. Nothing is uploaded.
Your language codes
- hrCroatian
- enEnglish
- de-ATGerman (Austria)
- x-defaultFallback for every other language
Your hreflang markup
Each block goes in the <head> of the page named above it. Every version lists all versions, itself included.
<!-- In the <head> of https://example-shop.hr/ -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/" />
<link rel="alternate" hreflang="de-AT" href="https://example-shop.hr/de/" />
<link rel="alternate" hreflang="x-default" href="https://example-shop.hr/en/" />
<!-- In the <head> of https://example-shop.hr/en/ -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/" />
<link rel="alternate" hreflang="de-AT" href="https://example-shop.hr/de/" />
<link rel="alternate" hreflang="x-default" href="https://example-shop.hr/en/" />
<!-- In the <head> of https://example-shop.hr/de/ -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/" />
<link rel="alternate" hreflang="de-AT" href="https://example-shop.hr/de/" />
<link rel="alternate" hreflang="x-default" href="https://example-shop.hr/en/" />
<!-- In the <head> of https://example-shop.hr/majice -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/majice" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/shirts" />
<link rel="alternate" hreflang="de-AT" href="https://example-shop.hr/de/hemden" />
<!-- In the <head> of https://example-shop.hr/en/shirts -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/majice" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/shirts" />
<link rel="alternate" hreflang="de-AT" href="https://example-shop.hr/de/hemden" />
<!-- In the <head> of https://example-shop.hr/de/hemden -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/majice" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/shirts" />
<link rel="alternate" hreflang="de-AT" href="https://example-shop.hr/de/hemden" />
<!-- In the <head> of https://example-shop.hr/kontakt -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/kontakt" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/contact" />
<!-- In the <head> of https://example-shop.hr/en/contact -->
<link rel="alternate" hreflang="hr" href="https://example-shop.hr/kontakt" />
<link rel="alternate" hreflang="en" href="https://example-shop.hr/en/contact" />
- Free, no account
- Runs in your browser
- HTML tags, sitemap or HTTP headers
What this tool checks
One table in, a complete and consistent set out. Every code is checked before you copy anything.
Three output formats
Link tags for the page head, an XML sitemap, or HTTP Link headers for PDFs and other files.
Every code checked and named
An ISO 639-1 language, optionally a country (de-AT), or x-default. Each code is named, such as "German (Austria)".
Common mistakes flagged
Codes such as en-UK, en_US or a country without a language are flagged with the fix.
Complete sets, self included
Each page gets the complete set of versions, itself included, which is what makes return links work.
Table problems first
Rows with a single version, relative URLs and pages that appear in two rows are reported before you copy anything.
Show 1 more checks
Table problems first
Rows with a single version, relative URLs and pages that appear in two rows are reported before you copy anything.
How it works
Name the versions
The first row names the versions: a language, optionally a country, or x-default for everyone else.
Add one row per page
Each row after it is one page in all its versions, as full URLs. The table is checked as you go.
Copy the output
Choose tags, sitemap or headers and copy the result. Use one method per page, not several.
The tags are built from your table only; the tool doesn't visit the URLs, so it can't confirm that every version is live.
Questions
Is this really free?
Yes. getReport is funded by donations, not plans. This tool runs entirely in your browser, so there is no limit and nothing to pay for.
Do I need x-default?
It is recommended: it tells Google which page to show to people whose language you do not cover, usually your language picker or English version. It is not required for the other tags to work.
Tags, sitemap or headers: which one?
Use one method per page, not several. Tags in the head are simplest for small sites; the sitemap suits large sites and platforms where you cannot edit the head; HTTP headers are for PDFs and other files.
Why is hreflang easy to get wrong?
Hreflang only works when every version points to every other version and back. Miss one return link, use a country where a language belongs, or forget the self-reference, and Google ignores the whole set for that page, often without any warning in Search Console. Generating the tags from one table keeps every page consistent. For large sites the sitemap format is easier to maintain than tags in each page’s head.
Can I use hreflang across different domains?
Yes. Versions can live on different domains (example.hr, example.de); list the full URL of each. Every domain must carry the complete set, so every site needs the same tags or sitemap.
Related free tools
All 41 tools →Free, funded by the people who use it
€0 of €75 this month. At €75, site crawl up to 500 pages + weekly re-check switches on for everyone.