Items one through three: the basics that still trip teams
One, every leaf has a self-referencing canonical pointing at its own absolute https URL. Two, the canonical is rendered in the head, not in the body, and not via JavaScript at runtime. Three, the canonical URL matches the sitemap entry exactly, including trailing slashes. We have seen three production pSEO surfaces lose half their indexed pages to a trailing-slash mismatch between the canonical and the sitemap; Google treats them as different URLs and picks one, and rarely the one you wanted. The Next.js generateMetadata function makes the per-leaf canonical trivial; the sitemap.ts module composes the absolute URL from the same slug source.
Items four through six: parameters and protocol
Four, query parameters not part of the canonical surface get a canonical pointing at the parameter-free URL. UTM tags should never appear in canonicals. Five, the canonical uses the https protocol even if the page is served over http during local development; the production canonical is the source of truth. Six, the canonical uses the apex or the www subdomain consistent with your DNS choice; mixing the two is the second most common mis-fire we see. Your robots.txt and your sitemap must agree with whichever form the canonical takes.
Items seven through nine: indexing posture
Seven, leaves with noindex still need a canonical; the canonical points at the indexable version, not at a different URL. Eight, the canonical never points to a page that returns 404, 301, or 5xx; Google treats this as a hint to ignore the tag entirely. Nine, when you remove a slug from the manifest, the URL should 410 Gone or 301 to a successor, not just disappear. The sitemap automation in this surface handles items seven and eight automatically; item nine is the one editorial decision per removed slug.
