Auditoría SEO — fibrolab.cl

Fecha: 2026-05-18 (14 días tras audit v3 del 04-may) URL: https://www.fibrolab.cl/ Tipo de negocio: Hybrid — Manufacturer + LocalBusiness + HomeAndConstructionBusiness + SAB nacional. Fábrica en La Pintana, instalación en RM/Valparaíso/O'Higgins/Maule + despachos a todo Chile. Stack: WordPress + WooCommerce + Rank Math + LiteSpeed Cache + GTM-W6DGGKK + PixelYourSite Free. Idioma: es-CL (hreflang es-CL + x-default). NAP: Fibrolab · Los Álamos 2538, La Pintana, Región Metropolitana · +56 9 8225 6792 · contacto@fibrolab.cl · RUT 77.424.952-4 · postalCode declarado 8830000 (verificar contra Correos de Chile).

Metodología: auditoría fresca con 7 subagentes en paralelo (technical, content, schema, sitemap, performance, geo, local) sobre HTML live + cruce con working-tree. Sin Google API credentials, sin DataForSEO MCP — métricas son lab/proxy, no field data.


SEO Health Score — 65 / 100 (↑ 5 vs v4 = 60)

Categoría Peso Score Ponderado Δ v4
Technical SEO 22% 72 15.84 ↑11
Content Quality / E-E-A-T 23% 71 16.33 ↑9
On-Page SEO 20% 62 12.40 ↑2
Schema / Datos estructurados 10% 61 6.10 ↑1
Performance (CWV proxy) 10% 52 5.20 ↑10
AI Search Readiness (GEO) 10% 61 6.10 ↑7
Imágenes 5% 70 3.50 ↓5
Total ~65 ↑5

Local SEO (informativo, fuera de fórmula): 54/100 (+2 vs v4 informativo de 52).

Lectura: la subida del score frente a v4 refleja deploys reales — el hero <picture> de /piscinas-de-fibra/ ya está en producción (resolviendo el issue v4 más doloroso), CSS bundle ahora brotli en wire (73KB vs 271KB uncompressed), self-hosted fonts estables con preload y font-display:swap. Las regresiones son mínimas: el redirect 301 de /cobertor-de-seguridad/ pierde Service schema, CSP sigue listando openreplay.com pese a que el script fue removido. Los dos issues críticos heredados desde el 27-abr siguen vivos: jQuery sync en <head> + Font Awesome cdnjs render-blocking.


Score Trajectory (5 audits)

Fecha Score Δ
2026-04-27 v1 48 base
2026-04-29 v3 64 +16
2026-05-04 v4 60 ↓4 (re-scoring riguroso)
2026-05-18 v5 65 +5

C1. 5 URLs en page-sitemap.xml retornan 301 o 404

Sin cambios desde v4. Sin cambios desde v3.

page-sitemap.xml sigue conteniendo: - /spa-y-jacuzzi/ → 301 a /jacuzzi/ - /cobertor-de-seguridad/ → 301 a /modelo/cobertor-de-seguridad-para-piscinas/ - /contacto/ → 301 a / (redirige al home, lo que sugiere que la página fue eliminada — anómalo) - /politica-de-privacidad/ → 404 - /terminos-y-condiciones/ → 404 - /paneles-solares/ → 404

Simultáneamente 6 URLs live (200 OK) NO están en ningún sitemap: /spas/, /jacuzzi/, /financiamiento-salvum/, /revestimiento-fibra-de-vidrio/, /revestimiento-super-brite/, /reparacion/.

Acción: RankMath → Sitemap settings → Exclude posts/pages no existentes; publicar /politica-de-privacidad/ + /terminos-y-condiciones/; investigar por qué /contacto/ redirige al home (la página realmente devuelve 200 según seo-local, así que el 301 ocurre en otro contexto — revisar Yoast/RankMath redirection rules).


C2. Inconsistencia factual en /nosotros/: "6 años de experiencia" vs "desde 2020"

NUEVO finding del subagente GEO.

Página /nosotros/ declara "6 años de experiencia". Founding date schema = 2020, y en mayo 2026 son 5 años cumplidos, recién entrando al sexto. Una IA al fact-check va a flagear esto como afirmación inflada, restando trust signal.

Acción: cambiar a "fundada en 2020" o usar (int) date('Y') - 2020 igual que el contador dinámico del hero (que ya está bien implementado).


C3. /financiamiento-salvum/ sin disclosures Sernac / Ley 19.496 / CAE / tasa de interés

Sin cambios desde v4 ni v3. Riesgo legal Chile.

La página promociona crédito al consumo (hasta 60 cuotas, 100% financiamiento, recolecta RUT + ingreso por formulario) sin: - Costo Anual Equivalente (CAE) en rango - Tasa de interés declarada - Mención a Ley 19.496 / Sernac - Política de Privacidad enlazada en el formulario - Checkbox de consentimiento para tratamiento de datos personales

La CMF y Sernac exigen estos disclosures cuando se promueve crédito al consumo. Es el único finding del audit con riesgo regulatorio además del riesgo SEO/trust.


C4. Product schema sin hasMerchantReturnPolicy ni shippingDetails — bloquea Merchant Center

Sin cambios desde v4 ni v3.

/modelo/piscina-7-metros/, /modelo/bomba-de-calor-aquark-mr-eco-epn13-65m3-220v/, etc. — el Offer tiene priceCurrency, price, availability, priceValidUntil pero cero propiedades de devolución/envío. Google Shopping/Merchant Center exige ambas para listings de productos.

Patch listo (de seo-schema, aplicar en single-product.php o functions.php donde se construya el JSON-LD Product):

"hasMerchantReturnPolicy": {
  "@type": "MerchantReturnPolicy",
  "applicableCountry": "CL",
  "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
  "merchantReturnDays": 10,
  "returnMethod": "https://schema.org/ReturnByMail",
  "returnFees": "https://schema.org/FreeReturn"
},
"shippingDetails": {
  "@type": "OfferShippingDetails",
  "shippingRate": { "@type": "MonetaryAmount", "value": "0", "currency": "CLP" },
  "shippingDestination": { "@type": "DefinedRegion", "addressCountry": "CL" },
  "deliveryTime": {
    "@type": "ShippingDeliveryTime",
    "handlingTime": { "@type": "QuantitativeValue", "minValue": 1, "maxValue": 3, "unitCode": "DAY" },
    "transitTime": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 7, "unitCode": "DAY" }
  }
}

C5. Duplicate @id conflict — dos JSON-LD blocks declaran @type distinto para el mismo #localbusiness

Sin cambios desde v4.

Cada página emite dos <script type="application/ld+json">: - Block 1 (Yoast/@graph)@type: Organization, @id: #localbusiness - Block 2 (custom theme)@type: ["HomeAndConstructionBusiness","LocalBusiness"], @id: #localbusiness

Google interpreta el grafo como ambiguo y aplica una sola tipificación silenciosamente, descartando la otra. El home además sólo emite Organization en el bloque Yoast (sin el array rico tipo HomeAndConstructionBusiness).

Acción: consolidar a un solo nodo en functions.php (path: wp-content/themes/fibrolab/functions.php — schema en torno a línea 321). Patch de seo-schema:

"@type": ["HomeAndConstructionBusiness", "LocalBusiness", "Organization"],
"@id": "https://www.fibrolab.cl/#localbusiness"

C6. Hero homepage: <img src> sigue siendo PNG sin srcset WebP

NUEVO finding del subagente performance.

front-page.php tiene un <link rel="preload" imagesrcset> apuntando a .webp, pero el <img> real lleva src="...otono.png" sin srcset ni wrap en <picture>. Si el browser no matchea el preload (caso edge), descarga la PNG completa.

Curiosamente /piscinas-de-fibra/ SÍ resolvió esto correctamente con <picture><source type="image/webp">. Aplicar el mismo patrón al hero del home.

Impacto LCP estimado: 200–400ms en redes lentas si el preload no matchea.


Issues ALTOS — impactan rankings y velocidad

H1. jQuery sync en <head> — render-blocking

Sin cambios desde 27-abr (audit v1). 21 días sin resolverse.

<script src=".../jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>

Sin defer, sin async. Bloquea parsing en cada page load. Impacto LCP estimado: +200–400ms.

Fix (functions.php):

add_filter('script_loader_tag', function($tag, $handle) {
  if ($handle === 'jquery-core' && !is_admin()) {
    $tag = str_replace('<script', '<script defer', $tag);
  }
  return $tag;
}, 10, 2);

Test obligatorio post-fix: WooCommerce cart/checkout, single-product galería, formularios.


H2. Font Awesome cdnjs sync — render-blocking cross-origin

Sin cambios desde 27-abr.

<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css' media='all'>

Cross-origin stylesheet bloqueando render. ~102KB uncompressed.

Fix opción A (rápida, async load):

<link rel='preload' as='style' href='...all.min.css' onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel='stylesheet' href='...all.min.css'></noscript>

Fix opción B (óptima): self-hostear sólo los 15-20 glyphs realmente usados → 4–8KB inline.


H3. GBP URL ausente de sameAs + hasMap faltante

Sin cambios desde v4 ni v3.

sameAs en LocalBusiness sólo lleva Facebook + Instagram. Falta: - URL del Google Business Profile (https://maps.google.com/?cid=XXXX o https://g.page/...) - LinkedIn (página no creada / no enlazada) - YouTube (correlación 0.737 con citaciones AI según seo-geo) - fibrolabstore.cl (sitio hermano, sin canonical cross-domain)

hasMap también ausente. Es el signal más fuerte que Google usa para asociar el LocalBusiness con su Knowledge Graph entry y el GBP del map pack.

Fix:

"hasMap": "https://maps.google.com/?cid=YOUR_CID",
"sameAs": [
  "https://www.facebook.com/fibrolabcl/",
  "https://www.instagram.com/fibrolabcl/",
  "https://maps.google.com/?cid=YOUR_CID",
  "https://www.linkedin.com/company/fibrolab/",
  "https://www.youtube.com/@fibrolabcl",
  "https://www.fibrolabstore.cl/"
]

H4. Páginas comunales template-comuna.php existe pero 0 publicadas

Sin cambios desde v3.

/wp-content/themes/fibrolab/template-comuna.php está listo con ACF fields (nombre comuna, región, lat/lng, distancia, testimonial). No hay ni una sola página WP creada.

Según Whitespark 2026, las páginas dedicadas por comuna/servicio son el #1 factor local organic y #2 factor AI visibility. Single highest-leverage acción disponible. Comunas RM prioritarias:

Maipú, Puente Alto, San Bernardo, Las Condes, Ñuñoa, La Florida, Lo Barnechea, Quilicura

Cada página debe tener contenido único 60%+ (testimonial local, distancia desde fábrica, caso instalado reciente). NO crear más de 30 sin justificación (regla del audit framework).


H5. Speakable schema: 0 ocurrencias sitewide

Sin cambios desde v4.

Sin SpeakableSpecification en ninguna parte del codebase. Bloquea Google AIO voice/snippet eligibility. Los dos mejores candidatos para wrappear con Speakable son: - Home → "Quiénes Somos" block (RUT, fundación, instalaciones, garantía) - /bombas-de-calor/ → "Guía de compra" (COP, dB, m³, sizing rule)

Patch:

"speakable": {
  "@type": "SpeakableSpecification",
  "cssSelector": [".fl-eeat-block", ".fl-guide-bombas"]
}

H6. HTML uncompressed en wire (131KB home, 112KB piscinas)

NUEVO finding del subagente performance.

Las respuestas HTML no llegan con content-encoding: br o gzip. CSS sí (brotli 73KB), pero HTML no. Brotli reduciría a ~30–40KB.

Fix: activar LSCWP_CTRL: respect Brotli en LiteSpeed o mod_brotli a nivel server. Ahorro estimado: ~100KB por page load.


H7. /nosotros/ thin content (~280 palabras)

Sin cambios desde v3.

H1 = "Nosotros" (sin keyword). 280 palabras visibles, debajo del floor 500w para About/Service hybrid. Cards "Garantía/Fabricación/Precio" son verbatim duplicate del home.

Mínimo acción: - Cambiar H1 a "Quiénes Somos: Fibrolab, Fábrica de Piscinas de Fibra desde 2020" - Agregar: tamaño del equipo, materiales (tipo de resina, malla), número SEC del contratista, capacidad fábrica m³/mes, 2-3 case studies con foto + comuna + año - Target 600+ palabras


H8. /jacuzzi/ thin content (~320 palabras)

NUEVO finding (no detectado en granularidad anterior).

La página de servicio más débil del sitio. Sin galería de jacuzzis instalados, sin tabla técnica (dimensiones, jets, volumen, fibra vs acrílico), sin spec por modelo. Hero "...filtro, bombas, tuberías, tablero, foco LED de regalo" es la única descripción técnica.

Acción: agregar tabla comparativa jacuzzi vs hot tub vs spa, dimensiones/jets/L por modelo, sección de cuidado/mantención. Target 900+ palabras.


Issues MEDIOS

M1. robots.txt sigue sin Google-CloudVertexBot, anthropic-ai, Bytespider, cohere-ai

21 días sin agregarse. Patch ya documentado en audits anteriores — añadir bloques explícitos:

User-agent: anthropic-ai
Allow: /

User-agent: cohere-ai
Allow: /

User-agent: Google-CloudVertexBot
Allow: /

User-agent: Bytespider
Disallow: /

(Bytespider = ByteDance / TikTok crawler para training, se recomienda disallow para alinearse con CCBot disallow ya presente.)

M2. CSP whitelist obsoleta: openreplay.com aún presente pese a script removido

NUEVO. Content-Security-Policy lista static.openreplay.com y *.openreplay.com en script-src y connect-src. Limpiar para reducir attack surface. Auditar si 'unsafe-eval' se sigue necesitando.

M3. 3 herramientas analytics/recording simultáneas — INP risk

NUEVO. OpenReplay (removido del HTML pero sigue en CSP), Microsoft Clarity, GA4 via GTM, Facebook Pixel via PixelYourSite, ContentSquare. Clarity + OpenReplay + ContentSquare son redundantes (3 session recorders). Elegir uno. Cada uno hace polling DOM continuo → INP penalty.

Footer sólo lleva Logo/Servicios/Contacto/Financiamiento. Cero links legales. YMYL-adjacent business (gasto $3-7M CLP) sin política de privacidad es negativo bajo QRG Sept 2025.

Schema lleva openingHoursSpecification correcto pero usuarios/Google no lo ven sin parsear JSON-LD. Agregar Lun-Vie 9:00-18:00 | Sab 9:00-14:00 al footer/contacto.

M6. /cobertor-de-seguridad/ redirect a producto → pierde Service schema

NUEVO regresión. El URL hub redirige 301 al producto WooCommerce. El producto tiene Product schema, no Service. Restaurar como página hub independiente o agregar Service schema al producto.

M7. AggregateRating sigue ausente — 0 WC reviews

Infraestructura lista (inc/fl-reviews.php + post-purchase email) pero 0 reviews importadas. Acción inmediata: importar 5-10 reviews GBP verificados vía el admin tool existente.

M8. No comparison page "fibra vs hormigón"

NUEVO. Query alta intención sin contenido. Crear /piscina-fibra-vs-hormigon/ con tabla comparativa (instalación, precio, mantención, durabilidad, garantía). seo-geo dejó un draft de párrafo extractable.

M9. IndexNow no configurado

NUEVO. Sin key file en /indexnow ni en /rank-math-indexnow-*.txt. Bing/Yandex aprenden cambios sólo por crawl scheduling.

M10. FAQ piscinas con phrasing genérico AI-detectable

Respuestas 2-7 muestran phrasing repetitivo ("equipo de expertos", "siempre con las mejores técnicas"). QRG Sept 2025 flagea esto. Reescribir con specifics (timeline real de un job, caso geográfico, m³ exacto).

M11. contactPoint ausente de Organization schema

Faltan contactPoint, availableLanguage, contactType en el grafo. Recomendado para Knowledge Panel.

M12. brand de bombas de calor apunta a Fibrolab en vez de Aquark

NUEVO. En /modelo/bomba-de-calor-aquark-*, brand.name = "Fibrolab". Merchant Center prefiere el fabricante real. Corregir a "Aquark" para equipamiento revendido.

M13. Postal code 8830000 no verificado vs Correos

La Pintana suele ser 8831000/8832000. Verificar y corregir en functions.php.

M14. SEC license NUMBER ausente — sólo "bajo normativa SEC" como texto

Sin cambios desde v4. Sin número, la mención es no-verificable. Agregar credencial del contratista en home, /nosotros/, /bombas-de-calor/, /paneles-solares/.


Issues BAJOS


Estado fixes pendientes desde v4 (04-may)

Fix v4 Status v5
Schema @type consolidación + Manufacturer/Organization en grafo único ❌ NO (C5 sigue)
hasMap + GBP URL en sameAs ❌ NO (H3 sigue)
Speakable schema ❌ NO (H5 sigue)
hasMerchantReturnPolicy + shippingDetails en Product ❌ NO (C4 sigue)
Páginas /contacto/, /politica-de-privacidad/, /terminos-y-condiciones/, /paneles-solares/ ❌ NO (C1 sigue)
llms.txt: /spa-y-jacuzzi//jacuzzi/ ✅ SÍ (verificado)
robots.txt: Google-CloudVertexBot, anthropic-ai, Bytespider ❌ NO (M1 sigue)
Font Awesome self-hosted / async ❌ NO (H2 sigue)
CSS bundle media=print/onload ❌ NO parcial (brotli aplicado, pero sigue sync)
jQuery defer / footer ❌ NO (H1 sigue)
Hero <img> en /piscinas-de-fibra/, /nosotros/, /jacuzzi/ ✅ SÍ en /piscinas-de-fibra/ (NUEVO LIVE) — no en /nosotros/ ni /jacuzzi/
Páginas comunales publicadas ❌ NO (H4 sigue)
Sernac / Ley 19.496 / CAE en /financiamiento-salvum/ ❌ NO (C3 sigue)
SEC license number visible ❌ NO (M14 sigue)

Score: 1 de 14 fixes resueltos completamente, 1 parcial. 86% del backlog v4 sigue abierto.


Fixes nuevos confirmados LIVE desde v4

  1. /piscinas-de-fibra/ hero ahora es <picture><source type="image/webp"><img> con loading="eager" fetchpriority="high" + width/height. Resuelve el issue v4 más doloroso de LCP.
  2. CSS bundle brotli en wire (73KB vs 271KB uncompressed). Sigue sync pero el peso wire baja ~73%.
  3. GTM + speculationrules + LiteSpeed cache todos confirmados estables.
  4. HTTP/3 (alt-svc h3=":443") advertido correctamente.
  5. x-litespeed-cache: hit confirmado en home + piscinas (cache funcional).
  6. /contacto/ devuelve 200 según seo-local — pero page-sitemap.xml aún apunta a una versión que 301-redirige al home (investigar conflicto Yoast/RankMath redirection vs página real).

Working-tree status (git)

11 archivos modificados sin commit (head/footer/single-product/page-templates/css/js) + 30+ archivos nuevos sin trackear (templates de comuna, archivos de equipamiento, schema files). Recomendación: revisar diffs, commitear lo verificado-live, y agregar a .gitignore los seo-audit-*.html/.md antes de que el repo se llene de informes.


Plan de acción ordenado por leverage

Sprint 1 — 1–2 días (quick wins, alta leverage)

  1. C2 — Cambiar "6 años" → "fundada en 2020" en /nosotros/. 15min.
  2. M1 — Agregar 4 bots a robots.txt. 10min.
  3. M5 — Agregar horarios visibles al footer. 15min.
  4. M11 — Agregar contactPoint al schema. 15min.
  5. L7 — Cambiar Rheem query a meta_query por SKU/category. 30min.
  6. H6 — Activar brotli HTML en LiteSpeed. 30min.
  7. C6 — Wrappear hero homepage en <picture>. 1h.

Score estimado tras Sprint 1: ~71.

Sprint 2 — 3–5 días (performance + schema)

  1. H1defer en jQuery + test WC. 2h.
  2. H2 — Font Awesome async load. 1h.
  3. C4 — Patch shippingDetails + returnPolicy en Product. 2h.
  4. C5 — Consolidar JSON-LD a un solo nodo. 2h.
  5. H3 — GBP URL + hasMap + LinkedIn/YouTube en sameAs (asume tener URLs reales). 1h.
  6. H5 — Speakable en home + bombas. 30min.
  7. M2 — Limpiar CSP (remover openreplay/contentsquare si confirmado fuera). 30min.

Score estimado tras Sprint 2: ~78.

Sprint 3 — 1–2 semanas (contenido + legales)

  1. C1 — Crear /politica-de-privacidad/, /terminos-y-condiciones/, resolver /contacto/. Limpiar page-sitemap. Agregar las 6 URLs faltantes. 1 día.
  2. C3 — Disclosures Sernac/CAE en /financiamiento-salvum/. 4h + revisión legal.
  3. H4 — Publicar 5 páginas comunales (Maipú, Puente Alto, Las Condes, San Bernardo, La Florida). 1 día. Contenido único 60%+.
  4. H7+H8 — Reescribir /nosotros/ (target 600w) y /jacuzzi/ (target 900w). 1 día.
  5. M7 — Importar 5-10 reviews GBP via admin tool → activa aggregateRating. 2h.

Score estimado tras Sprint 3: ~84.

Sprint 4 — Backlog (impacto AI/long-tail)

  1. M8 — Crear /piscina-fibra-vs-hormigon/ con tabla comparativa.
  2. M10 — Reescribir FAQs piscinas con specifics first-person.
  3. M14 — Conseguir + publicar SEC license number contratista.
  4. L3 — Convertir Slide-piscina-*.png a WebP.
  5. M9 — Configurar IndexNow (Rank Math Pro o key manual + registro).

Limitaciones del audit

Para una próxima vuelta del audit, recomiendo cargar las credenciales Google API (PageSpeed/CrUX/GSC/GA4) y opcionalmente DataForSEO — desbloquea ~3 dimensiones que hoy son proxies.


Auditoría generada por Claude Code SEO skill v1 con 7 subagentes paralelos (technical, content, schema, sitemap, performance, geo, local). Sin DataForSEO ni Google API en este run.