Paginated routes without rel=next/rel=prev or canonical consolidation get indexed as disconnected, competing URLs — page 2 of /products ranks against page 1 for the same keywords, splitting link equity and diluting ranking signals. Googlebot treats each paginated URL as a standalone thin page, which suppresses the whole listing's authority and can trigger soft-404 classification on sparse pages.
High because pagination errors split PageRank across competing URLs and suppress category-level rankings.
Emit pagination metadata on every listing route. In app/products/page.tsx, compute the canonical strategy based on the current page:
export async function generateMetadata({ searchParams }) {
const page = Number(searchParams.page) || 1
return { alternates: { canonical: `/products?page=${page}` } }
}
Prefer a single canonicalized view-all page when the listing fits under 100 items.
ID: seo-advanced.crawlability.pagination
Severity: high
What to look for: Count all paginated routes (pages with ?page=2, ?page=3, etc. or /page/2, /page/3 patterns). For each paginated route, check for <link rel="next"> and <link rel="prev"> tags, or canonical URLs pointing to page 1 for consolidation. Enumerate which strategy is used on each route.
Pass criteria: At least 90% of paginated routes use a consistent pagination strategy (either rel=next/prev links or canonical to page 1). Users can navigate through all pages and crawlers understand the pagination structure. Report: "X of Y paginated routes have pagination markup."
Fail criteria: Fewer than 90% of paginated routes have rel=next/prev or canonical strategy, or paginated pages are treated as separate indexable content without consolidation.
Skip (N/A) when: The project has no paginated content (no routes with page parameters or pagination UI).
Detail on fail: "3 of 5 paginated routes lack rel=next/prev — /products?page=2, /products?page=3, /blog?page=2 are canonicalized separately".
Remediation: Use pagination markup in app/products/page.tsx or whichever route handles pagination:
export const metadata = {
other: {
'rel-next': page < totalPages ? `https://yoursite.com/products?page=${page + 1}` : undefined,
'rel-prev': page > 1 ? `https://yoursite.com/products?page=${page - 1}` : undefined,
},
}