Next.js App Router SEO checklist for business sites
By ENZORA · · 2 min read
Search engines still reward boring technical hygiene. App Router makes the *right* things easier—central metadata, file-based sitemap and robots—but only if you wire them consistently across routes. This checklist reflects how we keep a multi-page agency site indexable on a single Vercel project (enzora.vercel.app), without buying SEO plugins or duplicate WordPress stacks.
1. One canonical host
Pick one HTTPS origin and use it everywhere: `metadataBase`, canonical tags, JSON-LD `url` fields, and `sitemap.xml` locs. We read `NEXT_PUBLIC_SITE_URL` with a default of `https://enzora.vercel.app` so previews can override without forked code.
Every indexable route should export `alternates.canonical` as an absolute URL on that host, not a relative path alone.
2. Metadata API per route
`app/layout.tsx` sets site-wide defaults, Open Graph, icons, and Search Console verification. Keep verification dual-path: HTML file in `/public/google*.html` and `metadata.verification.google` for tag-based verification.
Each marketing route exports metadata with title ~50–60 characters, description ~150–160 characters, and aligned Open Graph/Twitter fields.
3. Exactly one H1, intentional headings
Each page gets one H1 matching search intent. Section titles use H2/H3. For service hubs, pair the H1 with a short intro that mentions the primary keyword naturally, then link internally to related hubs.
4. `sitemap.ts` that mirrors reality
Build locs from static marketing paths, all service detail slugs, blog posts, and location pages. When you add a hub route, add it to the generator the same day.
5. `robots.ts` with explicit disallows
Allow `/` for normal crawling. Point to the absolute sitemap URL. Disallow `/api/` and non-indexable demo trees such as `/work`. Do not block CSS or JS.
6. Redirects instead of duplicate URLs
When consolidating service slugs, implement 301 redirects in `next.config.ts`. Update internal links and the sitemap to the canonical slug only.
7. Open Graph images
Root `opengraph-image.tsx` covers defaults. Dynamic segments can expose route OG images for high-value URLs.
8. JSON-LD with stable `@id`s
Structured data should match visible content: Organization/ProfessionalService sitewide, FAQPage from the same FAQ array on the page, BlogPosting on articles, BreadcrumbList on nested routes, and Service on service pages—all linked with `@id` references.
9. Internal and outbound links
Internal links carry relevance: services ↔ blog ↔ contact. Outbound links to authoritative docs signal E-E-A-T when used sparingly in context.
10. Search Console readiness
Verify the property, confirm `/sitemap.xml` returns 200 with canonical URLs only, and monitor Coverage for intentional exclusions.
11. Launch regression checks
- Fetch `/robots.txt` and `/sitemap.xml` on production.
- Spot-check service pages for canonical + H1 + FAQ schema parity.
- Mobile Lighthouse SEO category as a regression guard.
- Optional link crawl against sitemap locs.
App Router SEO is mostly routing discipline: one hostname, one slug per intent, metadata generated from the same source as the UI, and sitemap/robots that update when routes do. Need help? See SEO Growth or book an SEO audit.
Related ENZORA services
Want help with your website?
Get a fixed quote from the ENZORA team. We work with businesses worldwide.