Este rol cubre: la configuración del tracking (GTM, GA4, Meta Pixel), la creación y optimización de landing pages por tratamiento, el SEO local, la integración del chatbot y el widget de reserva en la web, y la sincronización de formularios con HubSpot.
Mis tareas
Lo que debo hacer como Especialista en Web
1
Fase 1 — Tracking y Fundamentos (Semanas 1–3)
Prioridad crítica
-
Instalar Google Tag Manager en la webContenedor GTM en el <head> y <body> de todas las páginas. Crear variables de capa de datos (dataLayer) para eventos clave: CTA click, scroll depth, form submit, chatbot open.Crítico
-
Configurar GA4 y Meta Pixel vía GTMPropiedad GA4 nueva para Dental Basté. Meta Pixel conectado al Business Manager. Eventos estándar: page_view, scroll_25/50/75/90, click_cta, form_start, form_submit, booking_started, booking_completed.Crítico
-
Integrar widget de chatbot en la webWidget flotante (bottom-right) que conecta con el backend del especialista IA. Aparece tras 8 seg o al intentar salir (exit intent). Responsive y accesible (ARIA labels). Evento GA4 al abrir.Crítico
-
Crear landing page de captación principalPágina de aterrizaje para todas las campañas de ads. Hero con propuesta de valor, formulario visible sin scroll, chatbot flotante, CTA: "Reserva tu primera visita gratis". Sin menú de navegación (más conversión).Alta
-
Embeber Calendly / Cal.com en web y landingWidget inline en la página de contacto y en todas las landings. Sincronización con Google Calendar de la clínica. Configurar confirmación de evento → webhook a HubSpot (coordinar con especialista IA).Alta
2
Fase 2 — Landings y SEO (Semanas 4–8)
Landings por tratamiento · QR · SEO on-page
-
Landing pages por tratamiento (ortodoncia, implantes, blanqueamiento, periodoncia)Una página por tratamiento. Estructura: hero + beneficios + proceso en 3 pasos + testimonios + FAQ + CTA. Contenido SEO generado con IA revisado por el equipo. Formulario y chatbot integrados.Alta
-
Página de destino para QR del escaparateURL corta dedicada (ej: dentalbaste.com/escaparate). Landing minimalista: logo + "Has escaneado desde nuestra clínica" + botón reserva directa. Sin distracciones. Tracking de fuente = "qr_escaparate".Alta
-
SEO on-page en todas las páginasMeta title y description únicos, H1 con keyword principal, schema markup LocalBusiness + MedicalClinic, Google Business Profile actualizado, imágenes con alt text, URL canónicas. Priorizar búsquedas locales "dentista [ciudad]".Alta
-
Analizar comportamiento con Microsoft Clarity (gratuito)Heatmaps y grabaciones de sesión para ver dónde hacen click y dónde abandonan. Instalar vía GTM. Funnel tracking: landing → formulario → Calendly. Revisar cada 2 semanas.Media
3
Fase 3 — Optimización y CRO (Semanas 9–12)
A/B testing · velocidad · HubSpot sync
-
Sincronización bidireccional HubSpot ↔ formularios webTodos los formularios envían datos directamente a HubSpot via API o formulario nativo. Webhook para actualizar etapas del pipeline cuando cambia el estado en CRM.Media
-
Optimización Core Web Vitals (LCP, CLS, INP)LCP < 2.5 seg, CLS < 0.1, INP < 200ms. Optimizar imágenes (WebP, lazy loading), diferir scripts no críticos, usar CDN para estáticos. Google PageSpeed Insights como referencia.Media
-
A/B testing de headlines y CTAs principalesProbar variantes del hero de la landing principal: headline, subheadline, CTA ("Reserva gratis" vs "Primera visita sin coste"). Mínimo 200 visitas por variante antes de concluir.Baja
Tracking y Analítica
GTM · GA4 · Meta Pixel · Clarity — eventos clave y configuración
Google Tag Manager
- Un único contenedor GTM gestiona todos los tags
- Variables: URL, clic elemento, formulario, scroll depth
- Triggers basados en dataLayer events
- Publicar siempre en modo Preview antes de producción
Google Analytics 4
- Propiedad GA4 nueva para Dental Basté
- Conversiones: form_submit, booking_completed
- Audiencias para retargeting en Google Ads
- Conectar a Search Console y Looker Studio
Meta Pixel
- Pixel instalado en todas las páginas vía GTM
- Eventos: ViewContent, Lead, InitiateCheckout, CompleteRegistration
- Conversions API (CAPI) para datos de servidor — coordinar con IA
- Audiencias de retargeting: visitantes 30 días, abandonos de formulario
Microsoft Clarity
- Heatmaps en landing principal y páginas de tratamiento (gratuito)
- Grabaciones de sesión: identificar puntos de abandono
- Funnel: landing → formulario → Calendly → confirmación
- Instalar vía GTM — sin límite de sesiones grabadas
Esquema de Eventos GTM / GA4
| Evento GA4 | Trigger GTM | Meta Pixel equivalente | Conversión |
|---|---|---|---|
page_view | All Pages | PageView | No |
scroll_depth | Scroll 25/50/75/90% | — | No |
click_cta | Click en .cta-button | InitiateCheckout | No |
chatbot_open | Click en widget chatbot | — | No |
form_start | Focus en primer campo | — | No |
form_submit | Form Submit Success | Lead | Sí |
booking_started | Click en widget Calendly | InitiateCheckout | No |
booking_completed | Evento Calendly event_scheduled | CompleteRegistration | Sí |
qr_scan_landing | Page View URL contiene /escaparate | ViewContent | No |
Código GTM — dataLayer Events
JavaScript — dataLayer push para eventos clave
// Al abrir el chatbot
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'chatbot_open',
chatbot_source: 'floating_widget',
page_path: window.location.pathname
});
// Al enviar formulario con éxito
function onFormSuccess(tratamiento) {
window.dataLayer.push({
event: 'form_submit',
form_type: 'lead_capture',
tratamiento_interes: tratamiento,
fuente: document.referrer || 'direct'
});
}
// Calendly: escuchar evento de cita confirmada
window.addEventListener('message', function(e) {
if (e.data.event === 'calendly.event_scheduled') {
window.dataLayer.push({
event: 'booking_completed',
booking_type: 'calendly'
});
}
});
Meta Pixel — Eventos Estándar
JavaScript — Meta Pixel custom events vía GTM
// Instalar en tag GTM de tipo "Custom HTML" — activar en All Pages
!function(f,b,e,v,n,t,s) {
if(f.fbq) return; n=f.fbq=function(){...}; /* código estándar Meta */
}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'TU_PIXEL_ID');
fbq('track', 'PageView');
// Lead — trigger: dataLayer event "form_submit"
fbq('track', 'Lead', {
content_name: {{DLV - tratamiento_interes}},
content_category: 'dental_treatment'
});
// Cita confirmada — trigger: dataLayer event "booking_completed"
fbq('track', 'CompleteRegistration', {
content_name: 'appointment_booked'
});
Landing Pages
Estructura, páginas necesarias y landing del QR escaparate
Páginas a crear
| Página | URL sugerida | Objetivo | Fuente de tráfico | Prioridad |
|---|---|---|---|---|
| Landing captación principal | /primera-visita-gratis | Convertir tráfico de ads en leads | Google Ads, Meta Ads | Crítico |
| QR escaparate | /escaparate | Convertir transeúntes que escanean el QR | QR de la TV | Crítico |
| Ortodoncia | /ortodoncia | SEO + conversión tratamiento específico | Orgánico, Google Ads | Alta |
| Implantes dentales | /implantes-dentales | SEO + conversión (ticket alto) | Orgánico, Google Ads | Alta |
| Blanqueamiento | /blanqueamiento-dental | SEO + conversión | Orgánico, Meta Ads | Alta |
| Periodoncia | /periodoncia | SEO + conversión | Orgánico | Media |
Estructura de una Landing por Tratamiento
1. Hero
- Headline con keyword + beneficio principal
- Subheadline: "En Dental Basté, [ciudad]"
- CTA primario: "Reserva tu primera visita gratis"
- Imagen del equipo o de la clínica (real, no stock)
2. Beneficios + Proceso
- 3 beneficios del tratamiento en iconos
- Proceso en 3 pasos: Consulta → Diagnóstico → Tratamiento
- Badge de confianza: años de experiencia, nº pacientes
3. Testimonios + FAQ
- 2–3 testimonios reales con foto (con permiso)
- 5–7 preguntas frecuentes en acordeón
- Enlace a reseñas de Google
4. CTA Final + Booking
- Widget Calendly embebido o formulario corto
- CTA repetido: "Primera visita sin compromiso"
- Chatbot flotante activo en toda la página
Landing QR Escaparate — Especificación
Esta página es crítica: el transeúnte que escanea el QR de la TV viene con alta intención. La página debe cargarse en <2 seg (mobile first), sin menú, sin distracciones — solo reservar.
HTML — Estructura de la landing /escaparate
<!-- URL: dentalbaste.com/escaparate -->
<!-- Sin menú, sin footer, sin distracciones -->
<section class="qr-hero">
<img src="/logo.svg" alt="Dental Basté" />
<h1>¡Bienvenido a Dental Basté!</h1>
<p>Has escaneado el QR de nuestra clínica.
Reserva ahora tu primera visita — sin coste.</p>
<a href="#booking" class="cta-button">Reservar cita gratis →</a>
</section>
<section id="booking">
<!-- Widget Calendly inline -->
<div class="calendly-inline-widget"
data-url="https://calendly.com/dentalbaste/primera-visita?utm_source=qr_escaparate">
</div>
</section>
<!-- GTM: registrar qr_scan_landing en dataLayer -->
<script>
dataLayer.push({ event: 'qr_scan_landing', source: 'tv_escaparate' });
</script>
SEO Local
On-page · Schema markup · Google Business Profile · Core Web Vitals
Checklist On-Page (por página)
- Meta title: keyword principal + ciudad (55–60 car.)
- Meta description con CTA implícito (150–160 car.)
- H1 único con keyword principal, solo uno por página
- H2/H3 con variaciones semánticas de la keyword
- URL corta y descriptiva, sin parámetros
- Imágenes: WebP, <100KB, alt text descriptivo
- Enlace interno a la página de reserva en cada sección
- Schema markup (ver código abajo)
Google Business Profile
- Verificar y completar el perfil al 100%
- Categoría principal: "Dentista". Secundarias: ortodoncia, implantes
- Fotos reales de la clínica (mínimo 10, incluyendo equipo)
- Horario actualizado, incluyendo festivos
- Publicaciones semanales con el contenido del equipo de vídeo
- Responder a todas las reseñas (el especialista IA ayuda con esto)
Schema Markup — LocalBusiness + MedicalClinic
JSON-LD — Schema para Dental Basté (insertar en <head>)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": ["Dentist", "LocalBusiness"],
"name": "Dental Basté",
"url": "https://dentalbaste.com",
"telephone": "+34 9XX XXX XXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "Calle ...",
"addressLocality": "[Ciudad]",
"addressCountry": "ES"
},
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "09:00", "closes": "20:00" }
],
"priceRange": "€€",
"medicalSpecialty": ["Dentistry", "Orthodontics"],
"hasMap": "https://maps.google.com/?q=Dental+Basté"
}
</script>
Core Web Vitals — Objetivos y Acciones
| Métrica | Objetivo | Cómo conseguirlo |
|---|---|---|
| LCP (Largest Contentful Paint) | < 2.5 seg | Imagen hero en WebP preloaded, CDN para estáticos, hosting rápido |
| CLS (Cumulative Layout Shift) | < 0.1 | Dimensiones fijas en imágenes y embeds (Calendly, widget chatbot) |
| INP (Interaction to Next Paint) | < 200ms | Diferir scripts de terceros (GTM, Pixel, Clarity) con loading="lazy" |
| TTFB (Time to First Byte) | < 600ms | Caché del servidor, evitar redirects innecesarios, hosting SSD |
Integraciones Web
Calendly · Chatbot · Formularios HubSpot · Mapa de conexiones
Calendly — Embed en landing
HTML — Calendly widget inline con tracking
<!-- Cargar script de Calendly -->
<link href="https://assets.calendly.com/assets/external/widget.css" rel="stylesheet"/>
<script src="https://assets.calendly.com/assets/external/widget.js" async></script>
<!-- Widget inline -->
<div class="calendly-inline-widget"
data-url="https://calendly.com/dentalbaste/primera-visita
?hide_gdpr_banner=1
&utm_source=web
&utm_medium=landing"
style="min-width:320px; height:700px;">
</div>
<!-- Escuchar evento de cita confirmada para GTM -->
<script>
window.addEventListener('message', function(e) {
if (e.data.event === 'calendly.event_scheduled') {
dataLayer.push({ event: 'booking_completed' });
}
});
</script>
Formulario de Captación — Integración con HubSpot
HTML + JavaScript — Formulario con envío a HubSpot API
<form id="lead-form">
<input name="nombre" placeholder="Tu nombre" required />
<input name="email" type="email" placeholder="Tu email" required />
<input name="telefono" placeholder="Teléfono" />
<select name="tratamiento">
<option>Ortodoncia</option>
<option>Implantes</option>
<option>Blanqueamiento</option>
<option>Otra consulta</option>
</select>
<button type="submit">Reserva tu primera visita gratis →</button>
</form>
<script>
document.getElementById('lead-form').addEventListener('submit', async function(e) {
e.preventDefault();
const data = Object.fromEntries(new FormData(e.target));
// Enviar a HubSpot Forms API
await fetch('https://api.hsforms.com/submissions/v3/integration/submit/TU_PORTAL_ID/TU_FORM_ID', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fields: [
{ name: 'firstname', value: data.nombre },
{ name: 'email', value: data.email },
{ name: 'phone', value: data.telefono },
{ name: 'tratamiento_interes', value: data.tratamiento }
],
context: { pageUri: window.location.href }
})
});
// Disparar evento GA4 + Meta Pixel
dataLayer.push({ event: 'form_submit', tratamiento_interes: data.tratamiento });
});
</script>
Mapa de Conexiones Web
| Elemento web | Destino | Método | Dato enviado |
|---|---|---|---|
| Formulario de captación | HubSpot CRM | HubSpot Forms API | Nombre, email, teléfono, tratamiento |
| Widget Calendly | HubSpot + Make | Webhook Calendly | Cita confirmada, datos del lead |
| Widget chatbot | Backend IA (Make/n8n) | Iframe / WebSocket | Mensajes de conversación |
| GTM — form_submit | GA4 + Meta Pixel | dataLayer push | Evento de conversión + tratamiento |
| GTM — booking_completed | GA4 + Meta Pixel + HubSpot | dataLayer push | Conversión de cita |
| Landing /escaparate | GA4 + Calendly | UTM params + dataLayer | Fuente = qr_escaparate |