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 19 of 22

Pagination and faceted navigation without index bloat

Pagination and filters in Next.js done right: self-canonical page URLs, infinite scroll with real URLs, and which facet combinations deserve to be indexed.

2026-07-15
Pagination and faceted navigation without index bloat

All topics in this guide

A practical, section-by-section SEO checklist for Next.js: rendering strategy, Metadata API, hreflang, structured data, Core Web Vitals, and optimization for AI answer engines.

Category listings, blog archives and filtered views generate more URLs than the rest of your site combined — and most of them shouldn't be indexed. This is where crawl budget dies and where duplicate-content problems are actually born. The goal: crawlers reach every product/post, while junk URL permutations stay out of the index.

Pagination: real URLs, self-canonical

  • Every page gets a real, linkable URL: /blog/page/2 or ?page=2. Page 2 must exist as HTML the crawler can request.
  • Each page canonicals to itself — not to page 1. Canonicalizing page 2 to page 1 tells Google "page 2 is a duplicate", and everything linked only from page 2+ quietly falls out of discovery. This remains the most common pagination mistake.
  • rel="prev/next" was retired by Google in 2019 — what matters now is plain <a href> links between pages (numbered links help crawlers reach deep pages faster than next-only chains).
  • Titles should differ: append "— Page 2" to avoid duplicate-title noise.

In Next.js, path-based pages can be fully static:

// app/blog/page/[num]/page.tsx
export async function generateStaticParams() {
  const pages = Math.ceil((await getPostCount()) / PAGE_SIZE);
  return Array.from({ length: pages - 1 }, (_, i) => ({ num: String(i + 2) }));
}

Infinite scroll: pair it with real pages

"Load more" and infinite scroll are client-side — crawlers don't scroll. The robust pattern: keep paginated URLs as the crawlable backbone, update the address bar with the History API as the user scrolls (/page/3 when they reach chunk 3), and make each such URL render that chunk server-side on direct load. Users get the smooth feed; crawlers get pages.

Facets: the combinatorial explosion

A category with 6 filters × 10 values each yields millions of URL permutations. Classify facets into three tiers:

  1. Index-worthy — combinations with real search demand and stable inventory ("red running shoes", "apartments with balcony in Warsaw"). Give them clean static paths (/running-shoes/red), unique titles/intros, self-canonical, in the sitemap. These are effectively programmatic SEO pages — apply the same unique-value bar.
  2. Useful but not indexable — sort orders, price sliders, multi-select combos. Keep them as query params, robots: { index: false, follow: true }, canonical to the base category.
  3. Crawl traps — session params, infinite calendar/date combinations. Block in robots.txt so they don't eat crawl budget at all (noindex still requires crawling every URL to be seen).

Never let filters generate links the crawler can follow into tier-3 space — render those controls as buttons/forms, not <a href>.

Checklist:

  • Paginated pages: real URLs, self-canonical, numbered <a> links, distinct titles
  • No canonical-to-page-1; nothing reachable only via infinite scroll
  • Facets classified into indexable / noindex,follow / robots-blocked tiers
  • Index-worthy combos get static paths, unique content and sitemap entries
  • Crawl-trap params never rendered as crawlable <a href> links
← PreviousSEO migration: replatforming to Next.js without losing trafficNext →Accessibility and SEO: one job, two rewards

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