# 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 `` 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 `` + 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** | --- ## Issues CRÍTICOS — bloquean indexación, riesgo legal o Merchant Center ### 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): ```json "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 ` ``` Sin `defer`, sin `async`. Bloquea parsing en cada page load. **Impacto LCP estimado: +200–400ms**. **Fix (functions.php):** ```php add_filter('script_loader_tag', function($tag, $handle) { if ($handle === 'jquery-core' && !is_admin()) { $tag = str_replace(' ``` Cross-origin stylesheet bloqueando render. ~102KB uncompressed. **Fix opción A** (rápida, async load): ```html ``` **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:** ```json "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:** ```json "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. ### M4. **No Privacy Policy / Términos enlazados desde footer** 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. ### M5. **Sin business hours visibles en footer** 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 - L1. `'unsafe-eval'` en CSP `script-src` — auditar si algún plugin realmente lo necesita; removerlo endurece la policy. - L2. Salvum logo PNG repetido 14× sin `loading="lazy"` en home. - L3. Slide carousel images (Slide-piscina-*.png) siguen PNG, no WebP. - L4. `priceValidUntil: "2026-12-31"` expira en ~7 meses — actualizar antes de enero 2027. - L5. llms.txt sin `dateModified` ni declaración de licencia RSL 1.0. - L6. Gallery alt texts secuenciales ("Instalación Fibrolab 1, 2, 3..."). Agregar comuna/tamaño. - L7. Rheem `WP_Query` con `s => 'Rheem'` puede retornar 0 silenciosamente. - L8. `priceRange: "$$"` genérico — reemplazar por "CLP 1.299.990 – 6.599.990". - L9. `currenciesAccepted: CLP` y `paymentAccepted` no declarados en schema. - L10. Duplicate `dns-prefetch` para cdnjs.cloudflare.com (theme + WP head). - L11. `locations.kml` en local-sitemap.xml — innecesario, no es página HTML. - L12. post-sitemap.xml lastmod 2024-11-17 (18 meses sin updates en blog). --- ## 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 `` 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 ``** 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 ``. 1h. **Score estimado tras Sprint 1:** ~71. ### Sprint 2 — 3–5 días (performance + schema) 8. **H1** — `defer` en jQuery + test WC. 2h. 9. **H2** — Font Awesome async load. 1h. 10. **C4** — Patch shippingDetails + returnPolicy en Product. 2h. 11. **C5** — Consolidar JSON-LD a un solo nodo. 2h. 12. **H3** — GBP URL + hasMap + LinkedIn/YouTube en sameAs (asume tener URLs reales). 1h. 13. **H5** — Speakable en home + bombas. 30min. 14. **M2** — Limpiar CSP (remover openreplay/contentsquare si confirmado fuera). 30min. **Score estimado tras Sprint 2:** ~78. ### Sprint 3 — 1–2 semanas (contenido + legales) 15. **C1** — Crear `/politica-de-privacidad/`, `/terminos-y-condiciones/`, resolver `/contacto/`. Limpiar page-sitemap. Agregar las 6 URLs faltantes. 1 día. 16. **C3** — Disclosures Sernac/CAE en `/financiamiento-salvum/`. 4h + revisión legal. 17. **H4** — Publicar 5 páginas comunales (Maipú, Puente Alto, Las Condes, San Bernardo, La Florida). 1 día. Contenido único 60%+. 18. **H7+H8** — Reescribir `/nosotros/` (target 600w) y `/jacuzzi/` (target 900w). 1 día. 19. **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) 20. **M8** — Crear `/piscina-fibra-vs-hormigon/` con tabla comparativa. 21. **M10** — Reescribir FAQs piscinas con specifics first-person. 22. **M14** — Conseguir + publicar SEC license number contratista. 23. **L3** — Convertir Slide-piscina-*.png a WebP. 24. **M9** — Configurar IndexNow (Rank Math Pro o key manual + registro). --- ## Limitaciones del audit - **Sin Google API credentials** → no field data (CrUX CWV reales, GSC indexation, GA4 organic traffic). El score Performance es lab-only. - **Sin DataForSEO MCP** → no SERP positions, no backlinks reales, no review velocity GBP, no geo-grid local pack ranking. - **Sin acceso GBP dashboard** → categorías GBP, photo count, posts recency, Q&A — no verificables. - **Yelp.cl, citaciones directorio** → no verificadas, fetch bloqueado. - **Citation audit completo** → requiere BrightLocal/Whitespark. - **Validación visual rich results** → requiere Google Rich Results Test manual. 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.*