S.
  • Services
  • For you
  • Solutions
  • Work
  • About
  • Know-how
  • Blog
Start a project
EN/PL/RU
  • Services01
  • For you02
  • Solutions03
  • Work04
  • About05
  • Know-how06
  • Blog07
Start a project
EN/PL/RU
Vlad Sedenko
Independent web product developer
EU / Poland / Warsaw
Products
  • NextWooNext.js storefront for WooCommerce
© 2026. All rights reserved
Services
  • Product Discovery
  • UX/UI Design
  • MVP Development
  • SaaS Development
  • Website Redesign
  • Web Application Security
  • Conversion Optimization
  • API Integrations & Business Automation
  • Product Support
Explore
  • Services
  • For you
  • Work
  • Solutions
  • About
  • Blog
  • Know-how
  • Contact
Start a project
  • vlad@sedenko.net
  • LinkedIn
  • Privacy/Cookies
Know-how/Next.js SEO Checklist: The Complete Guide for App Router (2026)

Part 3 of 22

Canonical URLs and hreflang: one page, one address

Canonical URLs and hreflang in Next.js: killing duplicate content, reciprocal language links, localized slugs and x-default done right.

2026-07-15
Canonical URLs and hreflang: one page, one address
All topics in this guide
  1. 01Rendering strategy: what does the crawler actually see?
  2. 02Metadata API: titles, descriptions and the template pattern
  3. 03Canonical URLs and hreflang: one page, one address
  4. 04Open Graph and dynamic OG images
  5. 05sitemap.ts and robots.ts: file conventions instead of hand-written XML
  6. 06Structured data: JSON-LD that earns rich results
  7. 07Images, fonts and scripts: the classic performance trio
  8. 08Core Web Vitals: the three numbers Google measures
  9. 09Redirects, 404s and status codes
  10. 10Caching and content freshness
  11. 11AEO/GEO: getting cited by ChatGPT, Perplexity and Google AI Overviews
  12. 12Monitoring: SEO is a loop, not a launch task
  13. 13Trust and E-E-A-T: making your site believable
  14. 14Image SEO: turning pictures into traffic
  15. 15Internal linking and site architecture
  16. 16Search intent: pages that match what people actually type
  17. 17Programmatic SEO in Next.js: pages at scale without the spam
  18. 18SEO migration: replatforming to Next.js without losing traffic
  19. 19Pagination and faceted navigation without index bloat
  20. 20Accessibility and SEO: one job, two rewards
  21. 21Content decay: refresh, consolidate or prune
  22. 22Off-page for developers: earning links without buying them

Duplicate content can create indexing ambiguity on multilingual and parameterized sites. Two mechanisms help manage it:

Canonical identifies the preferred URL

It tells search engines which URL is preferred when several serve the same content (tracking params, trailing slashes, pagination):

export async function generateMetadata({ params }): Promise<Metadata> {
  return {
    alternates: {
      canonical: `/blog/${params.slug}`,
    },
  };
}

hreflang connects language versions

It tells search engines which language versions exist and helps them select a relevant version. The lookup depends on the content model; this example assumes getLocalizedUrls() returns the real URL for each locale:

export async function generateMetadata({ params }): Promise<Metadata> {
  const { lang } = params;
  const localizedUrls = await getLocalizedUrls(params);

  return {
    alternates: {
      canonical: localizedUrls[lang],
      languages: {
        ...localizedUrls,
        "x-default": localizedUrls.en,
      },
    },
  };
}

Common implementation mistakes

  • hreflang must be reciprocal. If the EN page lists the PL version, the PL page must list the EN one back — otherwise Google may disregard the group.
  • Every page must include itself in the languages map.
  • Localized slugs: if your Polish post lives at a different slug, the hreflang map has to point to the actual localized URL, not a mechanical /pl/ + same-slug guess. Generate the map from your content source, don't hardcode it.
  • x-default covers users whose language you don't serve — point it at your primary locale.
  • Canonical must point to a page that returns 200 and isn't noindex — a canonical to a redirecting URL is ignored.

Checklist:

  • Self-referencing canonical on every indexable page
  • hreflang generated from real localized slugs, reciprocal in all directions
  • x-default present
  • URL parameters (utm, filters, sorting) canonicalized to the clean URL
← PreviousMetadata API: titles, descriptions and the template patternNext →Open Graph and dynamic OG images

01—22

All topics in this guide

  1. 01Rendering strategy: what does the crawler actually see?→
  2. 02Metadata API: titles, descriptions and the template pattern→
  3. 03Canonical URLs and hreflang: one page, one address•
  4. 04Open Graph and dynamic OG images→
  5. 05sitemap.ts and robots.ts: file conventions instead of hand-written XML→
  6. 06Structured data: JSON-LD that earns rich results→
  7. 07Images, fonts and scripts: the classic performance trio→
  8. 08Core Web Vitals: the three numbers Google measures→
  9. 09Redirects, 404s and status codes→
  10. 10Caching and content freshness→
  11. 11AEO/GEO: getting cited by ChatGPT, Perplexity and Google AI Overviews→
  12. 12Monitoring: SEO is a loop, not a launch task→
  13. 13Trust and E-E-A-T: making your site believable→
  14. 14Image SEO: turning pictures into traffic→
  15. 15Internal linking and site architecture→
  16. 16Search intent: pages that match what people actually type→
  17. 17Programmatic SEO in Next.js: pages at scale without the spam→
  18. 18SEO migration: replatforming to Next.js without losing traffic→
  19. 19Pagination and faceted navigation without index bloat→
  20. 20Accessibility and SEO: one job, two rewards→
  21. 21Content decay: refresh, consolidate or prune→
  22. 22Off-page for developers: earning links without buying them→

Want this handled for you?

I audit and fix technical SEO on Next.js sites — indexing, performance, hreflang and AI visibility.

Technical SEO service