Skip to main content
Back to Blog
6 min read

Technical SEO every developer should ship by default (and which most skip)

The 12-item technical SEO checklist I run on every Next.js project. Most developers skip at least 5 of these. Each one takes under 30 minutes to implement.

performancenext.js

Most developers treat SEO as marketing's problem. It's not. Technical SEO is a code problem — and most of the damage happens when developers ship without it.

I've audited 15+ Next.js projects. Every single one had at least 5 of these 12 issues. Each fix takes under 30 minutes. Together, they're the difference between "Google can't index half your pages" and "your site works as expected."

The checklist

1. Canonical URLs on every page

Without a canonical tag, Google sees https://site.com/page, https://site.com/page/, and https://site.com/page?ref=twitter as three separate pages with duplicate content.

// app/[locale]/layout.tsx
export async function generateMetadata({ params }: Props) {
  const { locale } = await params
  return {
    alternates: {
      canonical: `https://dimaver6.com/${locale}`,
    },
  }
}

Every page. No exceptions.

2. hreflang for multilingual sites

If you have multiple languages, Google needs to know which page is the equivalent in each language. Without hreflang, Google might show the Russian page to English searchers.

alternates: {
  languages: {
    en: `/en/${slug}`,
    ru: `/ru/${slug}`,
    uk: `/uk/${slug}`,
  },
}

I wrote a full guide on i18n routing and SEO patterns including hreflang and x-default.

3. Sitemap with accurate lastmod

A sitemap tells Google "here are all my pages." But a sitemap with wrong lastmod dates is worse than no sitemap — it trains Google to ignore your freshness signals.

// app/sitemap.ts — WRONG
lastModified: new Date(), // every build = "everything changed"

// app/sitemap.ts — RIGHT
lastModified: post.date, // actual content change date

Set lastmod to the actual date the content was last meaningfully changed. Not the build date. Not new Date().

4. robots.txt that doesn't block itself

I've seen Next.js projects where robots.txt accidentally blocked the sitemap, the API routes, or the _next/static directory.

// app/robots.ts
export default function robots() {
  return {
    rules: { userAgent: '*', allow: '/' },
    sitemap: 'https://dimaver6.com/sitemap.xml',
  }
}

After deploying, verify: curl https://yoursite.com/robots.txt. Check that it allows / and points to the correct sitemap URL.

5. Meta titles under 60 characters

Google truncates titles longer than ~60 characters. A title that reads "How Much Does a Custom SaaS MVP Cost in 2026? A Real Breakdow..." loses its punch.

// ✅ 54 characters
title: 'Custom SaaS MVP cost in 2026 — real breakdown'

// ❌ 78 characters — gets truncated
title: 'How much does a custom SaaS MVP cost in 2026? A real breakdown from 30 projects'

Put the keyword near the start. Brand at the end (if anywhere).

6. Meta descriptions that match search intent

Google uses the meta description as the snippet in search results. If yours is generic, Google rewrites it (poorly). If it's specific, Google shows yours — and you control the click.

description: 'Line-by-line cost breakdown of a real €12K Next.js MVP: auth, payments, admin, testing, deployment. With what I would cut to hit €8K.'

Include the primary keyword, a specific detail (€12K), and a reason to click ("what I would cut"). Under 155 characters.

7. Structured data (JSON-LD)

Structured data gives Google explicit information about your content type. For blog posts, Article schema. For services, Service schema. For the business, LocalBusiness or ProfessionalService.

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{
    __html: JSON.stringify({
      '@context': 'https://schema.org',
      '@type': 'Article',
      headline: post.title,
      datePublished: post.date,
      author: {
        '@type': 'Person',
        name: 'Dmitry Vereschagin',
      },
    }),
  }}
/>

Structured data doesn't directly affect ranking, but it enables rich snippets (star ratings, dates, FAQs) that dramatically improve click-through rates.

8. Image alt text and dimensions

Every <Image> needs three things:

<Image
  src="/projects/e7-dashboard.webp"
  alt="E7 Platform event dashboard showing ticket sales graph and check-in statistics"
  width={1200}
  height={630}
/>

Missing alt text means Google Image Search can't index your images. Missing dimensions means layout shift (CLS), which is a ranking factor.

Google discovers pages by following links. If a page has no internal links pointing to it, Google may never find it — even if it's in the sitemap.

Every blog post should link to at least 2 related posts. Every service page should link to relevant case studies. Every case study should link back to the service page.

10. Page speed (Core Web Vitals)

Google uses Core Web Vitals as a ranking factor. The three metrics:

I wrote about hitting Lighthouse 98 — most of the work is eliminating render-blocking resources and sizing images correctly.

11. 404 pages that return 404 status codes

A common Next.js mistake: custom 404 pages that return a 200 status code. Google indexes them as real pages, creating "soft 404" issues in Search Console.

// app/[locale]/not-found.tsx
// This works correctly in Next.js App Router —
// notFound() throws a 404 status automatically

Verify by checking the HTTP status: curl -I https://yoursite.com/nonexistent-page. It should return 404, not 200.

12. HTTPS redirect and www canonicalization

If both http:// and https:// resolve, or both www. and non-www. resolve, Google sees duplicate content. Configure one canonical domain and 301-redirect all variations to it.

Most hosting providers (Vercel, Cloudflare) handle this automatically. Verify: curl -I http://yoursite.com should return 301https://yoursite.com.

The 30-minute audit

Run these 4 commands to find most issues:

  1. curl -s https://yoursite.com/robots.txt — verify it's correct
  2. curl -s https://yoursite.com/sitemap.xml | head -50 — verify pages are listed with correct dates
  3. Open Chrome DevTools → Lighthouse → SEO audit
  4. Google Search Console → URL Inspection → test your most important pages

Most issues are configuration, not code. Fix them once, verify they survive deploys, and move on.


Want a technical SEO audit of your Next.js site? Let's talk — I run this checklist on every client project and typically find 5+ quick wins.