All checks
SEO & AI Visibilitylowmissing-canonical-urlchecked on every page we scan

No canonical URL declared

This page declares no canonical URL, so search engines have to guess which address is the real one when the same content is reachable at several — with and without www, with and without a trailing slash, or with tracking parameters appended by an ad campaign.

Why it matters

This page declares no canonical URL, so search engines have to guess which address is the real one when the same content is reachable at several — with and without www, with and without a trailing slash, or with tracking parameters appended by an ad campaign. When they guess differently from you, ranking signals are split across the variants instead of accumulating on one.

How ShipReady detects it

Search-engine basics, deliberately shallow. Lighthouse does SEO auditing thoroughly, for free, from Google, built into every browser. This module does not try to compete with that and should never grow to. It exists so a ShipReady report is not conspicuously silent on the subject, and it covers exactly the things a founder is likely to have got wrong without knowing — chiefly a `noindex` left over from staging, which makes a site invisible to search entirely. Every rule reads only the page HTML and response headers already fetched by PageContext. The module issues **no HTTP requests of its own**, which is why it can be this cheap: it is pure analysis of bytes the scan already has. Deliberately NOT covered: keyword analysis, backlinks, content quality, Core Web Vitals, and anything else that needs crawling or a second data source. Also not duplicated here: title, description, og:title, robots.txt, sitemap.xml and custom 404, all of which the readiness check already reports.

Detection is deterministic. ShipReady reports this only when it observes the condition directly, and prefers to miss a real problem over inventing one. Rule version 1.3.0.

How to fix it

This is the prompt ShipReady puts in your report — written to be pasted straight into Cursor, Claude Code, or whichever assistant built the app.

Add a canonical URL so search engines know which address is authoritative when the same page is reachable at several. In Next.js set `alternates: {{ canonical: '...' }}` in the page metadata; otherwise add <link rel="canonical" href="https://yourdomain.com/the-page"> to the head. Use the absolute URL, point every variant (www/non-www, trailing slash, tracking parameters) at the same canonical form, and make sure each page declares its own rather than every page declaring the homepage.

Frequently asked questions

What does "No canonical URL declared" mean?
This page declares no canonical URL, so search engines have to guess which address is the real one when the same content is reachable at several — with and without www, with and without a trailing slash, or with tracking parameters appended by an ad campaign.
How serious is it?
ShipReady rates this low. Worth fixing. Small individually, and they accumulate.
How do I fix it?
Paste the fix prompt on this page into Cursor, Claude Code or your AI editor. It is the same prompt ShipReady puts in your report.
Can I check my own site?
Yes — ShipReady scans up to ten pages of any public site for free and reports this alongside every other check. The free report lists every issue it finds and shows full evidence and a fix prompt for the critical and high-severity ones; medium and low findings are counted and unlock on Pro.

Related checks

Run this check on your site

ShipReady checks this and 193 other things across up to ten pages of your site, with an AI-ready fix for each. Free, no signup.