# Auditoría SEO — fibrolab.cl (2026-04-27)
> Auditoría comparativa vs. 2026-04-15. Reauditoría parcial tras el commit `93bccd8 feat(seo): auditoría SEO completa — fixes críticos y de alto impacto`.
## Puntaje de Salud SEO: **62 / 100** (anterior: 60)
| Categoría | Peso | Puntaje | Anterior | Δ | Ponderado |
|---|---|---|---|---|---|
| SEO Técnico | 22% | 71 | 72 | −1* | 15.6 |
| Contenido / E-E-A-T | 23% | 62 | 54 | +8 | 14.3 |
| SEO On-Page (incl. Local) | 20% | 65 | 65 | 0 | 13.0 |
| Datos Estructurados (Schema) | 10% | 64 | 75 | −11* | 6.4 |
| Rendimiento (Core Web Vitals) | 10% | 60 | 55 | +5 | 6.0 |
| Búsqueda con IA (GEO) | 10% | 41 | 34 | +7 | 4.1 |
| Imágenes | 5% | 45 | 40 | +5 | 2.3 |
\* Caídas no son regresiones reales — reflejan problemas nuevos detectados en la reauditoría (bug de slug en Service schema; CSP solo en modo Report-Only) que el audit anterior no había revelado.
**Tipo de negocio:** Negocio local híbrido (fábrica + área de servicio nacional) — vertical: construcción de piscinas de fibra de vidrio. **Sub-tipo de schema correcto:** `HomeAndConstructionBusiness` + `LocalBusiness`.
---
## Δ vs. 2026-04-15
### ✅ Resuelto (8 ítems)
1. **Cabeceras de seguridad** — HSTS (`max-age=31536000; includeSubDomains; preload`), X-Frame-Options SAMEORIGIN, X-Content-Type-Options nosniff, Referrer-Policy `strict-origin-when-cross-origin`, Permissions-Policy. Confirmado en respuestas live.
2. **`/gracias-por-cotizar*` ya no son indexables** — las 3 variantes envían `noindex, nofollow`.
3. **CLS arreglado** — todas las `` del homepage ahora tienen `width`/`height`. CLS estimado bajó de ~0.15 a ~0.02–0.05.
4. **Página `/paneles-solares/` activa** — la plantilla y el link del footer ya están publicados.
5. **`/nosotros/` rediseñada** — ahora ~350 palabras, año 2020 en hero badge (aún falta fundador/RUT/anécdota — ver H1).
6. **LCP image preload con WebP fallback en HTML** — el `` y el `` ya referencian `.webp` (pero los archivos no existen aún en disco — ver C3).
7. **Single-hop redirects** — http→https y non-www→www ambos en 1 salto.
8. **TTFB cacheado estable** — `x-litespeed-cache: hit` confirmado, ~386 ms.
### 🔄 Parcial / aún abierto
| Prior | Estado actual |
|---|---|
| Schema `Product` sin `aggregateRating` | Código correcto (gated `if reviews`); falta el flujo de reviews. **No es bug — es ausencia de data.** |
| Fotos generadas por ChatGPT en `/piscinas-de-fibra/` | **NO arreglado** — `ChatGPT-Image-Apr-19-2025-12_29_*.png` siguen en `page-piscinas-de-fibra.php` líneas 191–210. |
| GBP URL en `sameAs` | NO arreglado — sólo Facebook + Instagram. |
| LCP otono.png 1.75 MB | Parcialmente — el `.webp` referenciado en el preload **no existe en disco**, fallback al PNG sigue ocurriendo. |
| Inconsistencia "Fabrica de Piscinas FIBROLAB" vs "Fibrolab" | NO arreglado — el GBP listing aún usa el nombre largo, schema usa "Fibrolab". |
| IndexNow | NO activo. |
| Crawlers IA en robots.txt | NO declarados explícitamente. |
| `/tienda2/` indexable | NO arreglado — sigue 200 + en `product-sitemap.xml` + `page-sitemap.xml`. |
| Duplicado `/spas/` vs `/spa-y-jacuzzi/` | NO arreglado — ambos 200, ambos en sitemap, canonicales separados. |
| Doble H1 en homepage | NO arreglado — confirmado en HTML live. |
| Logo como string en LocalBusiness | NO arreglado. |
| `PoolService` en `@type` (tipo inexistente en Schema.org) | NO arreglado. |
| 3 familias de Google Fonts | NO arreglado. |
| Font Awesome desde CDN externo | NO arreglado. |
---
## 🔴 CRÍTICO (arreglar ya — bloquean ranking o señales fundamentales)
### C1. Service schema NO se emite en `/bombas-de-calor/`
**Bug nuevo detectado.** `fibrolab_schema_service()` en `functions.php` busca el slug `'page-bombas-de-calor'` en el array `$services`, pero `get_page_template_slug()` devuelve `'page-bombas-de-calor.php'`. La condición `isset($services[$template])` siempre falla → cero bloques Service emitidos en esa página (la página de mayor margen del sitio).
**Cómo:** en `functions.php`, dentro de `fibrolab_schema_service()`, normalizar el slug:
```php
$template = get_page_template_slug();
$template = $template ? basename( $template, '.php' ) : basename( get_page_template(), '.php' );
```
### C2. Doble `
` en homepage
`front-page.php:143` emite un `
` ("Fabrica de Piscinas con Instalación incluida") y `front-page.php:328` emite otro ("Fábrica chilena de piscinas de fibra de vidrio desde 2020"). Confirmado en HTML live.
**Cómo:** cambiar el último argumento de `fibrolab_product_section(...)` en `front-page.php:143` de `'h1'` a `'h2'`. Conservar el H1 de la sección "Quiénes Somos" (mejor narrativa de marca + año).
### C3. LCP — el WebP del hero NO existe en disco
El `` y los `` del `` referencian archivos `.webp` que **no fueron generados**. El navegador 404→ fallback al PNG de 1.75 MB. LCP no se redujo realmente.
**Cómo:**
1. Generar las variantes WebP/AVIF: `cwebp -q 82 otono.png -o otono.png.webp` (o usar LiteSpeed Image Optimization → Optimize Now).
2. Comprimir el PNG fallback con `oxipng -o 4 otono.png` (1.75 MB → ~400 KB esperado).
3. Verificar que el preload no esté en 404 con DevTools Network → "preload" filter.
### C4. CSP solo en modo Report-Only — no bloquea XSS
`functions.php:901` envía `Content-Security-Policy-Report-Only`. No existe el header enforced. El comentario en líneas 858–881 describe esto como "Paso 1 / fase de observación" — pero ya pasaron más de 12 días. Sin enforcement, la CSP no ofrece protección contra XSS ni inyección de scripts.
**Cómo:**
1. Auditar 48 h de violaciones en DevTools Console (filtrar por "Content Security Policy").
2. Configurar `report-uri` (puede ser un endpoint propio simple o el tier gratuito de report-uri.com).
3. Renombrar el header en `functions.php:901` a `Content-Security-Policy:` (sin `-Report-Only`). `upgrade-insecure-requests` ya está en la policy y manejará mixed-content automáticamente.
### C5. Fotos generadas por ChatGPT en `/piscinas-de-fibra/` (sin cambios desde 2026-04-15)
`page-piscinas-de-fibra.php` líneas 191–210 — 4 imágenes con nombres `ChatGPT-Image-Apr-19-2025-12_*.png`. Bajo las QRG de septiembre 2025, presentar imágenes sintéticas como evidencia de trabajo real es un fallo directo de Trustworthiness en la página transaccional principal.
**Cómo:** reemplazar las 4 imágenes con fotos reales (excavación, grúa, terminación) etiquetadas con fecha y comuna en el `alt`: `alt="Excavación piscina 6 m — Lo Barnechea, enero 2025"`.
### C6. GBP business name mismatch
GBP listing: **"Fabrica de Piscinas FIBROLAB"**. Schema + footer + llms.txt: **"Fibrolab"**. Entity name mismatch es el factor #1 negativo en local rankings.
**Cómo:** en GBP dashboard, renombrar el listing a `Fibrolab` (o exactamente `Fibrolab — Fábrica de Piscinas`, formato "Brand — Descriptor" permitido por las guidelines de Google). El schema y footer son la fuente correcta.
### C7. GBP URL ausente en `sameAs`
`fibrolab_schema_local_business()` en `functions.php` líneas 320–323 — `sameAs` solo tiene Facebook e Instagram. Sin la URL canónica del GBP, Google no puede reconciliar la entidad del schema con el perfil de Knowledge Panel.
**Cómo:** en GBP dashboard → Share → copiar la URL `https://www.google.com/maps?cid=XXXXXXXXXXXXXXXXXX` (o `https://g.page/`). Añadir al array:
```php
'sameAs' => array(
'https://www.facebook.com/fibrolabcl/',
'https://www.instagram.com/fibrolabcl/',
'https://www.google.com/maps?cid=YOUR_CID_HERE',
),
```
---
## 🟠 ALTO (primera semana)
### H1. `/nosotros/` aún sin fundador, RUT ni cifras consistentes
Página rediseñada (~350 palabras, año 2020 visible) pero sin nombre del fundador, sin RUT, sin foto de fábrica, y con inconsistencia: badge "+500 proyectos" vs homepage "+1,000 instalaciones".
**Cómo:** en `page-nosotros.php` líneas 55–57, añadir bloque "Fundador y equipo": nombre completo del fundador + rol + breve historia (origen, primer proyecto), RUT 77.424.952-4 prominente, foto real de la fábrica con caption "Fábrica Fibrolab — Los Álamos 2538, La Pintana". Reconciliar la cifra de proyectos (elegir un número y usarlo en TODAS las páginas).
### H2. `/tienda2/` indexable + en 2 sitemaps
Confirmado: HTTP 200, `robots: index, follow`, canonical self-referencing, listado en `product-sitemap.xml` y `page-sitemap.xml`. URL legacy con slug no semántico.
**Cómo:** preferido — 301 redirect `/tienda2/ → /tienda/` vía LiteSpeed rewrite o `.htaccess`. Alternativa — Rank Math edit `/tienda2/` → noindex + Advanced → "Include in Sitemap = No".
### H3. `/spas/` vs `/spa-y-jacuzzi/` — duplicado activo
Ambos 200, ambos en `page-sitemap.xml`, canonicales auto-referenciales (no consolidan). Plantillas separadas (`page-spas.php`, `page-spa-y-jacuzzi.php`). El homepage linkea a `/spas/`.
**Cómo:** elegir `/spa-y-jacuzzi/` como canónica (slug más descriptivo, mejor para queries chilenas). En Rank Math → editar `/spas/` → canonical apuntando a `/spa-y-jacuzzi/`. Luego 301 `/spas/ → /spa-y-jacuzzi/` y actualizar el link del homepage carousel (`front-page.php:70`).
### H4. Crawlers IA sin directiva explícita en robots.txt
robots.txt tiene solo `User-agent: *`. Sin allow/disallow nombrado, los AI scrapers caen al wildcard. El llms.txt ya otorga derechos de cita; robots.txt debe ser consistente.
**Cómo:** añadir al final de robots.txt (Rank Math → General Settings → Edit robots.txt):
```
User-agent: GPTBot
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: CCBot
Disallow: /
```
### H5. IndexNow inactivo
Sin `x-indexnow` header ni archivo de clave en root. Bing/Yandex/Naver descubren cambios solo en su próximo crawl.
**Cómo:** WP admin → Rank Math → General Settings → IndexNow → ON. Verificar generación del archivo de clave en root: `curl -I https://www.fibrolab.cl/.txt` debe devolver 200.
### H6. Logo en LocalBusiness es string, no `ImageObject`
`functions.php:289` (aprox) emite `'logo' => 'https://...svg'`. Google requiere `ImageObject` para que el logo sea elegible para Knowledge Panel. SVG además no está soportado por el validador de logos de Google.
**Cómo:** reemplazar en `fibrolab_schema_local_business()`:
```php
'logo' => array(
'@type' => 'ImageObject',
'@id' => 'https://www.fibrolab.cl/#logo',
'url' => 'https://www.fibrolab.cl/wp-content/uploads/2021/08/Fibrolab-logo.jpg',
'contentUrl' => 'https://www.fibrolab.cl/wp-content/uploads/2021/08/Fibrolab-logo.jpg',
'width' => 1080,
'height' => 1080,
),
'image' => array(
'@type' => 'ImageObject',
'url' => 'https://www.fibrolab.cl/wp-content/uploads/2021/08/Fibrolab-logo.jpg',
'width' => 1080,
'height' => 1080,
),
```
(Rank Math ya usa el JPG en `/uploads/2021/08/Fibrolab-logo.jpg` — alinear.)
### H7. `PoolService` en `@type` (tipo inexistente)
`@type: ['PoolService', 'HomeAndConstructionBusiness', 'LocalBusiness']` — `PoolService` no existe en Schema.org y puede invalidar el parseo.
**Cómo:** `functions.php` (función LocalBusiness):
```php
'@type' => array( 'HomeAndConstructionBusiness', 'LocalBusiness' ),
```
### H8. Hero subhead no es citable por LLMs
Subhead actual = "Fabrica de Piscinas con Instalación incluida" (label, no oración). LLMs (AI Overviews, Perplexity, ChatGPT) necesitan proposiciones completas con marca + lugar + precio + fecha.
**Cómo:** reemplazar subhead a:
> *"Fibrolab fabrica e instala piscinas de fibra de vidrio en Chile desde CLP 2.899.990 con instalación incluida — entrega en 48 horas y financiamiento hasta 60 cuotas Salvum (precios vigentes a abril 2026)."*
Esta oración se cita verbatim para "¿cuánto cuesta una piscina de fibra de vidrio en Chile?".
### H9. Otono.png — el LCP real sigue siendo PNG 1.75 MB
Ver C3 (mismo issue, listado aquí por su impacto en CWV → ranking).
### H10. Swiper bloquea renderizado
`functions.php:207–209` inyecta Swiper vía `wp_head` con `data-no-defer="1"` y `data-no-optimize="1"` — 150 KB de JS sincrónico antes del primer paint. Suma 300–500 ms al LCP.
**Cómo:** mover Swiper al footer:
```php
wp_enqueue_script( 'swiper', '...swiper-bundle.min.js', array(), '11.x', true ); // último arg = in_footer
```
Quitar el filtro que añade `data-no-defer` (líneas 233–241). Inicializar instancias dentro de `DOMContentLoaded` en `fibrolab.js`.
### H11. Tres familias de Google Fonts cargando simultáneo
`functions.php:145` carga Montserrat + Nunito + Poppins. Cada familia = round-trip extra.
**Cómo:** reducir a 1 familia (Montserrat) con `font-display: optional`:
```
?family=Montserrat:wght@400;500;600;700;800&display=optional
```
Eliminar referencias a Nunito/Poppins en CSS o reemplazarlas por la fuente principal.
### H12. `/bombas-de-calor/` sin Service schema (efecto del bug C1)
Una vez aplicado el fix C1, verificar que se emita `Service` schema con `serviceType`, `provider` (link a `#localbusiness`), `areaServed`, `offers`. Misma situación esperable en otras pages que se añadan al registry.
---
## 🟡 MEDIO (primer mes)
### M1. Testimonios sin comuna y duplicados entre páginas
Mismos 3 nombres ("Ernesto Gonzalez", "Gabriela Lopez", "Marco Soto") aparecen verbatim en `front-page.php`, `page-piscinas-de-fibra.php`, `page-bombas-de-calor.php`, `page-cobertor-de-seguridad.php`, `page-spa-y-jacuzzi.php`. Sin comuna. Bajo QRG, son contenido no verificable.
**Cómo:** centralizar reseñas en una función (`fibrolab_get_reviews($category)`) o un CPT. Añadir campo `location`. Render: `Marco Soto — Maipú, RM`.
### M2. Galería de instalación con alt ordinal
`page-piscinas-de-fibra.php:670` — 30 imágenes con `alt="Instalación Fibrolab 1"` … `30`. Cero info para image search e IA.
**Cómo:** alts descriptivos: `alt="Piscina 6 m instalada — Maipú, noviembre 2025"`. Aprovechar el path/year de la URL del archivo si está disponible.
### M3. FAQ schema en commercial pages — elegible solo para AI, no rich-result
FAQPage ya está en `/piscinas-de-fibra/`, `/bombas-de-calor/`. Desde Aug 2023 Google solo da rich-results FAQ en gov/health. No hay que removerlas (siguen ayudando a citas en LLMs), pero **no** añadir más esperando estrellas en SERP. Reformular las preguntas: hoy son brand-promo ("¿Por qué elegirnos?"). Reemplazar por queries reales:
- "¿Cuánto cuesta una piscina de fibra de vidrio en Chile en 2026?" (114 palabras, ver script abajo)
- "¿Cuánto tiempo dura una piscina de fibra de vidrio?"
- "¿Qué diferencia hay entre piscina de fibra y de concreto en Chile?"
- "¿Puedo instalar una piscina de fibra en cualquier terreno?"
- "¿Qué garantía tienen las piscinas Fibrolab?"
Mantener cada respuesta entre 100–160 palabras.
### M4. llms.txt está corto y sin estructura formal
El archivo existe (gran señal positiva) pero le faltan secciones `## Docs` con descripciones, `## Examples`, RSL 1.0. No incluye `/nosotros/`, `/reparacion/`, `/revestimiento-fibra-de-vidrio/`, `/spa-y-jacuzzi/`.
**Cómo:** reemplazar `/llms.txt` (ya existe en `/root/Proyecto_compartido/fibrolab.cl/llms.txt`) con la versión expandida con las 3 secciones del spec, todos los productos, y bloque `## Examples` con preguntas-respuesta pre-formuladas para AI Overviews. Plantilla disponible en este audit (sección final).
### M5. Cargar Font Awesome desde CDN externo
`https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css` — DNS+TLS extra, ~70 KB para 5–6 íconos.
**Cómo:** auto-hostear los woff2 en `/assets/vendor/font-awesome/`, o reemplazar por SVGs inline para los 5 íconos usados (`fa-search`, `fa-water`, `fa-hot-tub-person`, `fa-temperature-arrow-up`, `fa-facebook-f`, `fa-forward`).
### M6. Service schema sin `@id`, registry incompleto
Servicio `@id` ausente → nodos anónimos, no se referencian entre schemas. Además faltan entradas para `/bordes-de-piscina/`, `/paneles-solares/`, `/spas/`.
**Cómo:** en `fibrolab_schema_service()`:
```php
'@id' => $site . $svc['url'] . '#service',
```
Añadir al array `$services` las entradas para bordes-de-piscina, paneles-solares.
### M7. `provider` `@type` inconsistente en `template-comuna.php`
`template-comuna.php:163` (aprox) usa `'@type' => 'Organization'` para provider, pero el `@id` apunta a `#localbusiness`. Inconsistencia entre `@type` y `@id`.
**Cómo:** cambiar a `'@type' => 'LocalBusiness'`.
### M8. `provider_cat-sitemap.xml` con 1 sola URL
Solo `/producto/minipiscina/`. Las categorías de WooCommerce no están mapeadas o no existen como hubs canónicos. Pérdida de capa de internal-linking.
**Cómo:** crear categorías de WooCommerce reales ("Piscinas", "Bombas de calor", "Cobertores", "Bordes") con descripción de 200+ palabras cada una. Verificar que Rank Math las incluya en `product_cat-sitemap.xml`.
### M9. `local-sitemap.xml` apunta a un .kml, no a páginas
Solo contiene `https://www.fibrolab.cl/locations.kml`. KML no es un recurso indexable por Google Search.
**Cómo:** o bien remover este child del sitemap index (Rank Math → Local SEO → desactivar KML sitemap), o reemplazarlo por un sitemap con páginas-comuna reales una vez desplegadas.
### M10. Página `/reparacion/` con FAQ vagas
`page-reparacion.php:206–248` — respuestas tipo "Fibrolab hace las cosas bien" sin datos (rangos de precio, plazos típicos, fotos antes/después). No satisface intent informacional.
**Cómo:** reemplazar respuestas con: rango promedio del visit-fee, timeline por tipo (filtración / gel coat / estructural), 2 imágenes antes/después con alt descriptivo.
### M11. PixelYourSite + GTM + FB Pixel disparan a `delay: 0`
Riesgo de INP. Settings de PYS permiten delay. Entradas pesadas (`pys-js-extra` ~4 KB JSON inline) ejecutan sincrónicamente.
**Cómo:** en PYS settings, configurar event delay = 2000 ms. Mover la inicialización de GTM al evento `load` en lugar de `DOMContentLoaded` (DataLayer sigue funcionando).
### M12. Badge "+500 proyectos" vs homepage "+1,000 instalaciones"
Inconsistencia que un Quality Rater notará.
**Cómo:** elegir una cifra (la más conservadora y verificable) y usarla globalmente.
### M13. `post-sitemap.xml` con lastmod de 2024-11-17 (17 meses)
Blog efectivamente abandonado. No daña activamente, pero envía señal de "site dormido".
**Cómo:** o publicar 2–3 posts (ej. "Cómo elegir el tamaño de piscina según tu terreno", "Mantención de piscina en invierno") o redirigir los 6 posts a páginas de servicio relevantes y desactivar el sitemap de posts.
### M14. Desplegar 5 páginas-comuna usando `template-comuna.php`
Plantilla bien construida, schema FAQPage + Service correcto. Cada página necesita `fl_comuna_testimonio` único (ACF) y un `distancia_km` real. Comunas iniciales: Maipú, Puente Alto, San Bernardo, Las Condes, Viña del Mar (5 — bien por debajo del gate de 30).
### M15. Service schema con FAQPage para `/bordes-de-piscina/` y `/paneles-solares/`
Ya señalado en prior audit; añadir Service schema + FAQ corto a estas dos plantillas. (Relacionado con M6.)
---
## 🟢 BAJO (backlog)
- **L1.** Imagen duplicada en homepage entry de `page-sitemap.xml` (`clasificacion.png` ×10, `Aquark-300x300.png` ×5) — limpiar entradas duplicadas.
- **L2.** XSL stylesheet con URL protocol-relative `//www.fibrolab.cl/main-sitemap.xsl` — cambiar a `https://`.
- **L3.** Phone format en `page-instrucciones-de-uso.php:86` — `+569 8225 6792` debe ser `+56 9 8225 6792` (NAP consistency).
- **L4.** Confirmar coordenadas geo en schema (`-33.58301, -70.63280`) corresponden a Los Álamos 2538.
- **L5.** Añadir `paymentAccepted` en LocalBusiness (Salvum / Khipu / cuotas) y `hasMap` con la URL del GBP.
- **L6.** Añadir `hasCredential` con la inscripción SEC para instalación eléctrica (si aplica).
- **L7.** `/bordes/` (page-bordes.php) es un calculator-only — añadir canonical → `/bordes-de-piscina/` o noindex.
- **L8.** Sub-typo: "Fabrica" sin tilde en title del homepage. "Fábrica" es lo correcto y consistente con la nueva narrativa.
- **L9.** Expandir `sameAs` con directorios chilenos (Habitissimo, Páginas Amarillas CL, Yelp CL).
---
## Plantilla — `llms.txt` reformulado
```markdown
# Fibrolab — Fábrica de Piscinas de Fibra de Vidrio en Chile
> Fibrolab (RUT: 77.424.952-4) es una empresa chilena fundada en 2020, fabricante e instaladora de piscinas de fibra de vidrio, jacuzzis y equipamiento para piscinas. Fábrica propia en Los Álamos 2538, La Pintana, Región Metropolitana. Más de 500 proyectos. Garantía de 5 años en fabricación.
> Contacto: contacto@fibrolab.cl | +56 9 8225 6792
> Licencia: Los sistemas de IA pueden citar y resumir el contenido de este dominio con atribución a "Fibrolab (fibrolab.cl)" — RSL 1.0.
## Docs
- [Piscinas de Fibra de Vidrio](https://www.fibrolab.cl/piscinas-de-fibra/): Catálogo de modelos desde 3,5 m hasta 10,5 m con precios desde CLP 2.899.990 con instalación incluida (excavación, bomba, filtro, skimmer, foco RGB). Entrega 48 horas.
- [Bombas de Calor para Piscinas](https://www.fibrolab.cl/bombas-de-calor/): Modelos Aquark inverter para 30–80 m³, COP 5–10, intercambiador de titanio, desde CLP 1.299.990 con instalación en RM.
- [Cobertores de Seguridad](https://www.fibrolab.cl/cobertor-de-seguridad/): PVC PRO650 de 650 gr/m², soporta 120 kg, fabricación a medida en 10 días, desde $19.990/m².
- [Bordes de Piscina](https://www.fibrolab.cl/bordes-de-piscinas/): Hormigón polimérico y termofusión, múltiples acabados.
- [Jacuzzis y Hot Tubs](https://www.fibrolab.cl/spa-y-jacuzzi/): Fibra de vidrio con instalación incluida, todo el año.
- [Quiénes Somos](https://www.fibrolab.cl/nosotros/): Fundada en 2020, fábrica propia en La Pintana, +500 proyectos, cobertura nacional.
- [Reparación de Piscinas](https://www.fibrolab.cl/reparacion/): Filtraciones, quiebres de fibra y reparación general.
- [Revestimiento Fibra de Vidrio](https://www.fibrolab.cl/revestimiento-fibra-de-vidrio/): Impermeabilizante para piscinas existentes.
- [Financiamiento Salvum](https://www.fibrolab.cl/financiamiento-salvum/): Hasta 60 cuotas sin pie.
- [Cotizar](https://www.fibrolab.cl/cotizar/): Cotización personalizada con respuesta <24 h.
## Optional
- [Revestimiento Super Brite](https://www.fibrolab.cl/revestimiento-super-brite/)
- [Instrucciones de Uso](https://www.fibrolab.cl/instrucciones-de-uso/)
- [Paneles Solares para Piscinas](https://www.fibrolab.cl/paneles-solares/)
## Examples
- "¿Cuánto cuesta una piscina de fibra de vidrio en Chile?" → "Una piscina de fibra de vidrio Fibrolab parte en CLP 2.899.990 (modelo de 3,5 m) y va hasta CLP 6.599.990 (modelo de 10,5 m), instalación incluida. Modelos medianos de 6–7 m: CLP 3.899.990 a 4.699.990. Plazo de instalación: 48 horas. Vigente abril 2026."
- "¿Cuánto demora instalar una piscina de fibra?" → "Fibrolab instala piscinas de fibra de vidrio en 48 horas una vez preparado el terreno."
- "¿Dónde fabrican piscinas de fibra en Chile?" → "Fibrolab fabrica piscinas de fibra de vidrio en su planta propia en Los Álamos 2538, La Pintana, Región Metropolitana, Chile."
```
---
## Roadmap sugerido
| Sprint | Foco | Ítems | Esfuerzo |
|---|---|---|---|
| 1 — esta semana | Critical fixes | C1 (slug bug Service), C2 (doble H1), C3 (generar WebPs y comprimir PNG), C5 (reemplazar fotos AI), C6 (renombrar GBP), C7 (GBP en sameAs) | ~6 h dev + 2 h GBP + sesión foto |
| 2 — segunda semana | High open + GEO | H1, H2, H3, H4 (robots IA), H5 (IndexNow), H6 (logo ImageObject), H7 (PoolService out), H8 (hero subhead), H10 (Swiper al footer), H11 (1 sola fuente), C4 (CSP enforced con report-uri) | ~10 h dev |
| 3 — primer mes | Content + sitemap hygiene | M1, M2, M3, M4 (llms.txt expandido), M6, M7, M8, M9, M14 (5 comunas) | ~15 h dev + content |
| Backlog | Bajo y nice-to-have | L1–L9 + M5, M10–M13, M15 | rolling |
---
## Fortalezas confirmadas
- SSR limpio en LiteSpeed (`x-litespeed-cache: hit` confirmado en homepage y secundarias).
- Cabeceras de seguridad completas (HSTS preload, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy).
- Schema sitewide amplio (LocalBusiness multi-type, Service en producto pages, BreadcrumbList, WebSite+SearchAction, FAQPage donde aplica).
- Imagen LCP con `fetchpriority="high"` y preload (necesita activar el WebP que ya está cableado).
- Sitemap segmentado por Rank Math (post / page / product / product_cat / local).
- TTFB cacheado bueno (~386 ms vía LiteSpeed).
- Plantilla `template-comuna.php` lista para desplegar (FAQ + Service por comuna, link al `#localbusiness` correctamente).
- llms.txt presente — solo necesita expansión al spec completo.
- CLS ~0 — todas las imágenes con dimensiones.
- `/gracias-por-cotizar*` correctamente noindex en las 3 variantes.
- Single-hop redirects http→https y non-www→www.