Back to blog
Engineering #SEO#Astro#audit

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.

15 min · January 12, 2026 · Updated January 27, 2026
Topic relevant background image

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:

FeatureSEO Benefit
Static renderingFast page loads, no JS-dependent content
File-based routingClean, semantic URLs
Partial hydrationMinimal JavaScript shipped
Built-in image optimizationOptimized images, proper formats
Sitemap integrationAutomatic 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:visible or client: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

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

ToolBest For
Screaming FrogComprehensive crawl, technical issues
Ahrefs Site AuditSEO issues, backlink analysis
SitebulbVisual crawl analysis
Semrush Site AuditIntegrated SEO platform

For Performance

ToolBest For
LighthouseCore Web Vitals, lab data
PageSpeed InsightsLab + field data
WebPageTestDetailed waterfall analysis
Chrome UX ReportReal user data

For Search Console

CheckWhy
Coverage reportIndexing issues
Core Web VitalsPerformance data
Manual actionsPenalties
LinksInternal/external link profile

Audit Schedule

FrequencyCheck
WeeklySearch Console for errors
MonthlyCore Web Vitals, broken links
QuarterlyFull crawl audit
After changesAffected 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

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

Let's build
something real.

No more slide decks. No more "maybe next quarter".
Let's ship your MVP in weeks.

Start Building Now