Media and links
28 checks: alt text, image delivery, anchor text and broken links.
Images are usually most of what a page has to download, and links are how both readers and crawlers move through a site. 28 checks across the two.
Alt text
| Check | What it looks for |
|---|---|
media.alt_missing | Images with no alt attribute. Both an accessibility failure and a lost description of your own content. |
media.alt_text | Alt text present and describing the image. |
media.alt_keyword_stuffed | Alt text written for a crawler rather than for a person. It is read aloud to somebody using a screen reader, which is what makes this worse than useless. |
A decorative image, a divider or a background flourish, should have an empty alt attribute rather than no alt attribute. alt="" tells a screen reader to skip it. A missing attribute makes it read the filename out instead.
Image delivery
| Check | What it looks for |
|---|---|
media.missing_dimensions | Images without width and height. The browser cannot reserve space, so the page jumps when each one arrives. This is the most common cause of a failing CLS score. |
media.legacy_format | JPEG or PNG where WebP or AVIF would be substantially smaller for the same quality. |
media.not_responsive | No srcset, so a phone downloads the desktop image at full size. |
media.no_lazy_loading | Images below the fold loading immediately, competing for bandwidth with the content somebody is actually looking at. |
media.hero_lazy_loaded | The opposite mistake: lazy loading applied to the image at the top of the page, which delays it and directly worsens LCP. |
Lazy loading everything is a common and costly default. The rule is simple: lazy load what is below the fold, never what is above it. media.hero_lazy_loaded exists because applying loading="lazy" site-wide reliably makes the one image that matters arrive last.
Links on the page
| Check | What it looks for |
|---|---|
links.none | No links out of the page at all. It is a dead end for a crawler. |
links.distribution | The balance of internal to external links. Internal links are how authority moves around your own site. |
links.excessive_external | A great many links off-site relative to the content. |
links.rel_attributes | Whether nofollow, sponsored and ugc are used where they should be. |
links.undisclosed_affiliate | Links that look like affiliate links without rel="sponsored". A guidelines problem before it is an SEO one. |
links.dead_fragment | An in-page link such as #pricing pointing at an id that is not on the page. |
Anchor text
Anchor text tells a search engine what the page you are linking to is about, and tells a reader whether to click. "Click here" does neither.
| Check | What it looks for |
|---|---|
links.empty_anchor | A link with no text at all, usually an image or icon link with no alt text either. |
links.non_descriptive_anchor | "Click here", "read more", "this page". The link text describes the act of clicking, not the destination. |
links.repeated_anchor | The same anchor text pointing at several different pages, which makes all of them ambiguous. |
Broken links
We follow the links on the page and report the ones that do not resolve. Broken outbound links are a quality signal in the wrong direction, and a broken internal link is a page nobody can reach.
| Check | What it looks for |
|---|---|
links.broken | Links returning an error. The finding lists each URL and the status it returned. |
links.no_broken | Every link we could check resolved. |
links.no_probeable | Nothing on the page could be checked, usually because every link is in-page or uses a non-http scheme. |
Link checking is bounded. We do not follow every link on a page with two thousand of them, and a site that rate-limits us will show links as unreachable that a browser reaches. Treat a broken link finding as a list to check rather than as a verdict. To sweep a whole site properly, use Site crawl.