Lighthouse audit link-text · SEO

Links do not have descriptive text: how to fix it

View raw .md for LLMs / your notes
Quick answer: This audit fails when link text is generic: phrases like "click here", "learn more", or "more" that say nothing about the destination. Fix it by rewriting each anchor to name what it points to. Descriptive link text helps search engines understand the linked page and helps screen reader users who navigate by link list.

This Lighthouse audit fails when the page contains links whose text is generic: "click here", "learn more", "more", "here". The links work. The problem is what the words carry, which is nothing. Anchor text is one of the oldest relevance signals on the web: it tells search engines what the linked page is about, and it tells a screen reader user scanning a list of links where each one goes. A page full of "learn more" anchors withholds that signal from every link on it.

TL;DR

Lighthouse collects the crawlable <a> elements on the rendered page (links with a real href; javascript: and mailto: links are skipped) and compares each anchor's text content against a blocklist of generic phrases. If any link's text matches, the audit fails and lists the offending anchors.

The English blocklist includes:

Lighthouse ships localized blocklists too, so "hier klicken" and "cliquez ici" fail the same way. The comparison is against the anchor's text after trimming, so <a href="/pricing">More</a> fails while <a href="/pricing">More pricing details</a> passes.

One detail that surprises people coming from the accessibility audits: this audit reads the anchor's text content, not its accessible name. An aria-label that names the destination will satisfy the link-name accessibility audit, but it does not change the outcome here. The fix for link-text is always rewriting the visible words.

Search engines use anchor text to understand the page a link points to. It is a signal you control on every internal link, and it is free: rewriting "click here to see our shipping rates" as "see our shipping rates" moves the signal onto the link without adding a word to the page.

Google's own Search Essentials guidance on links says the same thing directly: write anchor text that describes the destination, because Google uses it to understand the linked page. Ten internal links labelled "learn more" tell Google ten times that the destinations are about nothing in particular.

It also matters beyond rankings:

Rewrite the anchor so the words name the destination. The most reliable pattern: move the link onto the noun phrase that is usually already sitting in the sentence.

<!-- FAILS: the sentence has the information, the link doesn't -->
<p>Our full shipping policy is available. <a href="/shipping">Click here</a>.</p>

<!-- FIXED: link the words that describe the destination -->
<p>Read our <a href="/shipping">full shipping policy</a>.</p>

<!-- FAILS: card pattern with a bare "learn more" -->
<a href="/plans/pro" class="card-cta">Learn more</a>

<!-- FIXED: name the thing -->
<a href="/plans/pro" class="card-cta">Learn more about the Pro plan</a>

<!-- FAILS: bare "more" pagination-style link -->
<a href="/blog?page=2">More</a>

<!-- FIXED -->
<a href="/blog?page=2">More articles</a>

Guidelines that keep the rewrite honest:

  1. Name the destination, not the action. "Download the pricing PDF" beats "download now".
  2. Keep it short. A few words. The anchor is a label, not a sentence.
  3. Make anchors unique when destinations differ. Two links labelled "shipping policy" should go to the same place.
  4. Front-load the distinctive word. Screen reader users skim link lists alphabetically and by first word.

How do I fix this in React, WordPress, or Shopify?

React / Next.js

Card and CTA components are the usual source, because the label is a prop with a default:

// FAILS: every card renders the same generic CTA
<ArticleCard href={post.url} cta="Learn more" />

// FIXED: derive the label from the content
<ArticleCard href={post.url} cta={`Read: ${post.title}`} />

If the design insists on a short visible label, keep the visible text descriptive enough to pass and put the detail in the surrounding heading, not in an aria-label (which this audit ignores).

WordPress

The classic offender is the theme's "read more" / "learn more" excerpt link and button blocks pasted with default text. Check:

Shopify

In a scan of 269 production storefronts, link-text failed on 23% of them (62 of 269), almost always from theme sections with default copy:

The fix lives in the theme editor's section settings in nearly every case; no Liquid edit required.

How do I verify the fix?

  1. Re-run Lighthouse or PageSpeed Insights. The link-text audit should move into "Passed audits".
  2. Read the page's links as a list: in VoiceOver (VO+U, arrow to Links) or NVDA (Insert+F7). If you can tell where every link goes without seeing the page, the text is descriptive.
  3. Grep your codebase or templates for the blocklist phrases ("click here", "learn more") to catch instances on pages Lighthouse did not audit.
  4. For internal links, check GSC's Links report after a few weeks: better anchors improve how Google groups and describes your internal pages.

Audit your URL at https://lighthouse-md.com.

Audit your page now

Paste your URL, get scores plus a CLAUDE.md plan for Claude Code.

Run audit →
Add us as a preferred source on Google

One click, and Google shows more of lighthouse-md.com in your search results.