How We Got 100/100 SEO Score on PageSpeed Insights
A 100/100 PageSpeed SEO score means no detectable technical SEO issues — not the same as ranking well, but still worth reaching.
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.
5. Crawlable Links
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 crawlersAllow: /— allows crawling of all pathsSitemap:— 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
altattributes (empty string for decorative images) - [ ] All links have valid, crawlable
hrefattributes - [ ] Structured data is valid JSON-LD with no policy violations
- [ ]
robots.txtis syntactically valid and returns 200 - [ ]
sitemap.xmlis referenced inrobots.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.*
📬 Get the latest AI tool reviews
Expert picks and comparisons, weekly. No spam.