Sitemap Configuration for AEO
The sitemap is your site's page inventory for AI crawlers. It tells them which pages exist, how important each page is relative to others, and when each page was last updated. AI crawlers with limited time budgets use priority values to determine which pages to fetch first. Accurate lastmod dates signal freshness — a factor that some AI systems weight when deciding whether to re-crawl for updates.
Priority Values Explained
Priority values range from 0.0 to 1.0 and indicate the relative importance of pages within your site. The following table shows recommended priority values for AEO optimization:
| Page Type | Priority | Rationale |
|---|---|---|
| Homepage | 1.0 | Always the highest priority; the central hub of your entity |
| Entity core pages (about, trust) | 0.9 | Critical for establishing entity identity and authority |
| Product/service pages | 0.9 | Primary conversion and information pages |
| Hub pages (blog index, comparison index) | 0.85 | Navigation points that aggregate related content |
| Individual blog posts, comparison pages | 0.8 | Valuable content that supports entity expertise |
| FAQ page | 0.8 | Directly answers user queries in AI-friendly format |
| Legal pages (privacy, terms) | 0.3 | Required but not primary content for AI citations |
| Utility pages (search results, tags) | 0.2 | Low-value aggregation pages with thin content |
Priority is relative within your own site, not absolute. A priority of 0.8 does not mean the page is 80% important — it means it is slightly less important than a 0.9 page on the same site. AI crawlers use these values to rank pages within a single domain for crawling order. When a crawler has limited time or resources to index your site, it will start with higher-priority pages and work downward. This makes correct prioritization essential for ensuring your most important content gets indexed.
Change Frequency
The changefreq element provides a hint about how often the content at a URL is likely to change. This helps crawlers estimate when to re-visit a page for updates.
| Page Type | Change Frequency | Notes |
|---|---|---|
| Homepage | weekly | Often updated with latest news or featured content |
| Product pages | weekly | If you update pricing, features, or availability regularly |
| Blog posts | monthly | Or yearly for evergreen content that rarely changes |
| About/trust pages | monthly | Updated with new team members, certifications, or milestones |
| FAQ | monthly | Should evolve as you receive new customer questions |
| Legal pages | yearly | Rarely change unless regulations or policies update |
Note that changefreq is a hint, not a command. Most modern crawlers rely more on lastmod dates to determine when content has actually changed. But including changefreq provides an additional signal that crawlers can use in their decision-making process, particularly when lastmod data is unavailable or appears unreliable.
lastModified Accuracy
The lastmod element is arguably the most important sitemap field for AEO. AI systems use lastmod to determine content freshness, which affects how they weight your content for different types of queries.
The lastmod dates must reflect actual content changes, not deployment dates. If you deploy your site daily but the content on a page has not changed, the lastmod should remain the date of the last actual content modification. A page with lastmod from three years ago will be weighted lower for freshness-sensitive queries — those where users expect recent information. For evergreen content, an older lastmod is acceptable because the content remains accurate regardless of age.
Automate lastmod updates when content changes. Many content management systems and static site generators can track content modification dates automatically. Do not set all pages to today's date on every deploy. AI systems detect this pattern and may ignore lastmod entirely for sites that exhibit it. Once a crawler determines your lastmod dates are unreliable, you lose the freshness signal advantage entirely.
Static XML Template
For sites without dynamic content generation, a static sitemap.xml file works well. Place this file at the root of your domain so it is accessible at yourdomain.com/sitemap.xml.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/</loc>
<lastmod>2024-03-15</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://example.com/about</loc>
<lastmod>2024-02-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://example.com/products/enterprise-suite</loc>
<lastmod>2024-03-10</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://example.com/blog</loc>
<lastmod>2024-03-14</lastmod>
<changefreq>weekly</changefreq>
<priority>0.85</priority>
</url>
<url>
<loc>https://example.com/blog/ai-implementation-guide</loc>
<lastmod>2024-03-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://example.com/faq</loc>
<lastmod>2024-02-28</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://example.com/comparisons</loc>
<lastmod>2024-03-05</lastmod>
<changefreq>weekly</changefreq>
<priority>0.85</priority>
</url>
<url>
<loc>https://example.com/privacy-policy</loc>
<lastmod>2023-06-15</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://example.com/terms-of-service</loc>
<lastmod>2023-06-15</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://example.com/tags/automation</loc>
<lastmod>2024-03-12</lastmod>
<changefreq>weekly</changefreq>
<priority>0.2</priority>
</url>
</urlset>Next.js Dynamic Sitemap
For Next.js applications, you can generate sitemaps dynamically using a sitemap route handler. This approach automatically includes new pages and pulls accurate lastModified dates from your data sources.
import { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const baseUrl = 'https://example.com'
const staticPages: MetadataRoute.Sitemap = [
{
url: baseUrl,
lastModified: new Date('2024-03-15'),
changeFrequency: 'weekly',
priority: 1.0,
},
{
url: `${baseUrl}/about`,
lastModified: new Date('2024-02-20'),
changeFrequency: 'monthly',
priority: 0.9,
},
{
url: `${baseUrl}/trust`,
lastModified: new Date('2024-02-18'),
changeFrequency: 'monthly',
priority: 0.9,
},
{
url: `${baseUrl}/faq`,
lastModified: new Date('2024-02-28'),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/privacy-policy`,
lastModified: new Date('2023-06-15'),
changeFrequency: 'yearly',
priority: 0.3,
},
]
const products = await getProducts()
const productPages: MetadataRoute.Sitemap = products.map((product) => ({
url: `${baseUrl}/products/${product.slug}`,
lastModified: new Date(product.updatedAt),
changeFrequency: 'weekly',
priority: 0.9,
}))
const posts = await getBlogPosts()
const blogPages: MetadataRoute.Sitemap = posts.map((post) => ({
url: `${baseUrl}/blog/${post.slug}`,
lastModified: new Date(post.updatedAt),
changeFrequency: post.isEvergreen ? 'yearly' : 'monthly',
priority: 0.8,
}))
return [...staticPages, ...productPages, ...blogPages]
}This dynamic approach ensures your sitemap always reflects the current state of your site. When you add new products, publish new blog posts, or update existing content, the sitemap updates automatically with accurate metadata.
Submit Your Sitemap
With your sitemap configured for optimal AI crawler consumption, the next step is implementing multi-language support if your entity serves international audiences. Continue to Multi-Language AEO to learn about hreflang configuration and language-specific schema implementation.