Sitemap and Robots

app/sitemap.ts

A sitemap lists your URLs for search engines. Generate it from the database so new products appear automatically:

import type { MetadataRoute } from 'next';
import { prisma } from '@/lib/prisma';

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const products = await prisma.product.findMany({ select: { id: true, updatedAt: true } });
  return [
    { url: 'https://shopease.in', changeFrequency: 'daily', priority: 1 },
    { url: 'https://shopease.in/products', changeFrequency: 'hourly', priority: 0.9 },
    ...products.map((p) => ({
      url: 'https://shopease.in/products/' + p.id,
      lastModified: p.updatedAt,
      changeFrequency: 'weekly' as const,
      priority: 0.7,
    })),
  ];
}

What It Produces

Example

The XML that /sitemap.xml returns, built by hand:

type Entry = { url: string; lastModified?: string; priority?: number };

function toXml(entries: Entry[]): string {
  const rows = entries.map((e) =>
    '  <url><loc>' + e.url + '</loc>' +
    (e.lastModified ? '<lastmod>' + e.lastModified + '</lastmod>' : '') +
    (e.priority !== undefined ? '<priority>' + e.priority + '</priority>' : '') + '</url>');
  return ['<?xml version="1.0" encoding="UTF-8"?>',
    '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">', ...rows, '</urlset>'].join('\n');
}

const products = [{ id: 1, updated: '2026-01-15T10:00:00Z' }, { id: 2, updated: '2026-02-01T08:30:00Z' }];
console.log(toXml([
  { url: 'https://shopease.in', priority: 1 },
  ...products.map((p) => ({ url: 'https://shopease.in/products/' + p.id, lastModified: p.updated, priority: 0.7 })),
]));

Output

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://shopease.in</loc><priority>1</priority></url>
  <url><loc>https://shopease.in/products/1</loc><lastmod>2026-01-15T10:00:00Z</lastmod><priority>0.7</priority></url>
  <url><loc>https://shopease.in/products/2</loc><lastmod>2026-02-01T08:30:00Z</lastmod><priority>0.7</priority></url>
</urlset>

app/robots.ts

import type { MetadataRoute } from 'next';

export default function robots(): MetadataRoute.Robots {
  return {
    rules: { userAgent: '*', allow: '/', disallow: ['/admin/', '/account/', '/api/', '/cart'] },
    sitemap: 'https://shopease.in/sitemap.xml',
  };
}

Example

curl localhost:3000/robots.txt

Example output

User-Agent: *
Allow: /
Disallow: /admin/
Disallow: /account/
Disallow: /api/
Disallow: /cart

Sitemap: https://shopease.in/sitemap.xml