How to migrate to Next.js 16
A practical guide to async params, Turbopack defaults, and the gotchas we hit.
Async params, in practice
We migrated 240 routes last week...
--- title: AEO and GEO for AI Overviews, ChatGPT, Claude, Gemini, and Perplexity source: newsletter source_url: https://www.trevorlasn.com/blog/aeo-geo-vs-seo-google-ai-optimization tags: [blog] fetcher: jina sha256: 9312ae56ea00a0ca created: 2026-05-19 updated: 2026-05-19 --- # AEO and GEO for AI Overviews, ChatGPT, Claude, Gemini, and Perplexity Published Time: 2026-05-17T00:00:00.000Z Markdown Content: Search results don’t look the way they did two years ago. Google now opens with AI Overviews, ChatGPT and Claude pull live web results into their answers, Perplexity built an entire product around it, and Gemini sits one tap away inside every Google surface. The page is no longer the destination. The page is a source the model is reading on your behalf. Two acronyms have shown up to describe the work of being visible inside those answers. **AEO** stands for Answer Engine Optimization, which is the work of being the source an “answer engine” uses when it returns a direct answer instead of a list of links. **GEO** stands for Generative Engine Optimization, which is the same idea framed around generative AI specifically: appearing inside answers a model writes from scratch using your page as a reference. Google’s own [AI optimization guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) treats both as variations of regular SEO. From their perspective, “optimizing for generative AI search is optimizing for the search experience, and thus still SEO.” The ranking and quality systems that decide what shows up in a list of blue links are the same systems that decide what shows up inside an AI Overview. Improving for one improves the other. One reason this matters: each AI surface pulls from a different web index, but most of those indexes are downstream of the same crawl, rendering, and quality work. `Your page │ ▼ Search engine indexes (where the crawl lands) ┌────────────────────────────────────────────────────────┐ │ Google index ──▶ Google Search, AI Overviews, Gemini │ │ Bing index ──▶ Bing, Microsoft Copilot │ │ OpenAI index ──▶ ChatGPT Search │ │ Anthropic + Brave ▶ Claude web search │ │ Perplexity + Bing ▶ Perplexity answers │ └────────────────────────────────────────────────────────┘ │ ▼ The AI surface reads from the index, cites your page` The practical question is what you do to your site. The rest of this post walks through it, with sources for every recommendation. ### Eligibility comes before everything else Before any of the content work matters, the page has to be allowed to appear in AI features at all. Google’s guide is explicit: a page is only eligible for AI features if it’s eligible to appear as a regular search snippet ([source](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)). That means the URL needs to be indexed, the page needs to be crawlable in `robots.txt`, snippets need to be allowed (no `nosnippet`, no `max-snippet:0`), and the content has to load without requiring the crawler to execute heavy JavaScript first. Open Google Search Console and run a URL inspection on a page you care about. The “Test live URL” view shows you what Google sees, including the rendered HTML after JavaScript has executed. If the article body is missing from that rendered HTML, fix it before doing anything else. Google’s [JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics) covers the patterns that work and the ones that break crawling. Server rendering and static generation are the safest bets. A 30-second sanity check from your terminal, one per major AI crawler: `# Google Search (feeds AI Overviews and Gemini grounding)curl -A "Googlebot/2.1 (+http://www.google.com/bot.html)" -I https://0xinsider.com/article# Bing (feeds Microsoft Copilot)curl -A "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" -I https://0xinsider.com/article# OpenAI search indexer (ChatGPT Search)curl -A "OAI-SearchBot/1.3; +https://openai.com/searchbot" -I https://0xinsider.com/article# Anthropic search indexer (Claude web search)curl -A "Claude-SearchBot/1.0 (+https://www.anthropic.com)" -I https://0xinsider.com/article# Perplexity indexercurl -A "PerplexityBot/1.0 (+https://perplexity.ai/perplexitybot)" -I https://0xinsider.com/article` A `200 OK` from a spoofed user agent isn’t proof that the real crawler can reach the page. Bot operators block UA spoofing, so the only authoritative check is to verify the request against published IP ranges or reverse-DNS records. Google documents its [crawler verification process](https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot), and OpenAI, Anthropic, and Perplexity all publish IP ranges in their bot docs. Use the `curl` test to catch obvious blocks (a `403`, `503`, or login-page redirect that suggests Cloudflare’s bot-fight rule or a misconfigured WAF), then confirm against the official IP list for the bots that matter to you. The full list of bots worth thinking about, with what they do and the canonical reference: `Bot user agent Purpose Reference──────────────────────────────────────────────────────────────────────────Googlebot Google Search index developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlersGoogle-Extended Gemini Apps + Vertex AI Grounding + developers.google.com/crawling/docs/crawlers-fetchers/google-special-case-crawlers AI training (separate from Search)Bingbot Bing index (feeds Copilot) bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0GPTBot/1.3 OpenAI training developers.openai.com/api/docs/botsOAI-SearchBot/1.3 ChatGPT Search live index developers.openai.com/api/docs/botsChatGPT-User ChatGPT user-initiated fetch developers.openai.com/api/docs/botsClaudeBot Anthropic training support.claude.com/en/articles/8896518Claude-SearchBot Anthropic search index (Claude search) support.claude.com/en/articles/8896518Claude-User Claude user-initiated fetch support.claude.com/en/articles/8896518PerplexityBot Perplexity search index docs.perplexity.ai/docs/resources/perplexity-crawlersPerplexity-User Perplexity user-initiated fetch docs.perplexity.ai/docs/resources/perplexity-crawlersApplebot-Extended Apple Intelligence training support.apple.com/en-us/119829Meta-ExternalAgent Meta AI training developers.facebook.com/docs/sharing/webmasters/web-crawlersCCBot Common Crawl (feeds many models) commoncrawl.org/ccbot` A `robots.txt` you can copy that allows AI search visibility (the surfaces that cite your page) while opting out of training (the bots that scrape for model training data): `# Allow indexing for search and AI search surfacesUser-agent: GooglebotAllow: /User-agent: BingbotAllow: /User-agent: OAI-SearchBotAllow: /User-agent: ChatGPT-UserAllow: /User-agent: PerplexityBotAllow: /User-agent: Perplexity-UserAllow: /User-agent: Claude-SearchBotAllow: /User-agent: Claude-UserAllow: /# Block AI training crawlers (does not affect Google Search inclusion)User-agent: GPTBotDisallow: /User-agent: ClaudeBotDisallow: /User-agent: Google-ExtendedDisallow: /User-agent: Applebot-ExtendedDisallow: /User-agent: Meta-ExternalAgentDisallow: /User-agent: CCBotDisallow: /# FallbackUser-agent: *Allow: /Sitemap: https://0xinsider.com/sitemap.xml` The distinction matters. `GPTBot` and `ClaudeBot` are training crawlers, and blocking them does not affect search inclusion. `Google-Extended` is broader: it controls AI training **and** grounding inside Gemini Apps and Vertex AI Grounding, but does not affect Google Search ranking or AI Overview eligibility ([Google source](https://developers.google.com/crawling/docs/crawlers-fetchers/google-special-case-crawlers)). The bots that determine whether your page can show up inside an AI answer are the search indexers: `Googlebot`, `Bingbot`, `OAI-SearchBot`, `Claude-SearchBot`, and `PerplexityBot` ([OpenAI source](https://developers.openai.com/api/docs/bots), [Anthropic source](https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler), [Perplexity source](https://docs.perplexity.ai/docs/resources/perplexity-crawlers)). Many sites accidentally block one of those and tank their visibility. Meta robots tags are the other lever, page-level rather than site-level: `` To opt out of `Google-Extended` (Gemini Apps and Vertex AI Grounding), use the `robots.txt` product token shown earlier. Google does not document `Google-Extended` as a robots meta tag, only as a `robots.txt` token ([source](https://developers.google.com/crawling/docs/crawlers-fetchers/google-special-case-crawlers)). The snippet directives above are documented in Google’s [meta tags reference](https://developers.google.com/search/docs/crawling-indexing/special-tags). `Page exists │ ▼ robots.txt allows crawl? ── no ──▶ invisible ▼ page renders without JS errors? ── no ──▶ invisible ▼ indexed in Search Console? ── no ──▶ invisible ▼ snippet allowed (no nosnippet)? ── no ──▶ regular search only ▼ quality + originality signals? ── weak ─▶ ranked, rarely cited │ ▼ Eligible to appear in AI Overviews and related surfaces` Every layer is a gate. The fancier optimization work only matters once all the gates are open. ### What gets cited is what a model can’t write from training data alone Generative search rewards specificity. Models can summarize generic information without quoting anyone, so the pages that get cited are the ones that say something the model can’t synthesize on its own. Google’s guide tells creators to focus on “unique, valuable, people-first content” rather than commodity content that re-states what every other page on the topic already says ([source](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)). The deeper version of this advice lives in Google’s [helpful content guidance](https://developers.google.com/search/docs/fundamentals/creating-helpful-content), which goes into how to demonstrate firsthand experience, real expertise, and original perspective. Here are two real versions of the same paragraph for an article about migrating to Next.js 16. Same topic, same word count, wildly different odds of being cited: `Commodity version:"Next.js 16 introduces async params, making route parametersasynchronous. This is a breaking change you should plan forwhen upgrading from Next.js 15. Make sure to await your paramsin dynamic routes."Distinctive version:"We migrated a 240-route Next.js 15 app to 16 last week. Theasync params change broke 47 pages in CI on the first run.The mechanical fix: wrap every `params.slug` access in`await params`. The catch we hit: dynamic API routes thatdestructure params in the function signature need thesignature itself marked async, not just the body. Took3 hours, almost all of it search-replace."` A model can produce the commodity version from training data alone, so it won’t cite the source. There’s nothing in there it couldn’t write itself. The distinctive version has a number (47 broken pages), a specific catch (the function signature subtlety), and a time estimate (3 hours), none of which the model can generate without quoting the source. Even one of those details is often enough to flip a page from “training data summary” to “cited reference”. `What the model sees about your topic │ ├──▶ Commodity content │ "Same overview 50 other pages have" │ │ │ ▼ │ Model synthesizes from training data │ │ │ ▼ │ Not cited │ └──▶ Distinctive content "Specific data, screenshot, opinion, result you tested in production" │ ▼ Model can't synthesize, must quote │ ▼ Cited in the answer` ### Clean technical structure helps the crawler and the model Semantic HTML matters. Use real heading levels in a sensible hierarchy, put the answer to the question the page is about near the top, and avoid burying content under preamble. A real before/after on the same blog post: `
A practical guide to async params, Turbopack defaults, and the gotchas we hit.
We migrated 240 routes last week...
Real content...
` Test it inside Google’s [Rich Results Test](https://search.google.com/test/rich-results) before deploying. The tool will tell you exactly which required fields are missing or malformed. If you run a local business or sell products, two unrelated surfaces matter more than schema. A verified [Google Business Profile](https://support.google.com/business/answer/3038063) feeds local AI answers with your hours, location, services, and reviews. A [Merchant Center](https://support.google.com/merchants/answer/188494) feed is what AI Overviews pull product information from. The AI optimization guide names both explicitly as the primary input for business and commerce results ([source](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)). `Type of result Source feed Where it shows ──────────────────────────────────────────────────────────────────── Local business ◀── Google Business Profile ──▶ Maps, local panel, (hours, location, reviews) local AI answers Products ◀── Merchant Center feed ────▶ Shopping cards, (price, stock, variants) product AI answers Recipes, FAQs, ◀── Schema.org JSON-LD ──────▶ Rich results, events, articles (on-page structured data) AI understanding` ### Agentic experiences are the next surface The newer wrinkle is autonomous agents browsing on the user’s behalf (Claude with computer use, ChatGPT Operator, Perplexity’s assistant). Google’s AI optimization guide recommends sites consider how agents interpret their DOM, controls, and content ([source](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)). Sites with confusing markup, hidden controls, or essential information rendered only as images are hard for agents to operate. The accessibility work you’d already do for screen readers covers most of the same ground. A real before/after of an interactive control on a booking page: `