Technical SEO Audit for Astro Sites in 2026: The Complete Checklist
Astro's architecture provides SEO advantages, but you still need to audit. A practical guide to crawling, indexability, and performance optimization.
TL;DR
- Astro’s static-first architecture provides inherent SEO advantages: clean URLs, minimal JavaScript, fast rendering.
- Still need to audit: canonical tags, meta descriptions, structured data, sitemap, robots.txt, Core Web Vitals.
- Use Astro Islands with appropriate client directives to ship JavaScript only where needed.
- Target Lighthouse scores of 90+ across all metrics; use Screaming Frog or Ahrefs for crawl audits.
- Keep crawl depth ≤3 levels, fix broken links, eliminate redirect chains, and avoid orphan pages.
- Astro’s image component handles image optimization automatically—use it for all images.
Astro’s Built-in SEO Advantages
Before auditing, understand what Astro gives you for free:
| Feature | SEO Benefit |
|---|---|
| Static rendering | Fast page loads, no JS-dependent content |
| File-based routing | Clean, semantic URLs |
| Partial hydration | Minimal JavaScript shipped |
| Built-in image optimization | Optimized images, proper formats |
| Sitemap integration | Automatic sitemap generation |
These don’t guarantee good SEO—they make it easier to achieve.
The Audit Checklist
1. Crawlability
Robots.txt
# src/robots.txt
User-agent: *
Allow: /
Sitemap: https://yourdomain.com/sitemap-index.xml
Check:
- robots.txt exists at root
- Not blocking important pages
- Sitemap URL is correct
- No accidental
Disallow: /
Sitemap
// astro.config.mjs
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://yourdomain.com',
integrations: [sitemap()],
});
Check:
- Sitemap generates correctly
- All important pages included
- No broken URLs in sitemap
- Submitted to Google Search Console
Crawl Depth
Keep pages within 3 clicks of homepage:
Homepage
├── Category (1 click)
│ ├── Subcategory (2 clicks)
│ │ └── Article (3 clicks)
│ └── Article (2 clicks)
└── Article (1 click)
Check:
- Key pages within 3 clicks
- No orphan pages (pages with no internal links)
- Logical site hierarchy
2. Indexability
Canonical Tags
---
// src/layouts/BaseLayout.astro
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
---
<head>
<link rel="canonical" href={canonicalURL.href} />
</head>
Check:
- Every page has a canonical tag
- Canonical points to correct URL
- No canonical pointing to 404s
- Trailing slash consistency
Meta Tags
---
// src/components/SEO.astro
interface Props {
title: string;
description: string;
image?: string;
noindex?: boolean;
}
const { title, description, image, noindex } = Astro.props;
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
---
<title>{title}</title>
<meta name="description" content={description} />
<link rel="canonical" href={canonicalURL.href} />
{noindex && <meta name="robots" content="noindex,nofollow" />}
<!-- Open Graph -->
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:url" content={canonicalURL.href} />
{image && <meta property="og:image" content={image} />}
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
Check:
- Unique title for each page (50-60 chars)
- Unique description for each page (150-160 chars)
- Open Graph tags present
- Twitter cards configured
- No duplicate meta content
Structured Data
---
// src/components/ArticleSchema.astro
interface Props {
title: string;
description: string;
publishedAt: string;
author: string;
}
const { title, description, publishedAt, author } = Astro.props;
const canonicalURL = Astro.url.href;
const schema = {
"@context": "https://schema.org",
"@type": "BlogPosting",
headline: title,
description: description,
datePublished: publishedAt,
author: {
"@type": "Person",
name: author,
},
mainEntityOfPage: {
"@type": "WebPage",
"@id": canonicalURL,
},
};
---
<script type="application/ld+json" set:html={JSON.stringify(schema)} />
Check:
- Article/BlogPosting schema on blog posts
- Organization schema on homepage
- Breadcrumb schema on nested pages
- Validate with Rich Results Test
3. Performance (Core Web Vitals)
Astro Islands Configuration
<!-- Load immediately for above-fold interactive content -->
<Counter client:load />
<!-- Load when visible (lazy) -->
<HeavyWidget client:visible />
<!-- Load when browser is idle -->
<Analytics client:idle />
<!-- Never hydrate (static only) -->
<StaticComponent />
Check:
- Only essential components use
client:load - Below-fold components use
client:visibleorclient:idle - Non-interactive components have no client directive
Image Optimization
---
import { Image } from 'astro:assets';
import heroImage from '../assets/hero.jpg';
---
<Image
src={heroImage}
alt="Descriptive alt text"
widths={[400, 800, 1200]}
sizes="(max-width: 800px) 100vw, 800px"
loading="eager" <!-- for LCP images -->
/>
Check:
- Using Astro Image component
- All images have alt text
- LCP image has
loading="eager" - Responsive sizes configured
- WebP/AVIF formats generated
Font Optimization
/* Use system fonts or self-host */
@font-face {
font-family: 'Custom Font';
src: url('/fonts/custom.woff2') format('woff2');
font-display: swap;
font-weight: 400;
}
Check:
- Using
font-display: swap - Fonts self-hosted (not Google Fonts CDN)
- Limited font variations (weights, styles)
- Fonts preloaded if critical
4. Technical Issues
Broken Links
Use Screaming Frog or similar to crawl:
Check:
- No 404 internal links
- No redirect chains (>2 hops)
- No redirect loops
- External links valid
HTTPS and Security
Check:
- All pages serve over HTTPS
- No mixed content warnings
- HTTP redirects to HTTPS
- HSTS header configured
Mobile Friendliness
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
Check:
- Viewport meta tag present
- Tap targets adequately sized (48px minimum)
- No horizontal scrolling
- Text readable without zooming
5. Content Quality
Heading Structure
<h1>Page Title</h1> <!-- One per page -->
<h2>Main Section</h2>
<h3>Subsection</h3>
<h2>Another Section</h2>
Check:
- Single H1 per page
- Logical heading hierarchy
- No skipped levels (H1 → H3)
- Headings describe content
Internal Linking
Check:
- Key pages have multiple internal links
- Descriptive anchor text (not “click here”)
- Related content linked
- No orphan pages
Audit Tools
For Crawling
| Tool | Best For |
|---|---|
| Screaming Frog | Comprehensive crawl, technical issues |
| Ahrefs Site Audit | SEO issues, backlink analysis |
| Sitebulb | Visual crawl analysis |
| Semrush Site Audit | Integrated SEO platform |
For Performance
| Tool | Best For |
|---|---|
| Lighthouse | Core Web Vitals, lab data |
| PageSpeed Insights | Lab + field data |
| WebPageTest | Detailed waterfall analysis |
| Chrome UX Report | Real user data |
For Search Console
| Check | Why |
|---|---|
| Coverage report | Indexing issues |
| Core Web Vitals | Performance data |
| Manual actions | Penalties |
| Links | Internal/external link profile |
Audit Schedule
| Frequency | Check |
|---|---|
| Weekly | Search Console for errors |
| Monthly | Core Web Vitals, broken links |
| Quarterly | Full crawl audit |
| After changes | Affected pages’ indexability |
Implementation Checklist
Pre-Launch
- Canonical tags configured
- Meta descriptions written
- Structured data added
- Sitemap generating
- robots.txt configured
- Images optimized
- Performance tested
Post-Launch
- Submit sitemap to Search Console
- Verify indexing
- Monitor Core Web Vitals
- Set up crawl schedule
- Configure alerts for issues
Ongoing
- Monthly crawl check
- Quarterly full audit
- Update content freshness dates
- Fix broken links promptly
FAQ
How often should I audit my Astro site?
Monthly quick checks (Search Console, broken links), quarterly full audits (comprehensive crawl, content review).
What Lighthouse score should I target?
90+ across all categories. Astro sites should achieve this easily with proper configuration.
Do I need special handling for Astro Islands?
Only heavily interactive components need client directives. Static content doesn’t need hydration—that’s Astro’s advantage.
How do I audit dynamic content?
For SSR routes, ensure proper caching headers and validate rendered HTML matches expectations. Use the prerender option for static generation when possible.
Should I worry about JavaScript SEO?
Less with Astro than other frameworks. Astro renders to static HTML by default. Only client-hydrated islands need JavaScript.
How do I handle redirects in Astro?
Use your hosting platform’s redirect configuration (Vercel vercel.json, Netlify _redirects, etc.) for 301 redirects.
Sources & Further Reading
- Technical SEO with Astro — Astro’s SEO architecture
- Astro SEO Checklist — Comprehensive checklist
- Technical SEO Audit Guide — General methodology
- Ahrefs Site Audit — Free audit tool
- Moz Technical SEO Checklist — Best practices
- Astro Structured Data — Related: JSON-LD
- Web Performance Checklist — Related: Core Web Vitals
Interested in our research?
We share our work openly. If you'd like to collaborate or discuss ideas — we'd love to hear from you.
Get in Touch