Performance · Tracking · SEO On-Page
El servidor de MAJA responde en 65–130 ms — eso es excelente. El CDN de Shopify hace bien su trabajo. Pero cada página le entrega al navegador del cliente entre 6 y 6.4 MB de JavaScript decodificado, distribuidos en 180–195 archivos JS. El benchmark saludable para un ecommerce mobile es menos de 1 MB y menos de 30 archivos.
1 — Sobrecarga de apps: 25+ aplicaciones activas simultáneamente, varias haciendo lo mismo. El peso total de JavaScript de terceros supera los 870 KB, sin contar el tema.
2 — Tracking redundante: 3 herramientas de heatmaps en paralelo (Hotjar + Heatmap.com + Clarity). Doofinder cargado 2 veces. 2 propiedades de GA4. Google Ads duplicado. El stack de datos genera ruido, no señal.
3 — SEO On-Page básico roto: La página de colección no tiene H1. La homepage tiene H1 con texto duplicado. El 47–52% de las imágenes no tienen atributo alt.
| Métrica | Homepage | PDP (Producto) | PLP (Colección) | Benchmark saludable |
|---|---|---|---|---|
| TTFB | 65 ms | 65 ms | 130 ms | <200 ms |
| DOM Content Loaded | 1.16 s | 0.71 s | 1.01 s | <1.5 s |
| Load event | 2.38 s | 1.60 s | 1.71 s | <2.5 s |
| Peso total de página | 18.05 MB | 9.79 MB | 11.39 MB | <3 MB mobile |
| Requests totales | 414 | 343 | 340 | <80 |
| Archivos JavaScript | 190 | 195 | 180 | <30 |
| JS decodificado | 6.37 MB | 6.08 MB | 5.56 MB | <1 MB |
| Hojas de estilo CSS | 35 | 39 | 36 | <8 |
| Imágenes sin alt | 90/191 (47%) | 17/98 | 30/58 (52%) | 0 |
| Host | Requests | Peso decodificado | Acción |
|---|---|---|---|
| majasportswear.com | 254 | 14.5 MB | Code-split + lazy loading de apps |
| connect.facebook.net | 2 | 813 KB | Migrar a Conversions API server-side |
| cdn.shopify.com | 27 | 464 KB | OK — Shopify core |
| cdn.jsdelivr.net | 3 | 118 KB | Identificar app — ¿self-host posible? |
| fonts.googleapis.com | 2 | 64 KB | Agregar font-display: swap + preload |
| App / Servicio | Categoría | Peso est. | Páginas |
|---|---|---|---|
| Tema y plataforma base | |||
| Shopify Theme (vendor + theme + custom) | Tema | 270 KB | Todas |
| Apps de negocio | |||
| Intelligems (A/B testing de precios) | Testing | 372 KB | Todas |
| Wrapped (opciones de regalo) | Gift wrap | 172 KB | Todas |
| Yotpo Reviews | Reseñas | 81 KB | Todas |
| Blockify Fraud Filter | Seguridad | 50 KB | Todas |
| Selleasy (upsell/cross-sell) | Upsell | 46 KB | Todas |
| Kueskipay (BNPL / pagos a plazos) | Pagos | 41 KB | Todas |
| Yotpo Loyalty & Rewards | Fidelización | 32 KB | Todas |
| Klaviyo (email / SMS marketing) | Marketing | 17 KB | Todas |
| Swish Wishlist King | Wishlist | 14 KB | Todas |
| Analytics — REDUNDANCIA CRÍTICA | |||
| Hotjar (hjid: 6569959) | Heatmaps | 15 KB | Todas ⚠️ |
| Heatmap.com (sid: 5076) | Heatmaps | 10 KB | Todas ⚠️ |
| Microsoft Clarity (idpe3yv4c6) | Heatmaps | dinámico | Todas ⚠️ |
| Búsqueda — DUPLICADO CRÍTICO | |||
| Doofinder — Instancia 1 (tema Liquid) | Búsqueda | 5 KB | Todas ⚠️ DUPLICADO |
| Doofinder — Instancia 2 (App Block) | Búsqueda | 5 KB | Todas ✓ Correcta |
| Paid Media y Tracking | |||
| Facebook Pixel (1024517206293447) | Paid Social | 813 KB | Todas (vía WPM) |
| TikTok Pixel (CEUU6TBC77UA1PN5K8CG) | Paid Social | — | Todas (vía WPM) |
| Google Ads + GA4 (Shopify channel) | Ads / Analytics | — | Todas (vía WPM) |
| Google Tag Manager (GTM-5Z5QGPD3) | Tag Manager | 35 KB | Todas |
| Otros | |||
| NaizFit (guía de tallas IA) | UX | dinámico | Todas |
| Triple Whale (atribución multi-touch) | Atribución | inline | Todas |
| Bestpush / ReStock (push notifications) | Notificaciones | 7 KB | Todas |
| Avada SEO Suite | SEO | 3 KB | Todas |
| Total JS de terceros estimado por página | ~870+ KB (sin tema ni Shopify core) | ||
Cada página del sitio carga DOS instancias independientes de Doofinder simultáneamente: Instancia 1 inyectada desde el código Liquid del tema, e Instancia 2 inyectada por el App Block de Shopify (la instalación correcta).
Consecuencia: dos sesiones de búsqueda en paralelo, posibles conflictos en el tracking, petición bloqueante extra.
Hotjar (hjid: 6569959) + Heatmap.com (sid: 5076) + Microsoft Clarity (idpe3yv4c6) están activos simultáneamente. Las tres hacen exactamente lo mismo: grabaciones de sesión y mapas de calor.
Consecuencia: ~40 KB de JS redundante, triple captura con propósito idéntico, datos fragmentados.
GA4 property G-86V8DLS669 configurada en GTM. GA4 property GT-K48DF3RL configurada en Shopify Google Channel (vía WPM). Google Ads AW-322713436 disparando desde GTM y desde Shopify WPM al mismo tiempo.
Consecuencia: conversiones infladas en Google Ads, datos fragmentados en dos propiedades GA4.
El contenedor GTM-5Z5QGPD3 tiene 17 tags en estado "paused" (desactivados). No afectan el rendimiento, pero complican el mantenimiento y son señal de un contenedor sin limpieza regular.
| Script | Peso | Propósito |
|---|---|---|
| Custom pixel script (ID: 1024517206293447) | 447 KB | Inicializa el SDK de Meta |
| fbevents.js | 366 KB | Biblioteca de eventos del pixel |
| TOTAL FACEBOOK | 813 KB | Por página, en cada visita |
Detectado en el código: "facebookCapiEnabled": true — Shopify envía eventos desde sus servidores a Meta. Esto bypasea ad blockers y el bloqueo de iOS. El problema: el pixel client-side completo (813 KB) sigue cargando.
| Página | Problema | Severidad | Fix |
|---|---|---|---|
| PLP /collections/* | H1 ausente — 0 elementos H1 en la página | Crítico | Editar collection.liquid → envolver título en <h1> |
| Homepage | H1 duplicado: "MAJA SPORTWEAR MAJA SPORTWEAR" | Crítico | Bug en header.liquid — SVG <title> + texto se concatenan |
| PDP (Producto) | 3 elementos H1 en la misma página (mensajes error tallas) | Crítico | Cambiar a <p> o <h3> los mensajes de error |
| Homepage | 90 de 191 imágenes (47%) sin atributo alt | Crítico | Poblar alt desde admin de Shopify por sección |
| PLP | 30 de 58 imágenes (52%) sin alt | Crítico | Revisar template de colección |
| PDP | Meta description = 106 caracteres (corta) | Medio | Ampliar a 140–155 chars con USP + CTA |
| PLP | Meta description = 114 caracteres (corta) | Medio | Ídem |
| PLP | Schema FAQPage en página de colección (atípico) | Medio | Verificar en GSC — riesgo de manual action |
| Todas | viewport con height=device-height (no estándar) | Bajo | Quitar — puede causar bugs en iOS Safari |
| Homepage | Schema: falta Organization + WebSite con SearchAction | Medio | Agregar — habilita sitelinks y searchbox en Google |
La marca ya gana sus búsquedas branded. El H1 debe targetear el keyword head del negocio.
Recomendación: "Ropa Outdoor para Hombre y Mujer" o "Ropa para tu Próxima Aventura Outdoor"
| Check | Estado | Detalle |
|---|---|---|
| robots.txt accesible | PASS | Estándar Shopify, sin bloqueos incorrectos |
| sitemap.xml | PASS | Index con 4 sub-sitemaps: products, pages, collections, blogs |
| Canonical homepage / PDP / PLP | PASS | URLs master correctas, sin ?variant= en PDP |
| Hreflang | PASS | 4 alternates por página — correcto |
| AhrefsBot | WARNING | crawl-delay: 10 — ajustar si tienen suscripción activa |
| Schema Homepage | WARNING | Solo BreadcrumbList. Falta Organization y WebSite con SearchAction |
| Schema PDP | PASS | Product + ProductGroup + BreadcrumbList — correcto |
| Schema PLP | WARNING | FAQPage en PLP es atípico — riesgo de manual action |
| # | Script | Host | Peso | Recomendación |
|---|---|---|---|---|
| 1 | shop-pay-usePostPurchase.js | majasportswear.com | 1,346 KB | Defer — cargar solo en carrito/checkout |
| 2 | utilitiesFullScreenBackground.js | majasportswear.com | 530 KB | Theme custom — code-split por ruta |
| 3 | Facebook Pixel (1024517206293447) | connect.facebook.net | 447 KB | Ver sección CAPI — optimizable a ~50 KB |
| 4 | fbevents.js | connect.facebook.net | 366 KB | FB total = 813 KB — migrar a CAPI server-side |
| 5 | browser.Blv1NClA.js (probable Sentry) | majasportswear.com | 292 KB | Si es Sentry: usar tunnel + tracesSampleRate bajo |
| 6 | locale-es.BQF4JwIH.js | majasportswear.com | 224 KB | Solo es-MX — revisar tree-shaking |
| 7 | theme.js | majasportswear.com | 214 KB | Bundle del tema — auditar imports innecesarios |
| 8 | Intelligems bundle | cdn.intelligems.io | 372 KB | ¿Tests activos? Si no: desactivar. Si sí: quitar fetchpriority=high |
| 9 | dist-vendor.js | majasportswear.com | 175 KB | Vendor bundle del tema |
| 10 | wrapped-app-embed.js | cdn.shopify.com | 172 KB | ¿Genera revenue? Verificar conversiones antes de mantener |
| 11 | worker.modern.js × ~10 instancias | majasportswear.com | 730 KB total | BUG: mismo worker inicializado por cada sección → Singleton-ize |
El mismo archivo worker se inicializa una vez por cada bloque o sección del tema en lugar de una sola vez (patrón singleton). Genera 730 KB adicionales de JS completamente innecesario en el homepage.
Esta app de A/B testing de precios se carga con prioridad máxima en homepage, colección y producto. Si no hay experimentos activos, debería estar desactivada. Si hay tests activos, eliminar el atributo fetchpriority="high" para no bloquear el LCP.
| Tipo de tag | Cantidad | Descripción |
|---|---|---|
| Variables (__v) | 28 | Variables de dataLayer, cookies, URL, elementos DOM |
| Tags pausados (__paused) | 17 | Desactivados — pendiente de auditoría y limpieza |
| Variables JS personalizadas (__jsm) | 8 | Custom JavaScript variables |
| Eventos GA4 (__gaawe) | 6 | Eventos enviados a la propiedad GA4 del GTM |
| Click listeners (__cl) | 6 | Triggers basados en clics de usuario |
| URL variables (__u) | 4 | Variables de URL, query params, paths |
| Custom HTML tags (__html) | 2 | sessionStorage check + Microsoft Clarity snippet |
| Google tags (__googtag) | 2 | Base tags de Google Ads y GA4 |
| History listener (__hl) | 1 | Navegación SPA y AJAX |
| Servicio | ID encontrado en GTM | Estado |
|---|---|---|
| GA4 | G-86V8DLS669 | Crítico — duplicado con Shopify |
| Google Ads | AW-322713436 | Crítico — duplicado con WPM |
| Microsoft Clarity | idpe3yv4c6 | OK |
| Facebook Pixel | No encontrado en GTM | Corre exclusivamente vía Shopify WPM (iframe sandboxeado) |
Cambios de bajo riesgo y alto retorno. La mayoría no requiere staging ni QA extendida. Asignar un owner y una fecha para cada una.
Para cada una: definir owner, estimado de dev, criterios de éxito medibles. El mayor impacto: fix de worker.modern.js (−730 KB) y optimización del Pixel de Meta (−600 KB + cobertura).
Correr PageSpeed Insights en las 3 URLs para comparar scores Lighthouse antes/después. Revisar Meta Events Manager para confirmar cobertura de CAPI. Auditar en GA4 que solo haya una propiedad activa recibiendo datos.
Problema
El H1 actual del homepage devuelve "MAJA SPORTWEAR MAJA SPORTWEAR" (texto duplicado). El <h1> envuelve simultáneamente un logo SVG con <title>MAJA SPORTWEAR</title> y un <span> con el mismo texto. Al leer textContent, el navegador concatena ambos.
Cambios requeridos
1) Cambiar h1.header__heading a div.header__heading en header.liquid. El enlace del logo debe tener aria-label con el nombre de la tienda.
2) El heading del hero banner debe ser <h1>, no <h2> — en image-banner.liquid.
3) Cambiar copy del hero: "Aventura, Estilo y Comodidad" → "Ropa Outdoor para Hombre y Mujer"
Criterios de aceptación
{{ collection.title }}<p class="error-message">