Skip to main content

Overview

TamborraData implements enterprise-grade technical SEO to maximize visibility in traditional search engines (Google, Bing) and AI-powered search (ChatGPT, Gemini, Perplexity).
The SEO strategy focuses on three pillars: structured metadata, Schema.org markup, and performance optimization.

SEO Goals

Complete Indexing

All public pages indexed by major search engines

Local Rankings

Target keywords: “Tamborrada Infantil datos”, “estadísticas Tamborrada”

Featured Snippets

Appear in Google’s answer boxes for relevant queries

AI Overviews

Be the primary data source for AI search tools

Metadata Optimization

Every page includes comprehensive, optimized metadata using Next.js 16 Metadata API.

Homepage Metadata

// app/page.tsx
export const metadata: Metadata = {
  metadataBase: new URL('https://tamborradata.com'),
  title: 'Tamborradata | Datos y estadísticas de la Tamborrada Infantil',
  description:
    'Explorar datos y estadísticas de la Tamborrada Infantil en Donostia-San Sebastián: participación, nombres, colegios y tendencias desde 2018.',

  alternates: {
    canonical: 'https://tamborradata.com',
  },

  keywords: [
    'Tamborradata',
    'Tamborrada Infantil',
    'estadísticas Tamborrada',
    'datos Tamborrada',
    'Donostia',
    'San Sebastián',
  ],

  robots: {
    index: true,
    follow: true,
    googleBot: {
      index: true,
      follow: true,
      'max-image-preview': 'large',
      'max-snippet': -1,
      'max-video-preview': -1,
    },
  },

  category: 'website',
};

Dynamic Page Metadata

// app/statistics/[year]/page.tsx
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { year } = params;

  return {
    title: `Estadísticas ${year} | Tamborradata`,
    description: `Datos y estadísticas completas de la Tamborrada Infantil ${year}: participación, colegios, nombres más populares y tendencias.`,
    alternates: {
      canonical: `https://tamborradata.com/statistics/${year}`,
    },
    openGraph: {
      title: `Estadísticas Tamborrada Infantil ${year}`,
      description: `Explorar datos de ${year}`,
      url: `https://tamborradata.com/statistics/${year}`,
      images: [
        {
          url: `https://tamborradata.com/og-image-${year}.webp`,
        },
      ],
    },
  };
}

Title Tag Optimization

PageTitleReasoning
HomeTamborradata | Datos y estadísticas...Branding first + keywords
YearEstadísticas 2024 | TamborradataYear + branding
GlobalEstadísticas Globales | TamborradataDifferentiation
SearchBuscar Participantes | TamborradataClear functionality

Structured Data (Schema.org)

TamborraData implements JSON-LD structured data for rich search results.

Organization Schema

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://tamborradata.com#organization",
  "name": "Tamborradata",
  "description": "Proyecto de datos y estadísticas sobre la Tamborrada Infantil",
  "url": "https://tamborradata.com",
  "logo": "https://tamborradata.com/favicon.ico",
  "sameAs": [
    "https://x.com/tamborradata",
    "https://github.com/ramistodev/tamborradata"
  ]
}

WebSite Schema with SearchAction

{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "https://tamborradata.com#website",
  "name": "Tamborradata",
  "url": "https://tamborradata.com",
  "inLanguage": "es-ES",
  "publisher": { "@id": "https://tamborradata.com#organization" },
  "potentialAction": {
    "@type": "SearchAction",
    "target": "https://tamborradata.com/search?name={search_term_string}",
    "query-input": "required name=search_term_string"
  }
}
The SearchAction enables Google to display a search box directly in search results.

Dataset Schema

{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "@id": "https://tamborradata.com#dataset",
  "name": "Tamborradata - Estadísticas Históricas de la Tamborrada Infantil",
  "description": "Dataset completo con estadísticas desde 2018: participación, colegios, nombres, tendencias.",
  "url": "https://tamborradata.com",
  "creator": { "@id": "https://tamborradata.com#organization" },
  "publisher": { "@id": "https://tamborradata.com#organization" },
  "datePublished": "2018-01-20T00:00:00.000Z",
  "dateModified": "2025-01-20T00:00:00.000Z",
  "temporalCoverage": "2018-01-20/2025-01-20",
  "spatialCoverage": {
    "@type": "Place",
    "name": "San Sebastián, Gipuzkoa, País Vasco, España",
    "geo": {
      "@type": "GeoCoordinates",
      "latitude": 43.3183,
      "longitude": -1.9812
    }
  },
  "keywords": [
    "Tamborrada Infantil",
    "estadísticas",
    "datos históricos",
    "Donostia",
    "San Sebastián"
  ]
}
Dataset schema makes TamborraData discoverable in Google Dataset Search, establishing it as an official data source.
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Inicio",
      "item": "https://tamborradata.com"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Estadísticas",
      "item": "https://tamborradata.com/statistics"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "2024",
      "item": "https://tamborradata.com/statistics/2024"
    }
  ]
}

Dynamic Sitemap

The sitemap is generated dynamically and automatically excludes unavailable years.
// app/sitemap.ts
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const baseUrl = 'https://tamborradata.com';
  const currentYear = new Date().getFullYear();

  const yearUrls = [];
  for (let i = 0; i <= currentYear - 2018; i++) {
    const year = 2018 + i;
    if (year === 2021) continue; // Skip years without data

    yearUrls.push({
      url: `${baseUrl}/statistics/${year}`,
      lastModified: year === currentYear 
        ? new Date() 
        : new Date(`${year}-01-20`),
      changeFrequency: 'yearly' as const,
      priority: year === currentYear ? 0.9 : 0.7,
    });
  }

  return [
    {
      url: baseUrl,
      lastModified: new Date(),
      changeFrequency: 'monthly',
      priority: 1.0,
    },
    {
      url: `${baseUrl}/statistics/global`,
      lastModified: new Date(),
      changeFrequency: 'yearly',
      priority: 0.9,
    },
    {
      url: `${baseUrl}/search`,
      lastModified: new Date(),
      changeFrequency: 'monthly',
      priority: 0.9,
    },
    ...yearUrls,
  ];
}
  • ✅ Automatic URL generation
  • ✅ Excludes unavailable years (2021)
  • ✅ Differentiated priorities
  • ✅ Dynamic lastModified dates
  • ✅ Appropriate change frequencies

Robots.txt Configuration

User-agent: *
Allow: /

# Block internal routes
Disallow: /api/
Disallow: /_next/
Disallow: /_vercel/

# Block sensitive files
Disallow: /*.json$
Disallow: /*.xml$

# Sitemap
Sitemap: https://tamborradata.com/sitemap.xml

# AI Crawlers (explicitly allow)
User-agent: ChatGPT-User
Allow: /

User-agent: GPTBot
Allow: /

User-agent: Google-Extended
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: ClaudeBot
Allow: /
Blocking AI crawlers prevents your content from appearing in AI-powered search tools. TamborraData explicitly allows them.

Canonical URLs

All pages implement canonical URLs to prevent duplicate content issues.
export const metadata: Metadata = {
  alternates: {
    canonical: 'https://tamborradata.com/statistics/2024',
  },
};

Canonicalization Rules

ScenarioCanonical
Trailing slashRemove: /statistics/2024//statistics/2024
Query parametersRemove: /statistics/2024?ref=x/statistics/2024
HTTP vs HTTPSAlways HTTPS: http://https://
Multiple domainsPrimary domain only: .com

Open Graph & Twitter Cards

Open Graph Tags

openGraph: {
  title: 'Tamborradata | Datos de la Tamborrada Infantil',
  description: 'Explorar estadísticas desde 2018',
  url: 'https://tamborradata.com',
  siteName: 'Tamborradata',
  images: [{
    url: 'https://tamborradata.com/og-image.webp',
    width: 1200,
    height: 630,
    alt: 'Tamborradata - Estadísticas Tamborrada Infantil',
  }],
  locale: 'es_ES',
  type: 'website',
}

Twitter Cards

twitter: {
  card: 'summary_large_image',
  title: 'Tamborradata | Datos de la Tamborrada Infantil',
  description: 'Explorar estadísticas desde 2018',
  images: [{
    url: 'https://tamborradata.com/og-image.webp',
    alt: 'Tamborradata - Estadísticas',
  }],
  site: '@tamborradata',
  creator: '@tamborradata',
}

Social Media Image Specs

PlatformRecommended SizeFormat
Facebook1200×630pxWebP/JPEG
Twitter1200×628pxWebP/JPEG
LinkedIn1200×627pxWebP/JPEG
TamborraData uses WebP format at 1200×630px (45KB) for optimal quality and performance.

AI Overviews Optimization

TamborraData is optimized to be a primary data source for AI search tools.

Strategies

Explicitly permit AI bots in robots.txt:
User-agent: ChatGPT-User
Allow: /

User-agent: GPTBot
Allow: /

User-agent: Google-Extended
Allow: /
Use proper heading hierarchy that AI can parse:
<h1>Estadísticas de la Tamborrada Infantil 2024</h1>

<section aria-label="Participación Total">
  <h2>Participación Total</h2>
  <p>En 2024, participaron <strong>3,245 niños y niñas</strong>...</p>
</section>
Dataset schema identifies TamborraData as an official data source for AI:
{
  "@type": "Dataset",
  "name": "Tamborradata - Estadísticas Históricas",
  "description": "Dataset completo desde 2018"
}
Present data in AI-friendly formats:
## Participación

- Total: 3,245 participantes
- Incremento: +5.2% vs 2023

## Colegios Top 3:

1. Colegio A - 450 participantes
2. Colegio B - 380 participantes
3. Colegio C - 320 participantes

Core Web Vitals

TamborraData optimizes Google’s Core Web Vitals for better rankings.

Target Metrics

MetricTargetActualStatus
LCP (Largest Contentful Paint)< 2.5s~1.8s
FID (First Input Delay)< 100ms~50ms
CLS (Cumulative Layout Shift)< 0.1~0.05
FCP (First Contentful Paint)< 1.8s~1.2s
TTI (Time to Interactive)< 3.8s~2.5s

Optimization Techniques

Server-side rendering dramatically improves FCP and LCP:
// Server Component → content rendered on server
export default async function StatisticsPage({ params }) {
  const data = await fetchStatistics(params.year);
  return <StatisticsContent data={data} />;
}

Validation Tools

Google Search Console

  • ✅ All pages indexed
  • ✅ No crawl errors
  • ✅ Core Web Vitals passing
  • ✅ Mobile-first indexing active

Lighthouse

  • ✅ Performance: 95+
  • ✅ Accessibility: 100
  • ✅ Best Practices: 100
  • ✅ SEO: 100

Rich Results Test

  • ✅ Organization schema valid
  • ✅ Dataset schema valid
  • ✅ BreadcrumbList schema valid

Schema Validator

Test structured data at: schema.org validator

Best Practices

1

Use Semantic HTML

Proper heading hierarchy and semantic elements help search engines understand content structure.
2

Implement All Schema Types

Organization, WebSite, Dataset, and BreadcrumbList schemas provide comprehensive context.
3

Optimize for Mobile

Mobile-first indexing means mobile performance directly affects rankings.
4

Monitor Core Web Vitals

Regularly check metrics in Google Search Console and optimize bottlenecks.
5

Allow AI Crawlers

Explicitly permit AI bots to ensure visibility in AI-powered search.

Resources

Google Search Central

Official Google SEO documentation

Schema.org

Structured data vocabulary

Next.js SEO

SEO with Next.js guide

Core Web Vitals

Understanding Core Web Vitals

Build docs developers (and LLMs) love