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 yfont-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 |
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):
"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.
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 CSPscript-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
dateModifiedni 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_Querycons => 'Rheem'puede retornar 0 silenciosamente. - L8.
priceRange: "$$"genérico — reemplazar por "CLP 1.299.990 – 6.599.990". - L9.
currenciesAccepted: CLPypaymentAcceptedno declarados en schema. - L10. Duplicate
dns-prefetchpara cdnjs.cloudflare.com (theme + WP head). - L11.
locations.kmlen 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 <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
/piscinas-de-fibra/hero ahora es<picture><source type="image/webp"><img>conloading="eager" fetchpriority="high"+width/height. Resuelve el issue v4 más doloroso de LCP.- CSS bundle brotli en wire (73KB vs 271KB uncompressed). Sigue sync pero el peso wire baja ~73%.
- GTM + speculationrules + LiteSpeed cache todos confirmados estables.
- HTTP/3 (alt-svc h3=":443") advertido correctamente.
x-litespeed-cache: hitconfirmado en home + piscinas (cache funcional).- /contacto/ devuelve 200 según seo-local — pero
page-sitemap.xmlaú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)
- C2 — Cambiar "6 años" → "fundada en 2020" en
/nosotros/. 15min. - M1 — Agregar 4 bots a robots.txt. 10min.
- M5 — Agregar horarios visibles al footer. 15min.
- M11 — Agregar
contactPointal schema. 15min. - L7 — Cambiar Rheem query a
meta_querypor SKU/category. 30min. - H6 — Activar brotli HTML en LiteSpeed. 30min.
- C6 — Wrappear hero homepage en
<picture>. 1h.
Score estimado tras Sprint 1: ~71.
Sprint 2 — 3–5 días (performance + schema)
- H1 —
deferen jQuery + test WC. 2h. - H2 — Font Awesome async load. 1h.
- C4 — Patch shippingDetails + returnPolicy en Product. 2h.
- C5 — Consolidar JSON-LD a un solo nodo. 2h.
- H3 — GBP URL + hasMap + LinkedIn/YouTube en sameAs (asume tener URLs reales). 1h.
- H5 — Speakable en home + bombas. 30min.
- M2 — Limpiar CSP (remover openreplay/contentsquare si confirmado fuera). 30min.
Score estimado tras Sprint 2: ~78.
Sprint 3 — 1–2 semanas (contenido + legales)
- C1 — Crear
/politica-de-privacidad/,/terminos-y-condiciones/, resolver/contacto/. Limpiar page-sitemap. Agregar las 6 URLs faltantes. 1 día. - C3 — Disclosures Sernac/CAE en
/financiamiento-salvum/. 4h + revisión legal. - H4 — Publicar 5 páginas comunales (Maipú, Puente Alto, Las Condes, San Bernardo, La Florida). 1 día. Contenido único 60%+.
- H7+H8 — Reescribir
/nosotros/(target 600w) y/jacuzzi/(target 900w). 1 día. - 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)
- M8 — Crear
/piscina-fibra-vs-hormigon/con tabla comparativa. - M10 — Reescribir FAQs piscinas con specifics first-person.
- M14 — Conseguir + publicar SEC license number contratista.
- L3 — Convertir Slide-piscina-*.png a WebP.
- 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.