Reporte de auditoría web — consultaen15.cl
Sitio auditado: https://www.consultaen15.cl/ — servicio de consejería psicológica online (Chile)
Fecha: 2026-05-27
Secciones evaluadas (URLs reales):
- Inicio:
https://www.consultaen15.cl/ - Qué es Consulta en 15:
https://www.consultaen15.cl/conoceme/ - Agenda tu hora:
https://www.consultaen15.cl/agendar-hora/ - Contacto:
https://www.consultaen15.cl/contacto-2/
Stack detectado: WordPress · tema Kadence 1.5.0 + Kadence Blocks 3.7.2 + Pagelayer Pro 2.1.0 (dos constructores) · SEO Rank Math · formularios WPForms Lite · reservas Simply Schedule Appointments (iframe) · pagos Flow/Webpay · Apache + HTTP/2 + TLS 1.3.
Método: descarga del HTML/CSS real de las 4 URLs con curl (User-Agent de navegador) y análisis de cabeceras. Lo que requiere render de JavaScript, lector de pantalla o test interactivo se marca explícitamente como «requiere verificación manual». No se ejecutó Lighthouse; los Core Web Vitals son estimaciones cualitativas marcadas como tales.
Nota metodológica: Las URLs literales
/que-es-consulta-en-15,/agenda-tu-horay/contactono son las páginas reales (devuelven 404 o duplican contenido). Las reales son/conoceme/,/agendar-hora/y/contacto-2/.
Resumen ejecutivo (transversal)
El sitio tiene una base salvable —contenido renderizado en servidor, paleta de marca con potencial, landmarks ARIA, formulario de contacto bien construido y datos estructurados vía Rank Math— pero arrastra problemas transversales que afectan a varias disciplinas a la vez y que conviene atacar primero porque cada uno desbloquea mejoras en múltiples áreas:
- Rendimiento del origen (CRÍTICO, transversal a Performance, UX y SEO). TTFB medido de 5,8–7,8 s en páginas internas, con HTTP 503 intermitentes y conexiones colgadas. Es el problema #1: degrada la conversión, impide cumplir Core Web Vitals y reduce el rastreo de Google.
- Dos constructores de páginas coexistiendo (Kadence Blocks + Pagelayer Pro) — fuente de deuda técnica que se manifiesta como inconsistencia visual (UI), CSS/JS duplicado (Performance) y dificultad de mantenimiento (Frontend).
- Jerarquía de encabezados rota (transversal a Accesibilidad y SEO): doble
<h1>en Inicio y cero encabezados en las otras 3 páginas (los títulos son<p>/<div>estilizados). - Propuesta de valor y confianza débiles (UX): el nombre «en 15» no coincide con el producto real (sesión de 45 min), el precio no aparece antes de reservar, y faltan señales de confianza esenciales para salud mental (confidencialidad, qué incluye, testimonios, política de privacidad).
- Contenido de demostración del tema indexable (SEO): ~11 páginas/posts de plantilla («hola-mundo», «4-modern-bathtubs», etc.) y páginas duplicadas (
/contactovs/contacto-2/,/agendavs/agendar-hora/).
1. Accesibilidad
Conformidad WCAG 2.2 AA: NO CONFORMA.
| Severidad | Nº de hallazgos |
|---|---|
| Crítico | 2 |
| Alto | 3 |
| Medio | 4 |
| Bajo | 2 |
🔴 Crítico
C-1. Tres de cuatro páginas no tienen ningún encabezado (<h1>–<h6>).
WCAG 1.3.1 (A), 2.4.6 (AA), 2.4.1 (A). En /conoceme/, /agendar-hora/ y /contacto-2/ el recuento de encabezados es 0. Ej.: en «Agenda tu hora» el título «RESERVA TU SESIÓN EN 3 SIMPLES PASOS» es un <p class="kt-adv-heading">. Rompe la navegación por encabezados de lectores de pantalla. Solución: convertir el título principal de cada página en un único <h1> y subtítulos en <h2>/<h3> (en Kadence Blocks, «Advanced Heading» → HTML Tag).
C-2. La portada tiene dos <h1> (««Tú decides el siguiente paso…»» y «¿Qué es la consejería en Psicología?»). WCAG 1.3.1 (A), 2.4.6 (AA). Solución: dejar un solo <h1> (el lema) y degradar el segundo a <h2>.
🟠 Alto
A-1. Texto amarillo #eab308 sobre fondo claro: contraste 1,92:1 (falla incluso el umbral de texto grande de 3:1). WCAG 1.4.3. Solución: oscurecer a un ámbar ≥4,5:1 (p. ej. #8a6d00) o usar el verde de marca #2a5d5d (7,44:1).
A-2. Texto dorado de marca #d4a353 sobre blanco: contraste 2,29:1 (ítem de menú activo y hover de enlaces). WCAG 1.4.3. Solución: reservar el dorado para elementos decorativos; para el ítem de menú activo usar verde #2a5d5d o un subrayado/borde.
A-3. Iframe de reservas (Simply Schedule Appointments): caja negra no auditable estáticamente. WCAG 2.1.1, 4.1.2, 1.3.1. El iframe sí tiene title="Reservar una hora" (correcto), pero todo el flujo de reserva (calendario, campos, errores) se carga vía JS. Requiere verificación manual con teclado y lector de pantalla por ser la función central; si no es accesible, ofrecer alternativa (teléfono/correo de reserva visible).
🟡 Medio
- M-1. Campo de formulario con etiqueta sin sentido:
<label>Nombre mensaje Electrónico</label>en/contacto-2/. WCAG 1.3.1, 2.4.6, 3.3.2. Corregir o eliminar (si es honeypot, ocultarlo correctamente). - M-2. Imágenes de contenido con
alt=""(en Inicio y/conoceme/). WCAG 1.1.1. Si la foto es el retrato del profesional o aporta información, añadiraltdescriptivo; si es decorativa,alt=""es correcto. - M-3. Campos obligatorios con
requiredpero sinaria-required="true"explícito. WCAG 3.3.2, 4.1.2. Confirmar con NVDA/VoiceOver que se anuncian como «requerido». - M-4. Falta leyenda global «Los campos marcados con * son obligatorios». WCAG 3.3.2.
🟢 Bajo
- B-1. Gris #888888 de la paleta global = 3,54:1 sobre blanco (falla para texto normal). No usarlo como texto de cuerpo.
- B-2. Foco de teclado e indicador visible: requiere verificación manual (recorrido con Tab, indicador visible, sin trampas de foco en el iframe ni en el menú móvil).
✅ Lo que está bien (preservar)
<html lang="es"> correcto · landmarks ARIA completos (banner/navigation/main/contentinfo) · enlace «Saltar al contenido» funcional · navegaciones etiquetadas · logo con alt correcto · formulario de contacto con <label for>, type="email", aria-errormessage y asterisco con aria-hidden="true".
2. SEO
WordPress + Rank Math, técnicamente funcional pero con fundamentos incompletos y contenido residual del tema que contamina la indexación. El sitio útil son solo 4 páginas, pero el sitemap incluye ~una decena de páginas demo de plantilla.
Alto impacto
1. Contenido de demostración del tema indexable y en el sitemap. El post-sitemap.xml lista 11 entradas de demo (/digital-experience/, /4-modern-bathtubs/, /comfy-stylish/, /hola-mundo/, etc.) más la categoría /category/design/. Verificado: /digital-experience/ carga con Lorem Ipsum y /hola-mundo/ es el post por defecto. Dilución de autoridad temática (E-E-A-T) y desperdicio de presupuesto de rastreo. Acción: eliminar permanentemente esos posts/páginas/categorías; dejar que devuelvan 404/410 (no redirigir a la home → eso crea soft-404).
2. Páginas duplicadas. /contacto (200, con formulario) coexiste con /contacto-2/; y /agenda/ coexiste con /agendar-hora/. Canibalización y señales divididas. Acción: una sola URL por intención + 301 de la descartada a la superviviente; canonical autorreferencial.
3. Sitio sin visibilidad de marca en Google. site:consultaen15.cl no devolvió resultados del dominio. Puede ser normal en un sitio nuevo, pero combinado con lo anterior sugiere indexación pobre. Acción: verificar en Google Search Console, enviar sitemap_index.xml, revisar Cobertura y solicitar indexación de las 4 URLs reales tras la limpieza. Confirmar que ninguna lleva noindex.
4. Estructura de encabezados incompleta (ver también §1). Cada página debe tener un único <h1> orientado a intención + jerarquía <h2>/<h3>. Ej.: /conoceme/ debería usar un H1 tipo «Qué es Consulta en 15: consejería psicológica online» en vez de solo el nombre del profesional.
Medio impacto
- 5. Schema.org subóptimo. Rank Math emite
ProfessionalService. Para un psicólogo con Registro Nacional de Prestadores de Salud convieneMedicalBusiness/Psychologist+Person(Marcelo Machuca) consameAsa LinkedIn,medicalSpecialty,areaServedy el N° de registro comoidentifier. Refuerza E-E-A-T en un nicho YMYL (salud). EvitarArticleen páginas que no son artículos. - 6. Imagen Open Graph vertical (
Home-scaled-1-266x1024.jpeg, 266×1024). Genera previsualizaciones recortadas. Acción: imagen OG horizontal 1200×630 +twitter:card=summary_large_image. - 7. Optimización de title/meta description hacia el rubro y geografía: incluir «consejería psicológica online Chile», «psicólogo online Chile». Confirmar unicidad y longitud (title 50–60, description 150–160).
- 8. Enlazado interno mínimo: solo menú/footer, sin enlaces contextuales. Añadir enlaces de cuerpo (p. ej.
/conoceme/→/agendar-hora/).
Bajo impacto
robots.txtcorrecto (WordPress estándar, declara el sitemap). · El iframe de reservas no se indexa como contenido propio: asegurar que el texto principal de/agendar-hora/sea HTML server-side. · Reconfirmar con HTML crudo: viewport,lang, canonical autorreferencial, ausencia denoindex,og:url.
Corrección sobre auditoría preliminar:
/que-es-consulta-en-15y/agenda-tu-horadevuelven 404 limpio (no soft-404). El problema real es la duplicación descrita en el punto 2.
3. UX (Experiencia de usuario)
El tono es empático y apropiado para salud mental, pero el sitio falla en los tres pilares que determinan conversión y confianza en un servicio de salud mental de pago.
🔴 Alta prioridad
1. El precio no aparece antes de reservar; el pago se difiere a un correo posterior. La config del widget tiene "payments":"" y las instrucciones dicen: «la reserva solo se hará efectiva tras confirmar el pago. Te haremos envío de un correo… donde encontrarás el botón de Flow (Webpay)». El usuario entrega datos sin saber cuánto pagará y debe salir del sitio a su correo para pagar. Probablemente el mayor punto de fuga. Acción: mostrar el precio antes del calendario e integrar el cobro dentro del widget (SSA lo admite).
2. Incoherencia de duración vs. el nombre «en 15». La meta description dice «15 a 30 min», el cuerpo «15 a 45 min», y el widget define una cita única de 45 min. Acción: unificar el mensaje y aclarar qué significa «15».
3. Faltan señales de confianza esenciales. Cero menciones de «confidencial», «privacidad», «reembolso» o «testimonio»; no existe página de privacidad ni términos. Únicas credenciales: N° de Registro Nacional de Prestadores 75555 y LinkedIn. Acción: añadir declaración de confidencialidad, «qué incluye tu sesión», política de cancelación/reembolso, 2–4 testimonios y página de privacidad enlazada en el footer (exigible además por normativa de datos chilena).
4. El formulario de agendamiento pide datos invasivos como obligatorios. Requeridos: Nombre, Email, Teléfono, Dirección y Ciudad — para una videollamada online no se justifica y resulta invasivo en salud mental. Acción: dejar obligatorios solo Nombre y Email (Teléfono opcional); habilitar «Notas» para el motivo de consulta.
🟠 Media prioridad
- 5. Contradicción «hoy mismo / de inmediato» vs.
min_booking_notice = 1440(24 h mínimas de antelación). Alinear el copy con la realidad operativa. - 6. El agendamiento vive en un iframe de terceros con alto fijo de 400px sobre un origen lento; si falla, el usuario ve un recuadro vacío sin mensaje. Añadir estado de carga / fallback con correo de contacto.
- 7. Jerarquía de CTAs débil: un único botón estilizado en Inicio, sin CTA persistente en el header; texto inconsistente («agenda tu hora» / «AGENDA AHORA»). Añadir botón sticky de «Agendar».
- 8. Formulario de contacto con label roto («mensaje Nombre Comentario») y «Apellidos» obligatorio innecesario; depende de JS. Corregir y mostrar el correo como fallback.
🟡 Baja prioridad / pulido
- Arquitectura de información simple y correcta; el ítem «Qué es Consulta en 15» apunta a
/conoceme/(sobre el profesional) — alinear etiqueta con contenido. - Existe «Saltar al contenido»; tono empático adecuado. Reducir las MAYÚSCULAS sostenidas («ÁGIL DE ORIENTACIÓN…», «COSTO JUSTO»): bajan legibilidad y los lectores de pantalla a veces las deletrean.
Mención especial — flujo «Agenda tu hora»
El camino real del usuario:
Inicio → /agendar-hora/ → (espera carga del iframe lento)
→ elige fecha/hora → completa Nombre+Email+Teléfono+Dirección+Ciudad (obligatorios)
→ "reserva" sin ver precio → sale del sitio a su correo
→ abre el correo → click en botón Flow → paga en Webpay → vuelve
Cada flecha es fuga. Los dos abandonos más probables: pedir dirección/ciudad sin precio, y el salto al correo para pagar. Palanca central de conversión: mostrar precio antes del calendario, cobrar dentro del widget en un paso, y reducir campos a Nombre+Email(+Teléfono).
4. UI (Diseño visual)
Paleta de marca con potencial (dorado #d4a353 + petróleo #2a5d5d sobre cremas cálidas), pero ejecución fragmentada por el doble constructor: Inicio (Kadence) razonablemente consistente vs. páginas internas (Pagelayer) desalineadas.
🔴 Crítico
1. Contraste de color reprobado (cálculo WCAG sobre los hex reales):
| Par | Ratio | Resultado |
|---|---|---|
| Dorado #d4a353 / blanco | 2,29:1 | Falla AA y AAA |
| Dorado #d4a353 / crema #f7f1e6 | 2,04:1 | Falla total |
| Amarillo #eab308 / blanco | 1,92:1 | Falla total |
| Gris #888888 / blanco | 3,54:1 | Solo texto grande |
| Hover botón: verde #13612e / azul rgba(17,89,175) | 1,11:1 | Texto casi invisible |
El dorado y el amarillo se usan como color de texto, no solo como acento. Base de texto sí correcta (#313131 = 13:1, #5c4228 = 8,25:1, petróleo #2a5d5d = 7,44:1).
2. Estado hover de botón roto. En hover aplica verde #13612e sobre azul (off-brand, 1,11:1) y además cambia de pill (radius 55px) a 20px y anula la sombra → salto de forma desconcertante.
3. Doble sistema de botones por el doble constructor. Inicio usa botones Kadence (Inter 900, mayúsculas, pill 55px, borde 4px slate); las internas usan botones Pagelayer con animaciones propias (btn-anim-glow/thin/slide). El usuario percibe dos sitios distintos.
🟠 Alto
- 4. Proliferación tipográfica: 5 familias en el
<head>(Roboto, Roboto Condensed, Inter, Questrial, Montserrat) y hasta 7 en páginas Pagelayer (+Poppins, Open Sans). Escala de >15 tamaños sin sistema modular (duplicados 30/32, 35/36, 44/45). - 5. MAYÚSCULAS sostenidas forzadas en menú, footer, botones y etiquetas → reduce velocidad de lectura.
- 6. Logo PNG pesado:
Gemini_Generated_Image_...png, 1108×621, 218 KB,fetchpriority="high", mostrado a ≤400px. Debería ser SVG o WebP de ~50–80 KB. - 7. Foco de teclado sin indicador visible: los
:focussolo replican el:hover(que además está roto). Añadir:focus-visiblecon outline claro. (Confirmar con render.)
🟡 Medio
- 8. Colores fuera de paleta heredados de Kadence (slate por defecto #1A202C…, palette10–15 con azules/rojos/naranjas) y gradientes preset azul→navy de Gutenberg compiten con la marca.
- 9. Iframe de reservas con alto fijo de 400px → probable scroll interno/recorte en móvil, justo en la conversión. (Confirmar con render.)
- 10. Formularios WPForms sin tematizar con la marca (se sienten como widget pegado).
🟢 Positivos
Cabecera transparente sobre hero · footer coherente (crema #f7f1e6) en las 4 páginas · breakpoints Kadence sanos (1024/767/1025px) · base cromática de texto bien contrastada · navegación consistente en etiquetas.
Recomendaciones de diseño (prioridad)
- Prohibir dorado/amarillo como texto; reservarlos a fondos/bordes/iconos. Para texto de acento usar petróleo #2a5d5d o dorado oscurecido (~#9a6f29 ≥4,5:1).
- Rehacer el hover del botón (mantener forma pill, color de marca, texto ≥4,5:1, sombra real).
- Unificar en un solo constructor (migrar internas de Pagelayer a Kadence Blocks) — mayor retorno en consistencia.
- Reducir a 2 familias tipográficas y definir escala modular (14/16/18/24/32/44/56); quitar mayúsculas sostenidas.
- Reemplazar el logo por SVG/WebP ligero; servir fotos en WebP/AVIF con
srcset+loading="lazy". - Añadir
:focus-visiblecon outline teal en todos los interactivos.
5. Performance (Rendimiento)
Todas las cifras son mediciones reales con curl + análisis del HTML. NO cumple un objetivo de rendimiento aceptable, casi exclusivamente por el TTFB del origen.
Métricas medidas
Tiempo de respuesta del servidor (TTFB):
| Página | URL | TTFB |
|---|---|---|
| Inicio | / | ~0,09 s cacheada; 503 intermitente |
| Qué es | /conoceme/ | 6,0–6,3 s |
| Agenda | /agendar-hora/ | 7,0–7,8 s |
| Contacto | /contacto-2/ | 5,8 s |
Durante las pruebas el origen devolvió HTTP 503 y, con cabeceras realistas, colgó la conexión 180 s. Comportamiento inestable bajo carga.
Transporte: Apache · HTTP/2 · TLS 1.3 · gzip y brotli activos · HSTS · sin CDN (servido desde origen). HTML transferido ligero (17–19 KB comprimido; ~80% de compresión).
Recursos clave:
- Logo PNG 213 KB (1108×621,
fetchpriority="high") en las 4 páginas, sin formato moderno. pagelayer-pro/js/combined.js: ~96 KB gzip, no minificado, en Agenda y Contacto.- jQuery (30 KB) + jQuery Migrate (legado).
- 14–15 archivos CSS render-blocking en el
<head>, sin combinar. - 5 familias de Google Fonts por
<link>bloqueante, sinpreconnectafonts.gstatic.com. - Imagen de contenido
Optimizada-a-30.webp(23,8 KB, WebP, cache 1 año): bien optimizada. /agendar-hora/carga un iframe SSA (documento adicional desde el mismo origen lento → hereda el TTFB)./contacto-2/carga WPForms (8 JS) + reCAPTCHA (tercero).
Caché: HTML max-age=0 (no cacheable) · estáticos con Expires ~30 días sin max-age/ETag · uploads de imagen max-age=31536000 (correcto).
Hallazgos priorizados
- CRÍTICO: TTFB 5,8–7,8 s + 503/cuelgues intermitentes (origen sin caché de página efectiva, capacidad limitada). Domina toda la métrica de carga.
- ALTO: logo PNG 213 KB como probable LCP · 14–15 CSS render-blocking · sin CDN.
- MEDIO: 5 familias de fuentes sin
preconnect· dos page builders (combined.js ~96 KB + jQuery + Migrate) · iframe de reserva sobre origen lento · reCAPTCHA en Contacto. - BAJO: HTML no cacheable · 0
loading="lazy"· enlace ahttp://linkedin.com(no HTTPS).
Estimación de Core Web Vitals (cualitativa, NO Lighthouse)
- LCP: muy probablemente deficiente (>4 s) por TTFB + logo PNG.
- CLS: probablemente bueno (<0,1) (las
<img>llevanwidth/height). - INP: riesgo medio por jQuery + Migrate + combined.js + WPForms/reCAPTCHA.
Recomendaciones (por ROI)
- Caché de página a nivel servidor (LiteSpeed Cache / WP Rocket / W3TC) → bajar TTFB de 5–8 s a <0,5 s.
- CDN (Cloudflare) → absorbe picos, evita 503, reduce latencia geográfica.
- Investigar causa de los 503 (procesos PHP/Apache, plan de hosting, consultas a BD).
- Reemplazar el logo por WebP/AVIF redimensionado (<30 KB).
- Combinar/minimizar CSS; evaluar eliminar Pagelayer Pro (quita ~96 KB).
- Diferir JS no crítico; cargar reCAPTCHA solo al interactuar.
- Reducir a 1–2 familias de fuentes +
preconnecto auto-hospedaje. Cache-Control: public, max-age=31536000, immutableen estáticos versionados.
6. Frontend (Implementación)
WordPress estándar (Kadence + Kadence Blocks + Pagelayer Pro) con calidad media-baja: contenido server-side (bueno) y formulario de contacto sólido, pero deuda técnica estructural por mezclar dos constructores, jerarquía de encabezados rota y entrega de CSS/JS no optimizada. No es desarrollo a medida, es ensamblaje de tema + plugins.
🔴 Críticos
- Jerarquía de encabezados rota o ausente (ver §1): doble
<h1>en Inicio; 0 encabezados en/conoceme/,/agendar-hora/,/contacto-2/(títulos como<div>/<p>). - Dos constructores coexistiendo (Kadence Blocks + Pagelayer-Pro): duplica CSS/JS, multiplica
<div>envoltorio y complica el mantenimiento. Consolidar en Kadence Blocks.
🟠 Altos
- CSS/JS render-blocking: Inicio con
<head>de ~63 KB, 14 hojas externas + 14<style>inline; sin CSS crítico ni caché de página visible. - JS sin
defer: Contacto carga 11 scripts externos (jQuery, Migrate, combined.js, 7 de WPForms). - jQuery + jQuery Migrate en producción (peso legado innecesario).
- Imágenes sin
loading="lazy"; mucho visual servido comobackground-image(sinalt, sin lazy). Imagen OGHome-scaled-1-266x1024.jpeg(266×1024, vertical) inadecuada.
🟡 Medios
- Enlace a
http://linkedin.com/...(HTTP) en las 4 páginas → cambiar ahttps://+rel="noopener". - Faltan cabeceras de seguridad: presentes HSTS y
Permissions-Policy; faltanContent-Security-Policy,X-Frame-Options,X-Content-Type-Options,Referrer-Policy. <noscript>duplicado en Contacto.- Reserva embebida en
<iframe>(SSA) → contenido fuera del documento principal, penaliza el paso de conversión.
🟢 Positivos confirmados
Contenido renderizado en servidor (no SPA) · title/meta/canonical únicos por página · viewport correcto y consistente · responsive real con media queries Kadence bien estructuradas · datos estructurados Schema.org vía Rank Math · landmarks ARIA + HTML5 semántico · formulario WPForms bien implementado (CSRF token, type=email, label/for, aria-errormessage, validación cliente) · sin marcado obsoleto · lang="es" · todas las <img> con alt.
Recomendaciones técnicas
- Reconstruir la semántica de encabezados (un
<h1>por página + h2/h3). - Eliminar Pagelayer/Pagelayer-Pro y rehacer esas secciones con Kadence Blocks.
- Instalar optimización (WP Rocket/LiteSpeed): CSS crítico, diferir, combinar/minificar, caché de página.
- Añadir
defera JS no crítico; evaluar quitar jQuery Migrate. loading="lazy"en imágenes below-the-fold; imagen OG horizontal 1200×630.- Enlace LinkedIn a HTTPS +
rel="noopener noreferrer". - Añadir cabeceras de seguridad (
X-Content-Type-Options,X-Frame-Options,Referrer-Policy, y a medio plazo CSP). - Eliminar el
<noscript>duplicado en Contacto.
7. Verificación con navegador real (Playwright / verdict)
Tras el análisis estático se hizo una pasada con un navegador real (Chromium vía verdict/Playwright) para cerrar lo que el HTML estático no permitía. Resultados medidos el 2026-05-27:
Rendimiento real (no estimado):
| Página | TTFB | DOM listo | Load total |
|---|---|---|---|
Inicio (/) | 7.082 ms | 7.566 ms | 7.631 ms |
Agenda (/agendar-hora/) | 6.579 ms | 6.925 ms | 11.889 ms |
→ Confirma el hallazgo crítico de Performance: el origen tarda ~7 s solo en empezar a responder, y /agendar-hora/ tarda ~12 s en cargar del todo porque el widget de reserva es un iframe anidado (wp-json/ssa/v1/embed-inner) que carga su propio documento desde el mismo origen lento. Es el peor caso, justo en la página de conversión.
Confirmaciones en el DOM renderizado (no solo HTML estático):
- Encabezados rotos confirmados: en el árbol de accesibilidad renderizado, «RESERVA TU SESIÓN EN 3 SIMPLES PASOS» es
paragraph > strong, no un encabezado. Los 3 pasos son<paragraph>. (Confirma C-1 / §1.) - Enlace LinkedIn en
http://confirmado en el árbol renderizado de las 4 páginas. - Sin errores de consola en Inicio (console limpia).
- Widget de reserva = iframe anidado
embed-inner→ documento adicional, responsable del load de ~12 s.
Matiz de contraste (corrige el detalle de §1/§4): en el hero (móvil y escritorio) el H1 dorado/amarillo va sobre fondo oscuro casi negro, donde el contraste sí es aceptable. Los fallos de contraste (dorado #d4a353 y amarillo #eab308) ocurren cuando esos colores se usan como texto sobre fondos claros/crema (menú activo, hover, subtítulos), no en el hero.
Render responsive: la versión móvil (390×844) renderiza correctamente —menú hamburguesa presente, texto legible, hero coherente—. El sistema responsive de Kadence funciona.
Evidencia visual capturada en ./evidencia/: agendar-desktop.png, agendar-widget.png, home-mobile.png.
Pendiente aún de test manual (el CLI no permite entrar al iframe anidado ni simular lector de pantalla): navegación por teclado dentro del calendario SSA, anuncio de errores con NVDA/VoiceOver, y comportamiento exacto del alto del iframe en móvil.
Plan de acción priorizado (transversal)
Ahora (mayor ROI, desbloquea varias áreas):
- Estabilizar y acelerar el origen: caché de página + CDN + investigar los 503. (Performance, UX, SEO)
- Reconstruir la jerarquía de encabezados (un
<h1>/página + h2/h3). (Accesibilidad, SEO, Frontend) - Mostrar el precio antes de reservar y, si es posible, cobrar dentro del widget. (UX — conversión)
- Limpiar contenido demo del tema y resolver páginas duplicadas con 301. (SEO)
Corto plazo:
- Corregir contrastes (dorado/amarillo como texto, hover de botón). (Accesibilidad, UI)
- Reducir campos del formulario de agendamiento (quitar Dirección/Ciudad). (UX)
- Añadir señales de confianza: confidencialidad, qué incluye, testimonios, página de privacidad. (UX, SEO/E-E-A-T)
- Optimizar logo (SVG/WebP) y reducir a 1–2 familias tipográficas. (Performance, UI)
- Schema
MedicalBusiness/Psychologist+Person; imagen OG horizontal. (SEO)
Estructural (medio plazo):
- Unificar en un solo constructor (Kadence Blocks) — elimina inconsistencia visual, peso de JS/CSS y deuda de mantenimiento de una vez. (UI, Performance, Frontend)
- Añadir cabeceras de seguridad y migrar enlaces a HTTPS. (Frontend)
Pendiente de verificación manual (no auditable estáticamente)
- Flujo completo de reserva en el iframe SSA con teclado y lector de pantalla (NVDA/VoiceOver).
- Indicador de foco visible y orden de tabulación en las 4 páginas y el menú móvil.
- Render real de estados hover/focus, recorte del iframe de 400px en móvil, legibilidad del nav transparente sobre cada hero.
- Lighthouse/PageSpeed real y Core Web Vitals de campo (CrUX) una vez estabilizado el origen.
- Flujo de pago end-to-end con Flow/Webpay.