Start with what Google can actually see
Next.js renders on the server by default, which is great for SEO — but only if your important content isn't hidden behind client-only components or loaded after interaction. View the page source: if your headings and copy aren't there, crawlers may not see them reliably.
Metadata on every route
Every page needs a unique title and description. In the App Router, export a metadata object or generateMetadata function per route, and set a metadataBase in the root layout so canonical and Open Graph URLs resolve correctly.
export async function generateMetadata({ params }: PageProps<"/services/[slug]">) {
const { slug } = await params;
const service = await getService(slug);
return {
title: service.name,
description: service.summary,
alternates: { canonical: `/services/${slug}` },
};
}Sitemaps, robots and canonicals
Generate sitemap.xml from your real routes, keep robots.txt simple, and set a canonical URL on every page so filtered or tracked URLs don't compete with the original.
Structured data
Add JSON-LD for your organisation, breadcrumbs, FAQs and articles. It helps search engines — and AI answer engines — understand who you are and what each page covers.
Core Web Vitals
Use next/image with explicit sizes, self-host fonts with next/font, and keep client JavaScript small. Interaction to Next Paint (INP) suffers most from heavy client components, so keep interactivity where it's needed.
Need a hand?
We do this for clients every week.
Explore our seo services or tell us about your project.
Start a project