SEO optimization
Search engine optimization based on Lighthouse SEO audits and Google Search guidelines. Focus on technical SEO, on-page optimization, and structured data.
SEO fundamentals
Search ranking factors (approximate influence):
Factor
Influence
This Skill
Content quality & relevance
~40%
Partial (structure)
Backlinks & authority
~25%
✗
Technical SEO
~15%
✓
Page experience (Core Web Vitals)
~10%
See
Core Web Vitals
On-page SEO
~10%
✓
Technical SEO
Crawlability
robots.txt:
/robots.txt
User-agent: *
Allow: /
Block admin/private areas
Disallow: /admin/
Disallow: /api/
Disallow: /private/
Don't block resources needed for rendering
❌ Disallow: /static/
Sitemap: https://example.com/sitemap.xml
Meta robots:
<
meta
name
=
"
robots
"
content
=
"
index, follow
"
<
meta
name
=
"
robots
"
content
=
"
noindex, nofollow
"
<
meta
name
=
"
robots
"
content
=
"
index, nofollow
"
<
meta
name
=
"
robots
"
content
=
"
max-snippet:150, max-image-preview:large
"
Canonical URLs:
<
link
rel
=
"
canonical
"
href
=
"
https://example.com/page
"
<
link
rel
=
"
canonical
"
href
=
"
https://example.com/current-page
"
<
link
rel
=
"
canonical
"
href
=
"
https://example.com/products
"
XML sitemap
<
urlset
xmlns
=
"
http://www.sitemaps.org/schemas/sitemap/0.9
"
<
url
<
loc
https://example.com/
</
loc
<
lastmod
2024-01-15
</
lastmod
<
changefreq
daily
</
changefreq
<
priority
1.0
</
priority
</
url
<
url
<
loc
https://example.com/products
</
loc
<
lastmod
2024-01-14
</
lastmod
<
changefreq
weekly
</
changefreq
<
priority
0.8
</
priority
</
url
</
urlset
Sitemap best practices:
Maximum 50,000 URLs or 50MB per sitemap
Use sitemap index for larger sites
Include only canonical, indexable URLs
Update
lastmod
when content changes
Submit to Google Search Console
URL structure
✅ Good URLs:
https://example.com/products/blue-widget
https://example.com/blog/how-to-use-widgets
❌ Poor URLs:
https://example.com/p?id=12345
https://example.com/products/item/category/subcategory/blue-widget-2024-sale-discount
URL guidelines:
Use hyphens, not underscores
Lowercase only
Keep short (< 75 characters)
Include target keywords naturally
Avoid parameters when possible
Use HTTPS always
HTTPS & security
<
img
src
=
"
https://example.com/image.jpg
"
<
img
src
=
"
http://example.com/image.jpg
"
Security headers for SEO trust signals:
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
On-page SEO
Title tags
<
title
Page
</
title
<
title
Home
</
title
<
title
Blue Widgets for Sale | Premium Quality | Example Store
</
title
Title tag guidelines:
50-60 characters (Google truncates ~60)
Primary keyword near the beginning
Unique for every page
Brand name at end (unless homepage)
Action-oriented when appropriate
Meta descriptions
<
meta
name
=
"
description
"
content
=
"
"
<
meta
name
=
"
description
"
content
=
"
Shop premium blue widgets with free shipping. 30-day returns. Rated 4.9/5 by 10,000+ customers. Order today and save 20%.
"
Meta description guidelines:
150-160 characters
Include primary keyword naturally
Compelling call-to-action
Unique for every page
Matches page content
Heading structure
<
h2
Welcome to Our Store
</
h2
<
h4
Products
</
h4
<
h1
Contact Us
</
h1
<
h1
Blue Widgets - Premium Quality
</
h1
<
h2
Product Features
</
h2
<
h3
Durability
</
h3
<
h3
Design
</
h3
<
h2
Customer Reviews
</
h2
<
h2
Pricing
</
h2
Heading guidelines:
Single
per page (the main topic)
Logical hierarchy (don't skip levels)
Include keywords naturally
Descriptive, not generic
Image SEO
<
img
src
=
"
IMG_12345.jpg
"
>
<
img
src
=
"
blue-widget-product-photo.webp
"
alt
=
"
Blue widget with chrome finish, side view showing control panel
"
width
=
"
800
"
height
=
"
600
"
loading
=
"
lazy
"
>
Image guidelines:
Descriptive filenames with keywords
Alt text describes the image content
Compressed and properly sized
WebP/AVIF with fallbacks
Lazy load below-fold images
Internal linking
<
a
href
=
"
/products
"
>
Click here
a
>
<
a
href
=
"
/widgets
"
>
Read more
a
>
<
a
href
=
"
/products/blue-widgets
"
>
Browse our blue widget collection
a
>
<
a
href
=
"
/guides/widget-maintenance
"
>
Learn how to maintain your widgets
a
>
Linking guidelines:
Descriptive anchor text with keywords
Link to relevant internal pages
Reasonable number of links per page
Fix broken links promptly
Use breadcrumbs for hierarchy
Structured data (JSON-LD)
Organization
<
script
type
=
"
application/ld+json
"
>
{
"@context"
:
"https://schema.org"
,
"@type"
:
"Organization"
,
"name"
:
"Example Company"
,
"url"
:
"https://example.com"
,
"logo"
:
"https://example.com/logo.png"
,
"sameAs"
:
[
"https://twitter.com/example"
,
"https://linkedin.com/company/example"
]
,
"contactPoint"
:
{
"@type"
:
"ContactPoint"
,
"telephone"
:
"+1-555-123-4567"
,
"contactType"
:
"customer service"
}
}
script
>
Article
<
script
type
=
"
application/ld+json
"
>
{
"@context"
:
"https://schema.org"
,
"@type"
:
"Article"
,
"headline"
:
"How to Choose the Right Widget"
,
"description"
:
"Complete guide to selecting widgets for your needs."
,
"image"
:
"https://example.com/article-image.jpg"
,
"author"
:
{
"@type"
:
"Person"
,
"name"
:
"Jane Smith"
,
"url"
:
"https://example.com/authors/jane-smith"
}
,
"publisher"
:
{
"@type"
:
"Organization"
,
"name"
:
"Example Blog"
,
"logo"
:
{
"@type"
:
"ImageObject"
,
"url"
:
"https://example.com/logo.png"
}
}
,
"datePublished"
:
"2024-01-15"
,
"dateModified"
:
"2024-01-20"
}
script
>
Product
<
script
type
=
"
application/ld+json
"
>
{
"@context"
:
"https://schema.org"
,
"@type"
:
"Product"
,
"name"
:
"Blue Widget Pro"
,
"image"
:
"https://example.com/blue-widget.jpg"
,
"description"
:
"Premium blue widget with advanced features."
,
"brand"
:
{
"@type"
:
"Brand"
,
"name"
:
"WidgetCo"
}
,
"offers"
:
{
"@type"
:
"Offer"
,
"price"
:
"49.99"
,
"priceCurrency"
:
"USD"
,
"availability"
:
"https://schema.org/InStock"
,
"url"
:
"https://example.com/products/blue-widget"
}
,
"aggregateRating"
:
{
"@type"
:
"AggregateRating"
,
"ratingValue"
:
"4.8"
,
"reviewCount"
:
"1250"
}
}
script
>
FAQ
<
script
type
=
"
application/ld+json
"
>
{
"@context"
:
"https://schema.org"
,
"@type"
:
"FAQPage"
,
"mainEntity"
:
[
{
"@type"
:
"Question"
,
"name"
:
"What colors are available?"
,
"acceptedAnswer"
:
{
"@type"
:
"Answer"
,
"text"
:
"Our widgets come in blue, red, and green."
}
}
,
{
"@type"
:
"Question"
,
"name"
:
"What is the warranty?"
,
"acceptedAnswer"
:
{
"@type"
:
"Answer"
,
"text"
:
"All widgets include a 2-year warranty."
}
}
]
}
script
>
Breadcrumbs
<
script
type
=
"
application/ld+json
"
>
{
"@context"
:
"https://schema.org"
,
"@type"
:
"BreadcrumbList"
,
"itemListElement"
:
[
{
"@type"
:
"ListItem"
,
"position"
:
1
,
"name"
:
"Home"
,
"item"
:
"https://example.com"
}
,
{
"@type"
:
"ListItem"
,
"position"
:
2
,
"name"
:
"Products"
,
"item"
:
"https://example.com/products"
}
,
{
"@type"
:
"ListItem"
,
"position"
:
3
,
"name"
:
"Blue Widgets"
,
"item"
:
"https://example.com/products/blue-widgets"
}
]
}
script
>
Validation
Test structured data at:
Google Rich Results Test
Schema.org Validator
Mobile SEO
Responsive design
<
meta
name
=
"
viewport
"
content
=
"
width=1024
"
>
<
meta
name
=
"
viewport
"
content
=
"
width=device-width, initial-scale=1
"
>
Tap targets
/* ❌ Too small for mobile */
.small-link
{
padding
:
4
px
;
font-size
:
12
px
;
}
/* ✅ Adequate tap target */
.mobile-friendly-link
{
padding
:
12
px
;
font-size
:
16
px
;
min-height
:
48
px
;
min-width
:
48
px
;
}
Font sizes
/* ❌ Too small on mobile */
body
{
font-size
:
10
px
;
}
/* ✅ Readable without zooming */
body
{
font-size
:
16
px
;
line-height
:
1.5
;
}
International SEO
Hreflang tags
<
link
rel
=
"
alternate
"
hreflang
=
"
en
"
href
=
"
https://example.com/page
"
>
<
link
rel
=
"
alternate
"
hreflang
=
"
es
"
href
=
"
https://example.com/es/page
"
>
<
link
rel
=
"
alternate
"
hreflang
=
"
fr
"
href
=
"
https://example.com/fr/page
"
>
<
link
rel
=
"
alternate
"
hreflang
=
"
x-default
"
href
=
"
https://example.com/page
"
>
Language declaration
<
html
lang
=
"
en
"
>
<
html
lang
=
"
es-MX
"
>
SEO audit checklist
Critical
HTTPS enabled
robots.txt allows crawling
No
noindex
on important pages
Title tags present and unique
Single
per page
High priority
Meta descriptions present
Sitemap submitted
Canonical URLs set
Mobile-responsive
Core Web Vitals passing
Medium priority
Structured data implemented
Internal linking strategy
Image alt text
Descriptive URLs
Breadcrumb navigation
Ongoing
Fix crawl errors in Search Console
Update sitemap when content changes
Monitor ranking changes
Check for broken links
Review Search Console insights
Tools
Tool
Use
Google Search Console
Monitor indexing, fix issues
Google PageSpeed Insights
Performance + Core Web Vitals
Rich Results Test
Validate structured data
Lighthouse
Full SEO audit
Screaming Frog
Crawl analysis
References
Google Search Central
Schema.org
Core Web Vitals
Web Quality Audit