Technical SEO Audit Checklist: 100-Point Guide

Complete 100-point technical SEO audit checklist covering crawlability, Core Web Vitals, structured data, international SEO, indexation, and site architecture for 2026.

E
ECOSIRE Research and Development Team
|19 de marzo de 202612 min de lectura2.6k Palabras|

Lista de verificación de auditoría técnica de SEO: guía de 100 puntos

Una auditoría técnica de SEO no se trata de metaetiquetas y densidad de palabras clave: es una revisión de ingeniería sistemática de qué tan bien se comunica su sitio con los motores de búsqueda. La capacidad de rastreo, la indexación, los Core Web Vitals, los datos estructurados, la canonicalización y las señales internacionales afectan su clasificación antes de que se evalúe un solo contenido. En 2026, cuando los motores de búsqueda impulsados ​​por IA y AEO (Answer Engine Optimization) se vuelvan tan importantes como el SEO tradicional, la base técnica importa más que nunca.

Esta lista de verificación de 100 puntos está organizada por categorías. Revíselo sistemáticamente y realice un seguimiento de los hallazgos en una hoja de cálculo. Corrija los elementos críticos (marcados con C) antes de cualquier otro trabajo de optimización; pueden evitar que el resto tenga algún efecto.

Conclusiones clave

  • La capacidad de rastreo es la primera puerta: si el robot de Google no puede acceder a sus páginas, nada más importa
  • Core Web Vitals (LCP, INP, CLS) son señales de clasificación confirmadas; objetivo LCP < 2,5 s, INP < 200 ms, CLS < 0,1
  • Las etiquetas canónicas evitan la dilución del contenido duplicado: cada página necesita una que apunte a sí misma
  • hreflang es obligatorio para sitios multilingües; x-default debe configurarse para cada grupo de URL
  • Los datos estructurados (JSON-LD) permiten obtener resultados enriquecidos y son fundamentales para la atribución de fuentes de IA/LLM
  • HTTPS es algo que está en juego en 2026; El contenido mixto bloquea la indexación de las páginas afectadas.
  • La indexación de dispositivos móviles primero significa que su experiencia móvil es lo que evalúa Google
  • Los enlaces internos con texto ancla descriptivo distribuyen el PageRank y señalan la relevancia del tema.

Sección 1: Rastreabilidad e indexación (C = Crítico)

robots.txt

  • (C) robots.txt es accesible en /robots.txt y devuelve 200
  • (C) URL del mapa del sitio declarada: Sitemap: https://example.com/sitemap.xml
  • [] Las páginas clave no son bloqueadas accidentalmente por Disallow
  • [] Directivas de velocidad de rastreo separadas para bots agresivos
  • [] Rastreadores de IA explícitamente permitidos o no permitidos según la política (GPTBot, ClaudeBot, OAI-SearchBot)
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/
Disallow: /auth/
Sitemap: https://ecosire.com/sitemap.xml

# Allow AI indexers
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /

Mapa del sitio XML

  • [] (C) El mapa del sitio devuelve 200 con el Content-Type: application/xml correcto
  • (C) Todas las URL canónicas incluidas; no hay URL bloqueadas por robots.txt o noindex
  • <lastmod> las fechas son precisas (no todas son la misma fecha estática)
  • <priority> y <changefreq> configurados adecuadamente por tipo de página
  • [] Mapa del sitio dividido en índice + submapas del sitio para sitios con más de 50.000 URL
  • [] Mapa del sitio enviado a Google Search Console y Bing Webmaster Tools
  • [] Mapa del sitio con imágenes incluido para páginas con muchas imágenes
  • [] URL de idiomas alternativos en el mapa del sitio (hreflang)
// Next.js sitemap.ts — programmatic with correct lastmod
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const posts = await getAllBlogPosts();
  return [
    {
      url: 'https://ecosire.com',
      lastModified: new Date(),
      changeFrequency: 'daily',
      priority: 1.0,
    },
    ...posts.map((post) => ({
      url: `https://ecosire.com/blog/${post.slug}`,
      lastModified: new Date(post.updatedAt),
      changeFrequency: 'weekly' as const,
      priority: 0.8,
    })),
  ];
}

Presupuesto de rastreo

  • [] Las páginas de paginación usan rel="next" / rel="prev" (o desplazamiento infinito con SSR)
  • [] Las URL de navegación facetadas están canonicalizadas o no indexadas
  • [] ID de sesión y parámetros de seguimiento excluidos de las URL indexadas
  • [] Cadenas de redireccionamiento limitadas a un salto (A a B, no A a B a C)
  • [] No hay 404 suaves: las páginas 404 devuelven HTTP 404, no 200

Sección 2: HTTPS y seguridad

  • [] (C) Todas las páginas servidas a través de HTTPS con certificado válido
  • [] (C) HTTP redirecciona a HTTPS (301, no 302)
  • [] (C) Sin advertencias de contenido mixto (recursos HTTP en páginas HTTPS)
  • [] HSTS habilitado con max-age=31536000; includeSubDomains; preload
  • [] Al certificado SSL le quedan más de 90 días
  • [] El certificado cubre las variantes con y sin www
  • [] Cadena de certificados completa (no falta ninguna CA intermedia)
# Nginx HTTPS configuration
server {
    listen 443 ssl http2;
    server_name ecosire.com;

    ssl_certificate     /etc/letsencrypt/live/ecosire.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ecosire.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

Sección 3: Elementos esenciales de la web

Pintura con contenido más grande (LCP): objetivo: menos de 2,5 s

  • (C) Elemento LCP identificado en CrUX/PageSpeed Insights
  • [] Imagen/vídeo principal precargado con <link rel="preload" as="image">
  • [] Imagen LCP servida con el atributo fetchpriority="high" correcto
  • [] Imágenes en formato WebP o AVIF, no PNG/JPEG cuando sea posible
  • [] Imágenes con el tamaño adecuado (no se muestra ninguna imagen de 4000 px a 800 px)
  • [] CDN que sirve activos estáticos con almacenamiento en caché perimetral
  • [] Servidor TTFB por debajo de 800 ms (reduce la ventana LCP)
// Next.js: priority prop preloads the hero image
<Image
  src="/hero.webp"
  alt="Hero image"
  width={1200}
  height={630}
  priority
  sizes="100vw"
/>

Interacción con la siguiente pintura (INP): objetivo: menos de 200 ms

  • [] Tareas largas (más de 50 ms) identificadas y divididas
  • [] JavaScript pesado diferido o con carga diferida
  • [] Los controladores de eventos son eficientes y no provocan nuevos cálculos de diseño.
  • [] Scripts de terceros cargados con async o defer

Cambio de diseño acumulativo (CLS) — Objetivo: menos de 0,1

  • [] (C) Todas las imágenes y videos tienen atributos width y height explícitos
  • [] Las fuentes web usan font-display: optional o swap con respaldo de ajuste de tamaño
  • [] Los espacios publicitarios tienen dimensiones reservadas.
  • [] Se evita contenido inyectado dinámicamente en la mitad superior de la página.
  • Las animaciones usan transform y opacity únicamente (no top, left, width)

Sección 4: Estructura de URL y canonicalización

  • [] (C) Cada página tiene una etiqueta canónica de autorreferencia
  • (C) La URL de la etiqueta canónica coincide con la URL servida real (barra final consistente)
  • [] www y no www redirigen a la versión canónica
  • [] Las URL están en minúsculas, guiones como separadores de palabras, sin guiones bajos.
  • [] Profundidad de URL como máximo en 4 niveles desde la raíz para páginas importantes
  • [] No hay parámetros de URL que creen contenido duplicado sin canonicalización
  • [] Series paginadas canonicalizadas en la primera página (o cada página autocanónica)
// Next.js generateMetadata with canonical
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { locale, slug } = await params;
  const base = locale === 'en' ? '' : `/${locale}`;
  const canonicalUrl = `https://ecosire.com${base}/blog/${slug}`;

  return {
    alternates: {
      canonical: canonicalUrl,
      languages: buildHreflangUrls(slug), // all 11 locales
    },
  };
}

Sección 5: Metadatos y SEO On-Page

  • [] (C) Cada página tiene una etiqueta <title> única (50-60 caracteres)
  • (C) Cada página tiene un <meta name="description"> único (150-160 caracteres)
  • Los títulos siguen el patrón: Primary Keyword | Brand Name
  • [] No hay etiquetas de título duplicadas en todo el sitio.
  • [] Etiquetas de Open Graph: og:title, og:description, og:image, og:url, og:type
  • [] Etiquetas de tarjeta Twitter/X: twitter:card, twitter:title, twitter:image
  • [] Las imágenes OG son de 1200x630 px, menos de 8 MB, servidas desde CDN
  • <meta name="robots"> solo se usa para restringir (no es redundante index,follow)
  • [] <html lang="en"> configurado correctamente para todas las páginas

Sección 6: Datos estructurados (JSON-LD)

  • [] (C) Se prefiere JSON-LD a Microdata/RDFa (más fácil de mantener, compatible con analizadores)
  • [] Esquema de organización en la página de inicio con sameAs URL de perfil social
  • [] Esquema del sitio web con SearchAction para el cuadro de búsqueda de vínculos a sitios
  • [] Esquema BreadcrumbList en todas las páginas debajo de la página de inicio
  • [] Esquema de artículo en publicaciones de blog con datePublished, dateModified, author
  • [] Esquema de página de preguntas frecuentes en páginas con secciones de preguntas frecuentes
  • [] Esquema de producto en páginas de producto con offers, aggregateRating
  • [] Esquema de servicio en páginas de servicio con areaServed, serviceType
  • [] Propiedad inLanguage en todos los esquemas para atribución de IA multilingüe
  • Datos estructurados validados en la prueba de resultados enriquecidos de Google
// JSON-LD with XSS protection
// The .replace() encodes the less-than sign to prevent </script> breakout,
// making this safe for use in a script tag (no untrusted HTML rendered)
export function JsonLd({ data }: { data: Record<string, unknown> }) {
  const safeJson = JSON.stringify(data).replace(/</g, '\\u003c');

  return (
    <script
      type="application/ld+json"
      // Safe: safeJson is a sanitized JSON string, not HTML
      dangerouslySetInnerHTML={{ __html: safeJson }}
    />
  );
}

// Usage
const schema = {
  '@context': 'https://schema.org',
  '@type': 'FAQPage',
  inLanguage: locale,
  mainEntity: faqs.map((faq) => ({
    '@type': 'Question',
    name: faq.question,
    acceptedAnswer: { '@type': 'Answer', text: faq.answer },
  })),
};

<JsonLd data={schema} />

Sección 7: SEO internacional

  • [] (C) etiquetas hreflang en todas las páginas con variantes de idioma
  • [] (C) x-default hreflang establecido para cada grupo de URL
  • los atributos hreflang son bidireccionales (si /en/ se vincula a /fr/, /fr/ debe vincularse nuevamente a /en/)
  • [] Las URL locales utilizan códigos de idioma ISO 639-1 + códigos de región ISO 3166-1 cuando sea necesario
  • <html lang="xx"> coincide con la configuración regional hreflang para esa página
  • [] Los idiomas RTL (árabe, hebreo, urdu) usan dir="rtl" en <html>
  • [] El contenido se traduce, no solo se traduce automáticamente sin revisión
  • [] Orientación geográfica configurada en Google Search Console por subdirectorio local
// Next.js hreflang via generateMetadata
const locales = ['en', 'zh', 'es', 'ar', 'pt', 'fr', 'de', 'ja', 'tr', 'hi', 'ur'];

// In generateMetadata:
// alternates.languages keys must be BCP 47 language tags
alternates: {
  languages: Object.fromEntries([
    ['x-default', `https://ecosire.com/blog/${slug}`],
    ['en',        `https://ecosire.com/blog/${slug}`],
    ['zh',        `https://ecosire.com/zh/blog/${slug}`],
    ['ar',        `https://ecosire.com/ar/blog/${slug}`],
    // ... all 11 locales
  ]),
},

Sección 8: Desempeño e Infraestructura

  • [] Activos estáticos servidos desde CDN (CloudFront, Cloudflare, Fastly)
  • [] Almacenamiento en caché del navegador: Cache-Control: public, max-age=31536000, immutable para activos con hash
  • [] Compresión Gzip o Brotli habilitada en el servidor
  • HTTP/2 o HTTP/3 habilitado
  • [] DNS TTL 3600 o menos para una conmutación por error ágil
  • [] Tiempo de respuesta del servidor inferior a 200 ms para HTML (medir TTFB)
  • [] Paquete de JavaScript con una carga inicial de 250 KB (comprimido con gzip)
  • [] JavaScript no utilizado eliminado (sacudida de árboles, división de código)
  • [] CSS eliminado de reglas no utilizadas en producción
# Nginx compression + caching headers
gzip on;
gzip_types text/html text/css application/javascript application/json image/svg+xml;
gzip_min_length 1024;

location /_next/static/ {
    expires max;
    add_header Cache-Control "public, max-age=31536000, immutable";
}

Sección 9: Experiencia móvil y de usuario

  • [] (C) Metaetiqueta de ventana gráfica: <meta name="viewport" content="width=device-width, initial-scale=1">
  • [] Todos los elementos interactivos tienen objetivos táctiles de al menos 48x48px
  • [] Sin desplazamiento horizontal en dispositivos móviles (ancho máximo: 100 vw)
  • [] Tamaño de fuente de al menos 16 píxeles para el cuerpo del texto (evita el zoom automático de iOS en el foco de entrada)
  • Navegación móvil probada en dispositivos reales (iOS Safari, Chrome Android)
  • [] Las ventanas emergentes y los anuncios intersticiales no cubren el contenido principal en dispositivos móviles
  • [] Toque para llamar a números de teléfono para visitantes móviles

Sección 10: AEO (Optimización del motor de respuesta)

Cada vez más importante para los motores de búsqueda de IA y los asistentes de voz:

  • [] Respuestas clave envueltas en el atributo data-speakable
  • <details>/<summary> se utiliza para contenido plegable de preguntas frecuentes (rastreable, semántico)
  • /llms.txt y /.well-known/llms.txt publicados para rastreadores de IA
  • [] Párrafos de respuestas concisos y objetivos en la parte superior de las secciones clave (optimización de fragmentos destacados)
  • [] Relaciones entre entidades claras en datos estructurados (Organización, Servicios y Productos)
  • [] Nombre de marca consistente en todas las páginas, perfiles sociales y directorios
  • [] API IndexNow utilizada para el envío instantáneo de URL después de publicar contenido nuevo

Preguntas frecuentes

¿Con qué frecuencia debo realizar una auditoría técnica de SEO?

Realice una auditoría completa trimestralmente y un rastreo ligero (Screaming Frog o Sitebulb) mensualmente. Cualquier cambio significativo en el sitio (nueva pila tecnológica, migración, adición de contenido internacional, rediseño importante) justifica una auditoría inmediata. Configure un monitoreo continuo a través de alertas de Google Search Console para caídas repentinas en páginas indexadas o errores de rastreo.

¿Qué herramientas necesito para una auditoría técnica de SEO?

Como mínimo: Google Search Console (gratis, canónico), Screaming Frog o Sitebulb (análisis de rastreo), PageSpeed ​​Insights (Core Web Vitals), Google Rich Results Test (datos estructurados), WebAIM Contrast Checker (accesibilidad/UX) y Ahrefs o Semrush (vínculos de retroceso, clasificación de palabras clave). Para sitios con mucho JavaScript, agregue Rendertron o Botify para el rastreo de renderizados.

¿Cuál es el problema crítico de SEO más común que se encuentra en las auditorías?

Las configuraciones erróneas de las etiquetas canónicas son el hallazgo crítico más común: ya sea que faltan por completo, apuntan a la URL incorrecta (a menudo un dominio de desarrollo o de prueba que se deja en producción) o son inconsistentes con el uso de la barra diagonal. El segundo más común son las directivas noindex accidentales de complementos de CMS o configuraciones de prueba dejadas en compilaciones de producción.

¿Next.js App Router ayuda con el SEO técnico?

Sí, significativamente. La representación del lado del servidor significa que todo el contenido está en la respuesta HTML inicial (no se requiere JavaScript para el rastreo). generateMetadata() metadatos por página evita errores de metadatos estáticos globales. Las convenciones sitemap.ts y robots.ts hacen que esos archivos sean fáciles de mantener mediante programación. El componente Imagen incorporado aplica el ancho y el alto para la prevención de CLS y genera automáticamente variantes WebP/AVIF.

¿Cómo manejo el SEO para contenido paginado?

Para archivos de blogs paginados o listados de productos, cada página debe tener un canónico de autorreferencia (no canónico para la página 1), un título descriptivo que indique el número de página y, si el contenido es sustancial, permitir la indexación. Para páginas paginadas delgadas, considere noindex en páginas más allá de la página 3. Google dejó de usar rel="next"/rel="prev" en 2019, pero otros motores de búsqueda todavía lo utilizan.


Próximos pasos

Una auditoría técnica de SEO es una inversión única que multiplica el ROI de todo su contenido y trabajo de marketing. Los 100 puntos de esta lista de verificación cubren todo el alcance de lo que los motores de búsqueda evalúan antes de clasificar su contenido.

ECOSIRE implementa las mejores prácticas técnicas de SEO como parte estándar de cada proyecto de Next.js, desde mapas de sitio programáticos y hreflang para 11 configuraciones regionales hasta datos estructurados, optimización de Core Web Vitals e integración de API IndexNow. Explore nuestros servicios de desarrollo web para saber cómo construimos la visibilidad de búsqueda desde el primer día.

E

Escrito por

ECOSIRE Research and Development Team

Construyendo productos digitales de nivel empresarial en ECOSIRE. Compartiendo perspectivas sobre integraciones Odoo, automatización de eCommerce y soluciones empresariales impulsadas por IA.

Chatea en whatsapp