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
- Canonical checker — preview-host and www duplicates
- H1 tag checker — heading present in the first HTML
- robots.txt checker
- Security headers checker
- Website launch checklist — stack-agnostic launch accidents
- Methodology
- Go-Live Clearance home