Rendimiento, código, SEO, UX, accesibilidad y seguridad de negocios.atlantic.la, con plan de mejora por fases.
Examen de 25 láminas: hallazgos medidos, evidencia y cómo mejorarlos.
atlanticfs-wholesale · negocios.atlantic.lashopify theme check sobre los 300 archivos del temaLa infraestructura responde en milisegundos; lo que pesa y falla es el tema y el contenido. Estos son los cuatro hallazgos que más importan.
El sitio dice «Login para ver precios», pero precios y datos salen en /products.json, en el buscador y en el schema de cada ficha.
Cambia src por data-src y reemplaza fragmentos de scripts propios de Shopify. Genera errores de JavaScript en cada página.
Cinco pestañas de colecciones se pintan completas aunque solo se vea una.
30 de 30 colecciones sin H1 ni meta descripción; 246 de 250 productos con descripción vacía; 0 de 275 imágenes con alt.
Cada hallazgo lleva una prioridad: P0 crítico, P1 alto, P2 medio, P3 bajo.
| Área | Hallazgos principales | Estado |
|---|---|---|
| Rendimiento | Portada 46 / 100; DOM 11.204; 5 pestañas y 5 slideshows; GTM 310 KB | Alta prioridad |
| Código | 1.455 observaciones; content_for_header modificado; layouts duplicados | Alta prioridad |
| SEO | Colecciones sin H1 ni meta; 246 de 250 productos sin descripción; 0 de 275 imágenes con alt | Alta prioridad |
| Visual y UX | Marca fuerte; precio sin salida; fichas sin datos; registro sin contexto | Prioridad media |
| Accesibilidad | 87 – 92 en Lighthouse; contraste y nombres de enlaces por corregir | Prioridad media |
| Seguridad y privacidad | Precios extraíbles; formulario de registro en tercero; apps sin revisar | Crítico / pendiente Admin |
Probado desde un navegador sin sesión.
/products.jsonCualquiera, sin cuenta, lee el precio de cada variante. Ejemplo medido: un producto devuelve 100000.00.
El JSON-LD de cada ficha incluye price (por ejemplo 45972.0 COP) aunque la página muestra «Iniciar sesión para ver precios».
.js/search/suggest.json y /products/<handle>.js también entregan precio sin sesión.
Google compara el precio del schema con el de la página. Que no coincidan puede quitar el rico en resultados o generar avisos en Search Console.
Competidores y revendedores pueden extraer el catálogo con precios completo en minutos. Si la política es que el precio es reservado, hoy no se cumple.
Falta confirmar si el precio público es la lista general o el precio mayorista por empresa; define la gravedad real.
price y offers del JSON-LD cuando el cliente no esté logueado.Es un «parche de velocidad» heredado del tema original. Hoy cuesta estabilidad y datos.
Invalid left-hand side in assignment y process is not defined aparecen varias veces en la consola de la portada. Dos de los scripts rotos son de Shopify (el adaptador WebMCP y Shopify.PaymentButton).content_for_header pasa por una cadena de replacelayout/theme.liquid:86 lo comenta y snippets/header-content.liquid lo imprime cambiando src= por data-src=, eventos DOMContentLoaded y la llamada asyncLoad.
index,follow sobre el noindex de ShopifyReemplaza <meta name="robots" content="noindex,nofollow"> por index,follow. Puede indexar páginas que Shopify quería ocultar.
content_for_headermain-collection.liquid:75, main-search.liquid:65 y header-content.liquid:10,12 (marcados como error por theme check).
Un SVG en base64 con alt="website" justo tras <body>. Es un truco para influir en el LCP y no aporta nada al usuario; conviene quitarlo.
content_for_header en el layout alternotheme.advreg.old.liquid y theme.liquid no lo declaran de forma estándar; theme check lo reporta como error obligatorio.
{{ content_for_header }} a su forma estándar y medir de nuevo el rendimiento.Medición local de Lighthouse, una corrida por página.
collection_tabs_Unp8kL: 7 pestañas que se imprimen completas, cada tarjeta con su formulario de agregar al carrito (215 formularios en la página).
La portada apila 5 slideshows y 5 bloques de pestañas (27 pestañas). El HTML pesa 608 KB sin comprimir.
Google Tag Manager transfiere unos 310 KB; unused-javascript estima 203 KiB sin usar.
SweetAlert2 se carga desde jsDelivr sin versión fija y bloquea el análisis del HTML (theme.liquid:88).
Banners de 554 KB y 195 KB; Lighthouse estima 184 KiB de ahorro al pasarlos a WebP/AVIF y ajustar tamaños.
| Plantilla | Rendimiento | LCP | TBT | DOM | Peso | Observación |
|---|---|---|---|---|---|---|
| Portada (móvil) | 46 | 6,4 s | 1.890 ms | 11.204 | 1.135 KiB | Pestañas de colecciones renderizadas completas |
| Portada (escritorio) | 46 | 4,0 s | 430 ms | 11.204 | 1.076 KiB | Mismo problema, menos visible |
| Colección /all | 88 | 3,7 s | 100 ms | 4.752 | 880 KiB | CLS 0,056; imagen LCP sin precarga |
| Ficha de producto | 96 | 2,7 s | 90 ms | 3.076 | 805 KiB | Buena; 2,7 s de LCP mejorable |
Imprimir solo la pestaña activa y traer el resto con AJAX al hacer clic. Debería bajar la portada a menos de 3.000 elementos.
prioritize-lcp-image falla: añadir fetchpriority="high" a la primera imagen.
sweetalert2@11 y loader.init-shop-cart-sync salen con caché corto; fijar versión y autoalojar.
.ttc de 2,3 MB en el temaatlantic-helvetica.ttc no apareció entre las descargas de la portada; confirmar si se usa y, si no, retirarla.
shopify theme check sobre 300 archivos. 184 archivos tienen al menos una observación.| Observación | Cant. | Lectura |
|---|---|---|
Traducciones sin llave base (MatchingTranslations) | 441 | Casi todo en pt-BR, pt-PT y es: idiomas que no se usan |
Filtro obsoleto img_url | 151 | Cambiar a image_url (imágenes responsivas) |
Objeto block sin definir | 93 | Código que depende de contexto no declarado |
| Snippets huérfanos | 77 | Archivos que nadie incluye |
Lazysizes en vez de loading=lazy | 67 | Librería innecesaria en navegadores actuales |
| Activos remotos (no CDN de Shopify) | 27 | Dependencia de jsDelivr y otros |
| Sintaxis HTML/Liquid rota | 25 | Ej.: assets/collection.css.liquid |
| Scripts que bloquean el análisis | 7 | Sin defer ni async |
Filtro trim inexistente | 3 | Falla silenciosa en fichas y tarjetas |
| Snippet que no existe | 2 | ssw-widget-avg-rate-listing |
trim inexistente, el snippet faltante y los scripts bloqueantes.theme.advreg.old.liquid duplica GTM, jQuery y scripts: riesgo de editar el archivo equivocado.
.liquid33 archivos con <style> propio y 24 etiquetas <script> solo en theme.liquid; hay parches de CSS puntuales en header-1, header-3 y navigation.
Instagram, lookbook, shop-the-look, masonry, product-slider, round-banners, scrolling-text y más. Verificar una a una antes de retirar.
portfolio1-4, contact1/2, store-locations, about2, joy con correos de plantilla (@yousite, @company.com).
!important en theme.cssSeñal de estilos en conflicto; complica cualquier ajuste visual.
jQuery 88 KB, Swiper 144 KB, PhotoSwipe 52 KB, Masonry 24 KB, jquery.currencies. No hay multimoneda activa que lo justifique.
Weglot (weglot_switcher.liquid), token de Instagram en theme.js:1108, verificación de edad con document.write.
area-label en lugar de aria-label (3 sitios), https// sin dos puntos en preconnect, doble canonical.
Draft – Mapache., limpiar sin cambiar el aspecto (archivos huérfanos, layout viejo, secciones sin uso), y medir con Lighthouse al final de cada bloque.robots.txt correcto: bloquea carrito, checkout y cuentas; permite rastreadorescanonical presente y coherente en las 91 URL medidas; ninguna con noindexhreflang, lang="es" y HSTSProduct y BreadcrumbListog:image)Muestra distribuida por todo el sitemap, no solo las primeras URL.
| Medida (muestra rastreada) | Páginas (16) | Colecciones (30) | Productos (45) |
|---|---|---|---|
| Sin meta descripción | 7 (44 %) | 30 (100 %) | 40 (89 %) |
| Sin H1 | 6 (38 %) | 30 (100 %) | 0 |
| Título de más de 60 caracteres | 0 | 0 | 15 (33 %) |
Sin og:image | 16 (100 %) | 30 (100 %) | 2 (4 %) |
| Meta descripción repetida | 0 | 0 | 2 |
La colección /collections/res no muestra título ni texto en la página. Es la plantilla con más potencial para búsquedas genéricas y hoy no dice de qué trata.
«Res– NEGOCIOS.ATLANTIC»: falta el término de búsqueda real («Cortes de res para restaurantes…»).
40 de 45 fichas no tienen meta; en las que sí, empieza con «Presentación: Unidad de peso variable…» y se corta a mitad de frase.
b2b-register, importar, user-management, contactanos, lineaetica y politicas-de-entrega no tienen H1; los títulos son el slug.
Muestra de /products.json (250 productos) y rastreo de 45 fichas.
Qué es, formato, peso, conservación, uso en cocina y presentación. Empezar por los 100 productos más vendidos.
Se puede generar con la plantilla {título} – {presentación} y cargarlo por Matrixify (ya instalada) o la Admin API.
89 % de la muestra no tiene foto propia; es lo que más se ve en las colecciones.
33 de 250 productos no tienen etiquetas; el brand del schema dice «NEGOCIOS.ATLANTIC» en vez de la marca real.
Todos terminan en «– NEGOCIOS.ATLANTIC»; en 15 de 45 fichas eso los deja por encima de 60 caracteres.
Product con precio públicoYa visto: el precio está en el JSON-LD aunque la página lo oculta.
priceValidUntil con formato inválidoSale como 2026-11-14 14:04 y parece calculado al día siguiente. Debe ser una fecha ISO (2026-12-31).
description vacía y brand incorrectoLa descripción del producto va vacía y la marca es el nombre de la tienda.
@context con http://5 archivos usan http://schema.org; debe ser https://.
created-order, importar, user-management, solicitud-de-credito y solicitud-de-credito-1 están en el sitemap y sin noindex.
solicitud-de-credito y solicitud-de-credito-1 repiten estructura: riesgo de contenido duplicado.
FAQPage y LocalBusinessExisten páginas de ayuda, entregas y devoluciones; el schema de organización no incluye contacto ni dirección.
og:image ni twitter:cardLos enlaces compartidos por WhatsApp se ven sin imagen, relevante en un negocio que vende por contacto directo.
noindex) y corregir el schema son cambios pequeños con efecto inmediato en cómo Google interpreta el sitio.G-Q3ZCE86RF3 fijo en el tema y G-L71YVNT4C7 cargado por GTM. Si ambas se usan, los datos se reparten o se duplican.
Aparece AW-629080426; confirmar que las conversiones no se cuentan dos veces.
GTM-5GXW594D en el <head> y de nuevo en <noscript>Normal, pero hay también una copia en el layout viejo; unificar.
/favicon.ico y la bandera es.svg del selector de idioma devuelven 404 en cada carga.
Lighthouse reporta una cookie de terceros (shop.app/pay/hop); es de Shopify, pero entra en el aviso de cookies.
process is not defined en consolaProvienen de scripts de terceros; revisar si es la app de registro o el chatbot.
Enlace subrayado dorado sobre negro: bajo contraste (falla el chequeo de Lighthouse) y sin siguiente paso. Debe ser botón y ofrecer «Regístrate para ver precios».
En /collections/res el usuario ve filtros y tarjetas, pero ninguna cabecera que diga dónde está.
«Aji-No-Men…», «Carne Molida Americana 7 Peso Varia…»: el nombre completo es la decisión de compra. Permitir 2 líneas.
Productos con el isotipo en lugar de foto; una foto con zoom distinto al resto rompe la grilla.
La colección no muestra «Ordenar por», cuántos productos hay ni el formato. Los filtros (tipo, categoría, presentación, cuisine) están colapsados.
Carrusel y pestañas, pero nada sobre cobertura, pedido mínimo, entregas o crédito para el negocio que llega por primera vez.
El megamenú es útil pero extenso; la jerarquía Res/Cerdo/Aves/Mariscos es clara, los niveles profundos conviene probarlos con usuarios.
Bloque crema sin contenido visible entre los banners y el menú inferior.
Se abre y no muestra nada; en 246 de 250 productos el cuerpo está vacío.
No hay presentación, peso por unidad, conservación, empaque ni calibre; el cliente B2B lo necesita para comparar.
Solo «Iniciar sesión para ver precios». Falta «Solicitar cotización» o «Registrarme» para quien aún no tiene cuenta.
Se muestra «72» sin etiqueta, sin contexto.
«Precio sin IVA e impuestos», «precios en kilos» y «peso variable» están bien, pero repetidos en todas las fichas; separarlos por tipo de producto.
225 de 250 productos tienen una sola imagen; falta empaque trasero, tabla nutricional y foto en uso.
El bloque de abajo repite la misma tarjeta con «Login para ver precios» en vez de recomendar relacionados.
No incluye la colección; menos orientación y menos enlaces internos.
Es el embudo más importante de una tienda B2B: pasar de visitante a cliente aprobado.
/pages/b2b-register abre directo con «Información de Facturación»: no explica requisitos, tiempos de aprobación ni beneficios.
El breadcrumb dice «b2b-register» y el título de la pestaña también.
El formulario viene de taloncommerce.com (app Advanced Registration). Ahí viajan NIT, cédula y datos de contacto; revisar acuerdo de tratamiento de datos.
«Tipo factura / Persona», «No. de identificación» con «número de cédula» y «Nit» sin asterisco: no queda claro qué es obligatorio.
Es un formulario largo (facturación, establecimiento, redes sociales) sin pasos ni estimación de tiempo.
solicitud-de-credito y solicitud-de-credito-1 están publicadas; consolidar.
La página de cuenta no ofrece «¿Olvidaste tu contraseña?» destacado ni enlace al registro.
Botones «Login para ver precios», el enlace «Sushi» de la portada y el botón de login en la ficha.
El ícono de búsqueda (searchIcn), enlaces cl_item_link con href vacío y el botón de filtros con area-label (typo de aria-label).
Hay un <h4> en el encabezado antes de cualquier H1/H2 (h4 fl f-aic f-jcsb).
El logo y la bandera «Español» repiten texto; deben ser decorativos o describir la acción.
En los enlaces de la galería (data-pswp) de la ficha.
Aceptable en etiquetas, pero no en texto de lectura.
lang="es", viewport sin bloqueo de zoom y la portada no se desborda en móvil.Ver lámina de precios: es una fuga de información comercial.
NIT, cédula, dirección y teléfono pasan por taloncommerce.com. Pedir al proveedor política de datos, ubicación y retención.
Matrixify, Wizybot, Advanced Registration, Forms y la app propia b2b-atlantic-mapache requieren revisión en el Admin (en la B2C, Matrixify y Wizybot tienen acceso a todo el historial de pedidos).
SweetAlert2 desde jsDelivr y Tag Manager: si el CDN se compromete, se ejecuta código ajeno en la tienda. Fijar versión y autoalojar.
includeSubDomainsLo controla Shopify; informativo.
security.txtEstándar de Shopify; opcional.
shpat_, sk_live, AKIA ni claves privadas en el tema; X-Frame-Options: DENY, CSP con frame-ancestors, cookies HttpOnly y Secure. Pendiente: usuarios, 2FA y apps en el Admin B2B.| Fase | Acciones | Horas aprox. | Resultado esperado |
|---|---|---|---|
| 0 · Esta semana | Respaldo ya hecho. Decidir política de precios. Quitar páginas internas del sitemap. Corregir https//, doble canonical, area-label. Sacar el SVG de 9999 px | 6 – 8 | Cierra el riesgo de precios y las correcciones más rápidas |
| 1 · Semanas 2 a 4 | Devolver content_for_header a estándar. Cargar pestañas de la portada bajo demanda. H1 y meta en colecciones y páginas. Botón «Registrarme para ver precios». Una sola GA4 | 16 – 20 | Portada móvil de 46 a 85 puntos o más. Colecciones indexables con contexto |
| 2 · Mes 2 | Alt para todo el catálogo. Meta y descripciones de los 100 productos principales. Ficha de producto rediseñada. Registro B2B con introducción y pasos | 20 – 24 | Más páginas con texto propio y mejor conversión de visita a cliente |
| 3 · Mes 3 | Limpieza de código (secciones, layouts, img_url, lazysizes). Fotos reales. Revisión del Admin (usuarios, 2FA, apps) | 14 – 18 | Tema mantenible y menos superficie de riesgo |
Draft – Mapache., no sobre el publicado.| # | Acción | Prior. | Esfuerzo | Dónde |
|---|---|---|---|---|
| 1 | Ocultar precios de verdad (catálogos B2B) y quitarlos del schema sin sesión | P0 | Medio | Shopify + tema |
| 2 | Restaurar content_for_header estándar | P0 | Medio | Tema |
| 3 | H1, descripción y meta en las 268 colecciones | P0 | Medio | Tema + datos |
| 4 | Cargar pestañas de la portada bajo demanda | P1 | Medio | Tema |
| 5 | Botón claro «Registrarme para ver precios» | P1 | Bajo | Tema |
| 6 | Alt para el catálogo completo | P1 | Medio | Datos / Matrixify |
| 7 | Descripciones y meta de los 100 productos principales | P1 | Alto | Contenido |
| 8 | Una sola GA4 y revisión de Ads | P1 | Bajo | GTM / GA4 |
| 9 | Registro B2B con introducción, pasos y H1 | P1 | Medio | Tema + app |
| 10 | Sacar páginas internas del sitemap (noindex) | P2 | Bajo | Tema |
| 11 | Corregir schema (priceValidUntil, brand, https) | P2 | Bajo | Tema |
| 12 | Optimizar imágenes PNG y precargar la imagen LCP | P2 | Bajo | Tema + archivos |
| 13 | Arreglos de accesibilidad (contraste, nombres, encabezados) | P2 | Bajo | Tema |
| 14 | Limpiar layouts, secciones y plantillas de demostración | P2 | Medio | Tema |
| 15 | Revisar Admin: usuarios, 2FA y permisos de apps | P1 | Bajo | Admin B2B |
| Indicador | Hoy | Meta | Cómo se mide |
|---|---|---|---|
| Rendimiento portada (móvil) | 46 | 85 o más | Lighthouse en las mismas condiciones |
| LCP portada (móvil) | 6,4 s | menos de 2,5 s | Lighthouse y datos de campo |
| TBT portada (móvil) | 1.890 ms | menos de 200 ms | Lighthouse |
| Elementos en el DOM (portada) | 11.204 | menos de 3.000 | Lighthouse |
| Errores de JavaScript en consola | 6+ por carga | 0 | Consola del navegador |
| Colecciones con H1 y meta | 0 % | 100 % | Rastreo propio |
| Fichas con meta descripción propia | 11 % | 100 % de las 100 principales | Rastreo propio |
| Imágenes de producto con alt | 0 % | 100 % | API de productos |
Observaciones de theme check | 1.455 | menos de 400 | shopify theme check |
| Propiedades GA4 activas | 2 | 1 | Revisión de GTM |
Draft – Mapache.content_for_header estándar y medir rendimiento antes y después