Why it matters
Google asks for absolute canonical URLs; relative ones get resolved against unexpected bases (previews, proxies) and fragments are ignored. This is a scoring gate.
How to fix it
Set metadataBase in the root layout so alternates.canonical becomes absolute, and never include #fragments.
Example
// app/layout.tsx
export const metadata: Metadata = { metadataBase: new URL('https://acme.example') }References
More seo rules
void seo reports 60 rules in this category. What search engines need from the raw response: status codes, titles and descriptions in <head>, self-referencing canonicals, one h1, crawlable links, Open Graph, icons, robots.txt and a sitemap with real dates.
meta-description-missingNo meta description in <head>meta-description-lengthMeta description length outside 50–160 charactersmetadata-in-bodyCrawler receives <title>/canonical/description inside <body> (Next.js streaming metadata)canonical-missingNo single rel=canonical in <head>canonical-brokenCanonical points to a URL that returns 4xx/5xxcanonical-conflictCanonical target redirects, is noindex, or canonicalises elsewherecanonical-not-selfCanonical points to a different URLhead-js-mutationJavaScript changes canonical, robots, title or description after load