Go-Live Clearance

Next.js · App Router · Vercel

Next.js Production Checklist

Local looks fine. Preview looks fine. Production still ships with noindex, missing headers, or OG images on the wrong host. This Next.js production checklist scans the live URL, then you paste the AI prompt into your editor.

When this checklist beats a single SEO checker

Use it for an App Router + Vercel launch. Use a focused checker when you already know the failure class.

  • Use this page

    Local and Preview look fine, but production may still ship noindex, a preview canonical, missing security headers, or OG URLs on the Vercel host. You need the launch bundle, not one tag.

  • Problem → aftermath → next step

    Problem: staging habits leak into the production deployment. Aftermath: Google never indexes the live domain, or social cards point at a disappearing preview URL. Next step: set metadataBase, robots.ts, headers, and the custom domain, then scan the production URL.

  • Adjacent checks

    If Search Console shows two URL variants, open the canonical checker. If the homepage has no text heading in view-source, open the H1 checker. For a stack-agnostic launch list, use the website launch checklist.

Copy-paste Next.js fixes

These cover the failures we see most on App Router + Vercel launches.

app/robots.ts still blocking everything

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

metadata.robots left on noindex from staging

// app/layout.tsx
export const metadata = {
  robots: { index: true, follow: true }, // or omit — default is indexable
}

Security headers via next.config

// next.config.js
module.exports = {
  async headers() {
    return [{
      source: '/(.*)',
      headers: [
        { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains' },
        { key: 'X-Content-Type-Options', value: 'nosniff' },
        { key: 'X-Frame-Options', value: 'DENY' },
        { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
      ],
    }]
  },
}

metadataBase so OG / canonical use production

// app/layout.tsx
export const metadata = {
  metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL!),
  alternates: { canonical: '/' },
  openGraph: { images: [{ url: '/og.png', width: 1200, height: 630 }] },
}

Vercel go-live ticks

  • □Attach the custom domain and wait for SSL to show Valid
  • □Set NEXT_PUBLIC_SITE_URL to https://yourdomain.com (not *.vercel.app)
  • □Promote the production deployment — don't share Preview URLs on launch posts
  • □Optional: enable Vercel Analytics before you send traffic

Related