Traditional SEO gets you ranked. GEO gets you cited by AI. Here's how to optimize your site for both Google and AI-powered search engines like ChatGPT, Perplexity, and Google AI Overviews — with code examples.
Something quietly shifted in 2025, and most developers missed it. The way people find information on the internet changed — not gradually, but in a hard pivot. According to SparkToro's 2025 data, nearly 60% of Google searches now end without a click. Gartner's prediction that organic search traffic would drop 25% by 2026 is playing out almost exactly on schedule. And the reason is not that people stopped searching. It is that AI started answering.
ChatGPT, Perplexity, Google AI Overviews, Microsoft Copilot, Arc Search — these are not future threats. They are current reality. Your content is being consumed, summarized, and cited (or not cited) by large language models right now. And if your site is optimized only for traditional SEO, you are optimizing for half the game.
This is a technical guide. Not "add keywords to your headings" advice. I am going to show you, with actual code and architecture decisions, how to build a site that performs in both traditional search and generative AI search. Because in 2026, you need both.
Generative Engine Optimization (GEO) is the practice of structuring your content and technical architecture so that AI-powered search engines are more likely to surface, cite, and accurately represent your content in their responses.
Traditional SEO asks: "How do I rank on page one?" GEO asks: "How do I become the source that AI cites when answering a question?"
These are fundamentally different problems. Google's ranking algorithm evaluates signals like backlinks, domain authority, page speed, and keyword relevance. An LLM generating an answer evaluates something closer to: "Is this content authoritative, well-structured, directly relevant, and easy to extract factual claims from?"
There is significant overlap. Good content helps in both cases. But the technical implementation diverges in important ways, and developers are uniquely positioned to get this right because GEO is as much about structured data and architecture as it is about content.
Here is what matters and what does not.
If you take one thing from this post, let it be this: structured data is the bridge between SEO and GEO. It has always mattered for Google rich results. Now it matters even more because LLMs use structured data to understand context, relationships, and authority.
Every page on your site should have JSON-LD structured data. Not just the homepage. Not just blog posts. Every page. Here is what a well-structured blog post looks like:
// src/lib/seo/jsonld.ts
export function generateArticleJsonLd({
title,
description,
url,
datePublished,
dateModified,
authorName,
authorUrl,
imageSrc,
tags,
}: ArticleJsonLdProps) {
return {
"@context": "https://schema.org",
"@type": "TechArticle",
headline: title,
description,
url,
datePublished,
dateModified: dateModified || datePublished,
author: {
"@type": "Person",
name: authorName,
url: authorUrl,
},
publisher: {
"@type": "Organization",
name: "Your Site",
url: "https://yoursite.com",
logo: {
"@type": "ImageObject",
url: "https://yoursite.com/logo.png",
},
},
image: imageSrc,
keywords: tags.join(", "),
mainEntityOfPage: {
"@type": "WebPage",
"@id": url,
},
isAccessibleForFree: true,
inLanguage: "en",
};
}Notice I used TechArticle instead of just Article. Schema.org has specific types for technical content, and LLMs pay attention to these distinctions. Use the most specific type that applies: HowTo for tutorials, FAQPage for Q&A content, SoftwareApplication for tool pages, Review for reviews.
FAQ schema has always been useful for SEO — it can trigger rich results with expandable questions in Google. But for GEO, it is disproportionately powerful. AI engines love question-and-answer formatted content because it maps directly to how users query them.
export function generateFaqJsonLd(
faqs: Array<{ question: string; answer: string }>
) {
return {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: faqs.map((faq) => ({
"@type": "Question",
name: faq.question,
acceptedAnswer: {
"@type": "Answer",
text: faq.answer,
},
})),
};
}The trick: do not just add FAQ schema for the sake of having it. Write FAQs that mirror the actual questions people type into ChatGPT or Perplexity. Tools like AlsoAsked, AnswerThePublic, and even Perplexity's own suggested follow-ups are goldmines for this.
On a developer tools site, for example, a JSON formatter page should not just explain what the tool does. It should have FAQ schema answering:
These are the exact queries AI engines field thousands of times a day.
For any content that walks through a process, HowTo schema dramatically increases the chance of AI citation:
export function generateHowToJsonLd({
name,
description,
steps,
totalTime,
}: HowToJsonLdProps) {
return {
"@context": "https://schema.org",
"@type": "HowTo",
name,
description,
totalTime,
step: steps.map((step, index) => ({
"@type": "HowToStep",
position: index + 1,
name: step.title,
text: step.description,
...(step.image && {
image: {
"@type": "ImageObject",
url: step.image,
},
}),
})),
};
}Here is the uncomfortable truth about GEO: the content patterns that work for AI engines are not always the same patterns that work for human readers. The good news is that there is a middle ground that serves both — and it actually makes your content better for everyone.
Journalists have used the inverted pyramid for a century: put the most important information first, then add detail. This pattern is perfectly aligned with how LLMs extract information.
When an AI engine processes your page, it is looking for direct, authoritative answers near the top. If your blog post buries the answer under four paragraphs of context-setting, the AI might extract information from a competitor's page that gets to the point faster.
Bad for GEO:
"In the ever-evolving landscape of web development, performance optimization has become increasingly important. There are many factors to consider when improving your site's speed. Let's explore some of the most effective strategies that have emerged over the past several years..."
Good for GEO (and for humans):
"The three changes that had the biggest impact on my site's Core Web Vitals were: preloading the LCP image (saved 400ms), replacing layout-shifting web fonts with
font-display: optional(CLS went to zero), and code-splitting the JavaScript bundle by route (TTI dropped by 1.2s)."
The second version gives AI engines a concise, factual, citable statement right upfront. It also respects your human reader's time. Win-win.
LLMs are trained to recognize and elevate content that includes specific, sourced statistics. Vague claims get skipped. Precise, cited claims get extracted and attributed.
Compare:
When you include statistics in your content, always include the source and the year. This signals to both Google and AI engines that your content is well-researched and current.
One of the strongest GEO signals I have observed is what I call the "definitive answer" pattern. It looks like this:
## What is the best image format for the web in 2026?
**For photographs, use AVIF with WebP fallback. For graphics, icons, and
illustrations, use SVG. For screenshots with text, use WebP.**
AVIF offers 50% better compression than WebP and 80% better than JPEG
at equivalent quality. Browser support reached 92% globally as of
January 2026 (Can I Use data). WebP serves as the fallback for the
remaining 8%.
The decision tree is straightforward:
- Photographic content → AVIF (with `<picture>` WebP fallback)
- Vector graphics → SVG (inline for small icons, external for complex)
- Screenshots → WebP (lossless mode preserves text sharpness)
- Animated content → WebP animated (replaces GIF at 1/3 file size)The pattern: question heading → bold one-sentence answer → supporting evidence → structured breakdown. AI engines extract the bold answer. Google may use the heading as a featured snippet trigger. Humans get the answer immediately and can read further if they want detail. Everyone wins.
AI crawlers parse HTML structure to understand content hierarchy and relationships. Semantic HTML has always been an SEO best practice, but for GEO it is genuinely load-bearing — not just decorative.
// Bad: div soup — AI cannot determine content hierarchy
<div className="post">
<div className="title">How to Deploy Next.js</div>
<div className="content">
<div className="section">
<div className="heading">Prerequisites</div>
<div className="text">You need Node.js 18+...</div>
</div>
</div>
</div>
// Good: semantic HTML — AI can parse structure and relationships
<article itemScope itemType="https://schema.org/TechArticle">
<header>
<h1 itemProp="headline">How to Deploy Next.js</h1>
<time itemProp="datePublished" dateTime="2026-03-23">
March 23, 2026
</time>
</header>
<section aria-labelledby="prerequisites">
<h2 id="prerequisites">Prerequisites</h2>
<p>You need Node.js 18+...</p>
</section>
</article>The article, section, header, nav, aside, main, figure, and figcaption elements are not just accessibility niceties. They are parsing hints that help AI engines understand which content is primary, which is supplementary, and how sections relate to each other.
Beyond the standard title and meta description, there are specific meta patterns that improve GEO performance:
export function generateMetadata({ post }: { post: BlogPost }): Metadata {
return {
title: post.title,
description: post.description,
authors: [{ name: "Author Name", url: "https://yoursite.com/about" }],
openGraph: {
title: post.title,
description: post.description,
type: "article",
publishedTime: post.date,
modifiedTime: post.lastModified,
authors: ["https://yoursite.com/about"],
tags: post.tags,
locale: "en_US",
siteName: "Your Site",
},
alternates: {
canonical: `https://yoursite.com/blog/${post.slug}`,
languages: {
"en": `https://yoursite.com/en/blog/${post.slug}`,
"es": `https://yoursite.com/es/blog/${post.slug}`,
"fr": `https://yoursite.com/fr/blog/${post.slug}`,
"de": `https://yoursite.com/de/blog/${post.slug}`,
"ja": `https://yoursite.com/ja/blog/${post.slug}`,
// ... all supported locales
},
},
robots: {
index: true,
follow: true,
"max-snippet": -1,
"max-image-preview": "large",
"max-video-preview": -1,
},
};
}Key GEO-specific points:
max-snippet: -1 allows AI engines to extract as much text as needed. If you restrict snippet length, you are literally telling AI not to cite you.modifiedTime signals freshness. AI engines prefer recent, updated content.hreflang alternates tell AI engines that your content exists in multiple languages, increasing the chance of citation for non-English queries.Google's Speakable schema markup identifies sections of content that are especially suitable for text-to-speech and AI reading. While not widely adopted yet, it is a strong forward-looking signal:
export function generateSpeakableJsonLd(
url: string,
cssSelectors: string[]
) {
return {
"@context": "https://schema.org",
"@type": "WebPage",
url,
speakable: {
"@type": "SpeakableSpecification",
cssSelector: cssSelectors,
},
};
}
// Usage: mark the intro paragraph and key takeaways as speakable
generateSpeakableJsonLd("https://yoursite.com/blog/my-post", [
"article > header > h1",
"article > .introduction",
"article > .key-takeaways",
]);This tells AI engines: "These are the most important, self-contained parts of my content." It is a direct invitation to be cited.
AI crawlers behave differently from Googlebot. They tend to crawl more aggressively, follow fewer robots.txt directives (some ignore it entirely), and prioritize recently updated content. Your sitemap strategy needs to account for this:
// src/app/sitemap.ts
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getAllPosts();
const tools = await getAllTools();
const blogEntries = posts.map((post) => ({
url: `https://yoursite.com/blog/${post.slug}`,
lastModified: new Date(post.lastModified || post.date),
changeFrequency: "weekly" as const,
priority: 0.8,
}));
const toolEntries = tools.map((tool) => ({
url: `https://yoursite.com/tools/${tool.slug}`,
lastModified: new Date(),
changeFrequency: "monthly" as const,
priority: 0.7,
}));
return [
{
url: "https://yoursite.com",
lastModified: new Date(),
changeFrequency: "daily",
priority: 1,
},
...blogEntries,
...toolEntries,
];
}Two important points:
Keep lastModified accurate. AI engines use this to determine content freshness. Lying about it (setting every page to today's date) will eventually backfire as AI engines get better at detecting this pattern.
Segment large sitemaps. If you have thousands of pages, split your sitemap into segments. Google recommends this at 50,000 URLs, but for AI crawlers, even a few thousand URLs per segment improves parse reliability.
Here is something most GEO guides miss entirely: multilingual content is a massive GEO advantage. When someone asks ChatGPT a question in French, the AI preferentially cites French-language sources. When someone queries Perplexity in Japanese, Japanese content gets priority.
If your site only exists in English, you are invisible to AI engines for non-English queries — even if your content is the best available.
// In your layout or page head
export function generateAlternateLinks(slug: string, locales: string[]) {
return locales.map((locale) => ({
rel: "alternate",
hrefLang: locale,
href: `https://yoursite.com/${locale}/blog/${slug}`,
}));
}The critical mistake I see: people add hreflang tags but serve machine-translated garbage content. AI engines are getting extremely good at detecting low-quality translations. A poorly translated page does not just fail to help — it actively hurts your authority across all locales.
If you are going to do multilingual content, do it properly. Use professional translation or high-quality AI translation with human review. Each locale's content should read naturally to a native speaker.
Each localized version of your content should have its own JSON-LD with the correct inLanguage value:
export function generateLocalizedArticleJsonLd(
article: ArticleProps,
locale: string
) {
return {
...generateArticleJsonLd(article),
inLanguage: locale,
isPartOf: {
"@type": "WebSite",
name: "Your Site",
url: `https://yoursite.com/${locale}`,
inLanguage: locale,
},
};
}You cannot optimize what you cannot measure. And measuring GEO performance is harder than measuring SEO because the major AI engines do not provide anything like Google Search Console.
1. AI Referral Traffic. Check your analytics for traffic from AI engines:
// Common AI referrer patterns to track
const aiReferrers = [
"chat.openai.com",
"chatgpt.com",
"perplexity.ai",
"you.com",
"bing.com/chat",
"copilot.microsoft.com",
"gemini.google.com",
"claude.ai",
];Set up a custom segment in your analytics to isolate this traffic. On most sites I have observed, AI referral traffic has grown 3-5x year-over-year since 2024.
2. Citation Monitoring. Periodically query AI engines with questions your content should answer, and check if you are cited. This is manual and tedious, but there is no automated alternative yet. Ask the questions your target audience asks, in the languages you support.
3. Featured Snippet Capture Rate. Google's AI Overviews often pull from the same content that would win featured snippets. If you are capturing featured snippets, you are likely appearing in AI Overviews too.
4. Crawl Log Analysis. Check your server logs for AI crawler user agents:
# Common AI crawler user agents
ChatGPT-User
GPTBot
PerplexityBot
ClaudeBot
Applebot-Extended
Google-Extended
CCBot
If these crawlers are not hitting your site, your content is invisible to AI engines regardless of quality.
You cannot currently track how often your content is cited by AI engines across all queries, what percentage of AI-generated answers include your content, or how your GEO "ranking" compares to competitors. These metrics will eventually exist — several startups are working on GEO analytics — but for now, you are optimizing based on best practices and directional signals.
This is the most debated question in GEO: should you allow AI crawlers to access your content?
My position: yes, unconditionally. Here is why.
If you block AI crawlers, your content will not be cited by AI engines. You are invisible. You get zero traffic from the fastest-growing discovery channel on the internet. And the AI engines will answer the questions anyway — they will just cite your competitors instead.
The counterargument — "they are stealing my content" — is emotionally understandable but strategically wrong. AI engines that cite sources drive traffic to those sources. Perplexity includes inline citations. ChatGPT shows sources. Google AI Overviews link to the underlying pages. Blocking AI crawlers does not protect your content; it just ensures someone else gets the citation and the traffic.
# robots.txt — allow everything, including AI crawlers
User-agent: *
Allow: /
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: ClaudeBot
Allow: /
Sitemap: https://yoursite.com/sitemap.xml
Here is the complete technical checklist I use for every page:
Structural:
article, section, header, main, nav)h1, logical h2/h3 nesting)Structured Data:
Article, HowTo, FAQPage, etc.)inLanguage set correctly per localeContent:
lastModified date kept currentTechnical:
max-snippet: -1 in robots metalastmodMeasurement:
The SEO-to-GEO shift is not slowing down. Here is what I expect in the next 12 months:
AI-native search will become the default for informational queries. Google is already making AI Overviews the default experience for many query types. By early 2027, I expect the majority of informational searches to be answered by AI, with traditional blue links becoming secondary.
Citation standards will formalize. Right now, each AI engine handles citations differently. I expect an industry standard to emerge — likely extending Schema.org — that lets content creators explicitly declare citation preferences, licensing terms, and attribution requirements.
GEO analytics tools will launch. Several companies are building dashboards that track your content's citation rate across AI engines. This will be the "Search Console for GEO" moment, and it will fundamentally change how we measure content performance.
Structured data will become even more critical. As AI engines get more sophisticated, they will lean harder on structured data to understand content. Sites with comprehensive JSON-LD will have a significant advantage over sites that treat structured data as an afterthought.
The developers who start optimizing for both SEO and GEO today will have a compounding advantage. Every piece of well-structured, properly marked-up, multilingual content you publish is an investment that pays dividends across both traditional and AI-powered search.
The question is not whether AI search will matter. It already does. The question is whether your site is ready for it.