Building in Public#building-in-public

How We Got 100/100 SEO Score on PageSpeed Insights

By Mohamed Abdi Guled

A 100/100 PageSpeed SEO score means no detectable technical SEO issues — not the same as ranking well, but still worth reaching.

How We Got 100/100 SEO Score on PageSpeed

ShabelleHub scored 100/100 for SEO on PageSpeed Insights. This is not the same as "ranking well in Google" — PageSpeed's SEO score measures whether a page follows technical SEO best practices, not whether it ranks for competitive keywords. But it is a meaningful signal: a 100 SEO score means no detectable technical SEO issues.

This article covers what PageSpeed's SEO score actually measures, what we had to fix to reach 100, and which issues mattered most.


What the PageSpeed SEO Score Measures

PageSpeed Insights uses Lighthouse under the hood. The SEO score is a composite of several audits:

| Audit | What it checks |

|-------|---------------|

| Document has a <title> element | Title tag present and non-empty |

| Document has a meta description | Meta description present |

| Page has successful HTTP status code | No 4xx or 5xx response |

| Links have descriptive text | Anchor text is not generic ("click here", "read more") |

| Document has a valid hreflang | Language tags are correctly formatted |

| Document has a valid rel=canonical | Canonical URL is correctly specified |

| robots.txt is valid | robots.txt follows the correct format |

| Image elements have [alt] attributes | All images have alt text |

| Links are crawlable | All links have valid href attributes |

| <meta name="viewport"> tag | Viewport meta tag is present |

| Structured data is valid | JSON-LD passes schema.org validation |

A 100/100 means passing all of these audits. Each one is binary — either the audit passes or it does not contribute to the score.


What We Fixed

1. Meta Descriptions on Every Page

The original codebase had meta descriptions on most pages but not all. Category pages generated by getStaticPaths were missing descriptions because the initial implementation did not include them in the component's <NextSeo> props.

Fix:

// pages/tools/category/[category].js
<NextSeo
  title={`Best ${category.name} AI Tools (2026) — Reviewed & Ranked`}
  description={`${category.description} We have reviewed ${categoryTools.length} ${category.name.toLowerCase()} AI tools hands-on — see ratings, pricing, and honest pros and cons.`}
  canonical={`https://shabellehub.com/tools/category/${categoryToSlug(category.name)}`}
/>

Every page now has a unique, descriptive meta description. The description is generated from real data — the category description and the actual tool count for that category.

2. Canonical URLs on All Pages

Canonical URLs tell Google which URL to index when the same content is accessible at multiple addresses. Without a canonical, Google may index query-parameter variants as separate pages.

Every page on ShabelleHub now specifies a canonical URL:

// Consistent pattern across all pages
<NextSeo
  canonical="https://shabellehub.com/tools/category/coding"
/>

The next-seo library renders this as:

<link rel="canonical" href="https://shabellehub.com/tools/category/coding" />

Dynamic pages use template literals to generate the canonical from the page's data:

const canonical = `${siteConfig.url}/tools/${tool.slug}`;

3. Structured Data Validity

The PageSpeed SEO audit includes a structured data check. Our original AggregateRating schema with fabricated reviewCount values failed this check — not because the JSON was malformed, but because the values were implausible (18,500 reviews for a new site).

After replacing AggregateRating with a publisher Review schema, the structured data audit passed. Every tool page now emits valid, honest schema that matches the visible content.

4. Image Alt Text

Every <img> element requires an alt attribute. Empty alt (alt="") is acceptable for decorative images — it tells screen readers to skip the image. Missing alt entirely fails the audit.

ShabelleHub uses minimal images — mainly the og-image.png for Open Graph previews and tool icons. All images were confirmed to have alt attributes before the audit.

The audit checks that all links have valid href attributes that crawlers can follow. Links with href="#" or href="javascript:void(0)" fail this check.

We found one instance: a pagination placeholder that used href="#". This was replaced with a conditional render — if there is no next page, the button is disabled rather than pointing to #.


What the SEO Score Does Not Measure

PageSpeed's SEO score is a technical audit, not a ranking audit. A 100/100 means the page follows technical best practices. It does not measure:

  • Keyword targeting — whether the page targets queries with search volume
  • Content quality — whether the content is helpful and original
  • Backlinks — external links pointing to the page
  • Core Web Vitals — page speed and user experience metrics (these affect ranking but are in a separate Lighthouse score)
  • E-E-A-T — experience, expertise, authoritativeness, and trustworthiness signals

A site can score 100/100 on the Lighthouse SEO audit and still rank poorly because it has thin content, no backlinks, or targets zero-volume keywords. Conversely, sites with technical SEO issues can still rank well on strong content and authority.

The 100 score means the technical foundation is correct. What happens above that foundation depends on content and links.


The Scores in Context

ShabelleHub's full PageSpeed Insights scores on desktop:

| Score | Value |

|-------|-------|

| Performance | 98 |

| Accessibility | 91 |

| Best Practices | 96 |

| SEO | 100 |

The 98 Performance score reflects the work done on font loading, bundle size reduction, and removing unnecessary JavaScript. The 91 Accessibility score reflects correct heading hierarchy, ARIA labels, and keyboard navigation — with some room for improvement in colour contrast ratios at smaller text sizes.

The 100 SEO score reflects the technical SEO work: unique metadata on every page, valid canonical URLs, structured data that passes validation, crawlable links, and a correctly formatted robots.txt.


The robots.txt

A valid robots.txt is one of the Lighthouse SEO audits. ShabelleHub's public/robots.txt:

User-agent: *
Allow: /

Sitemap: https://shabellehub.com/sitemap.xml

This is the minimum correct configuration for a site that wants all pages indexed:

  • User-agent: * — applies to all crawlers
  • Allow: / — allows crawling of all paths
  • Sitemap: — tells crawlers where to find the sitemap

The robots.txt audit fails if the file has syntax errors, contradictory directives (Allow and Disallow for the same path), or if the file returns a non-200 HTTP status. Ours was already correctly formatted and passed without changes.


Reaching 100: The Checklist

For a Next.js site aiming for a 100 Lighthouse SEO score:

  • [ ] Every page has a unique <title> tag
  • [ ] Every page has a unique meta description under 160 characters
  • [ ] Every page has a canonical URL matching its primary URL
  • [ ] All images have alt attributes (empty string for decorative images)
  • [ ] All links have valid, crawlable href attributes
  • [ ] Structured data is valid JSON-LD with no policy violations
  • [ ] robots.txt is syntactically valid and returns 200
  • [ ] sitemap.xml is referenced in robots.txt
  • [ ] Viewport meta tag is present in _document.js
  • [ ] No pages return 4xx or 5xx HTTP status codes

Every item on this list is a concrete, fixable technical issue. None of them require keyword research, content strategy, or link building. They are the floor of technical SEO — the conditions that must be met before anything else can work.


*This article is part of the ShabelleHub Building in Public series.*

*Next: Firebase to Supabase: Complete Migration Guide*

📬 Get the latest AI tool reviews

Expert picks and comparisons, weekly. No spam.

← Back to Blog