Check your Next.js site for App Router SEO issues: generateMetadata, imageSrcSet LCP bugs, AI crawler gaps, and schema errors. Free audit tool.
Run Free Audit →No credit card required · Results in under 2 minutes
Built for App Router. Understands generateMetadata, next/image, and app/robots.ts. Find every SEO issue in your Next.js site — including the ones that only show up in production.
Generic SEO tools were not built for Next.js. They crawl HTML output without understanding how App Router generates metadata, how next/image affects Core Web Vitals, or why a robots.ts file that passes your linter can silently block every AI crawler on the web. seo.yatna.ai is designed to catch the framework-specific issues that a Screaming Frog crawl misses entirely.
Audit My Next.js Site — Free →
generateMetadata vs Static Metadata CorrectnessDynamic routes that use generateMetadata must await all async data fetches before returning the metadata object. A common failure mode: the database call inside generateMetadata isn't awaited, the function returns before the data resolves, and every page in a collection shares the same fallback title. The audit catches this pattern by comparing titles across multiple pages in the same route segment.
next/image imageSrcSet LCP Bug — Explicit Width and Heightnext/image without explicit width and height props generates a srcset that forces the browser to perform a layout pass when the image loads. This causes a measurable LCP degradation of 0.8 seconds or more on mobile — enough to shift a passing Core Web Vitals score into failing. The audit checks every image element for explicit dimensions and flags the specific components that need fixing.
priority Prop on Above-Fold ImagesWithout priority, Next.js lazy-loads every image by default. The browser discovers your hero image after parsing the rest of the DOM, then fetches it — which means your LCP candidate loads last. Google measures LCP from the first paint; a lazy-loaded hero is a guaranteed LCP failure on mobile even if the image itself is fully optimized. The audit identifies which images are above the fold and checks whether priority is set.
app/robots.ts AI Crawler ConfigurationThe default app/robots.ts generated by create-next-app explicitly lists Googlebot and then sets a catch-all disallow: [] for the * user-agent. Many AI crawlers — including GPTBot, ClaudeBot, and PerplexityBot — interpret an unlisted user-agent as denied access on sites with any disallow rule. The audit checks your rendered /robots.txt for explicit Allow directives covering each major AI crawler.
app/sitemap.ts Dynamic Sitemap GenerationA static sitemap.xml in /public goes stale the moment you publish, delete, or rename a route. A dynamic app/sitemap.ts generates the sitemap at request time from your actual route structure, ensuring that new pages are indexed immediately and removed pages don't linger in Google's crawl queue. The audit checks whether your sitemap is static or dynamic and whether it covers all crawled pages.
alternates.canonical in generateMetadataWithout an explicit canonical in your generateMetadata return, Next.js does not inject a canonical tag. Google then selects a canonical from the set of URLs it has seen for the same content — often choosing the wrong one when query parameters, trailing slashes, or both www and non-www variants resolve correctly. The audit checks every page for a canonical tag and flags pages where it is missing or where it differs from the crawled URL.
layout.tsxOrganization schema belongs in the root layout so it is present on every page, establishing your site's entity identity for Google's Knowledge Graph regardless of which page a user or crawler lands on first. Placing it only on the homepage means inner pages have no entity association — reducing the chance that Google connects your content to your brand in AI-powered answers. The audit checks whether your Organization schema appears globally or only on select pages.
Google's quality rater guidelines treat named, credentialed authors as a primary E-E-A-T signal. Article schema with author.sameAs pointing to a LinkedIn profile, Google Scholar page, or authoritative biography tells Google — and AI citation systems — who wrote the content and why they are credible. The audit checks every blog post for Article schema and validates that author.name, author.sameAs, datePublished, and dateModified are all present.
Next.js App Router has changed how meta tags, sitemaps, and robots.txt are generated. The old Pages Router patterns — getStaticProps for metadata, next-sitemap for sitemaps, a static public/robots.txt — still work, but they don't take advantage of the App Router's server-first model and they leave specific gaps that affect rankings.
Our audit understands both routing systems. It evaluates your metadata output against the App Router API when generateMetadata is detected, checks for Pages Router anti-patterns when _app.js or getStaticProps is present, and flags issues specific to your rendering mode — whether you're running fully static (SSG), server-rendered (SSR), or hybrid (ISR).
CRITICAL — imageSrcSet missing width/height on hero image
Severity: Critical. Impact: LCP degradation of 0.8s or more. A next/image component without explicit width and height props causes the browser to recalculate layout when the image loads, directly hurting your Core Web Vitals score. Fix: add explicit pixel dimensions to every <Image> component used above the fold.
HIGH — No app/robots.ts AI crawler configuration
Severity: High. Impact: GPTBot, ClaudeBot, and PerplexityBot may be blocked by default. The standard robots.ts template explicitly names Googlebot but uses a catch-all * rule that some AI crawlers interpret as a deny. Fix: add explicit Allow: / rules for each major AI crawler user-agent.
HIGH — generateMetadata returning same title on all collection pages
Severity: High. Impact: duplicate title tags across your entire blog, product catalog, or documentation section. Google may treat these pages as duplicates and consolidate them into a single indexed URL — often the one you least want. Fix: ensure generateMetadata awaits all data fetches before returning and that each page returns a unique, descriptive title.
Does this work with both App Router and Pages Router? Yes. seo.yatna.ai crawls the rendered HTML output from your live site, so it works regardless of which Next.js routing system you use. When it detects App Router patterns in your metadata output, it applies App Router-specific validation rules. When it detects Pages Router patterns, it applies the appropriate checks for that rendering model.
What Next.js versions are supported? Next.js 13 and above for App Router auditing. All Pages Router versions are supported. If you are still on Next.js 12 or earlier, the audit will run the full 7-category check against your rendered output and flag any issues it finds, though App Router-specific checks will not apply.
Can I audit a Next.js site behind authentication? The free tier requires publicly accessible URLs only. Paid tiers (Starter and above) support HTTP Basic Auth via credentials you provide at audit time. Sites behind full SSO or session-based auth require a different approach — contact us if your site requires authenticated crawling.
Does the audit catch the imageSrcSet LCP bug?
Yes — this is one of the most common findings in Next.js audits and is checked explicitly. The audit parses every <img> element in the crawled output, checks for explicit width and height attributes, and flags any above-fold image that is missing them. The finding includes the specific page URL and the image src so your developer can find and fix it immediately.
Your App Router site deserves a checker that understands how App Router actually works. Generic crawlers miss the generateMetadata patterns, the next/image LCP issues, and the AI crawler gaps that are costing you rankings right now.
Audit My Next.js Site — Free →
Related reading:
7 AI agents. 7 audit categories. One score. Free for your first audit.
Run Free Audit →