Funnel cubierto
100%
Visita → pago
Eventos prioritarios
9
Prioridad alta (P1)
Canales UTM
5
Google, LinkedIn, Email, Blog, Partners
Retención datos
14m
GA4 configurado
Funnel de Conversión Instrumentado
Cada etapa mapeada a un evento GA4 prioritario
cta_clicked
Descubrimiento
Landing + blog
trial_signup_started
Registro
Form inicio
trial_signup_completed
Activación
Cuenta creada
onboarding_step_completed
Onboarding
Setup clínica
plan_selected
Selección plan
Pricing page
purchase_completed
Revenue
Stripe webhook
Plan de Tracking — Marketing Site
Eventos para landing page, blog y formularios de contacto
Marketing Site Events
10 eventos
| Evento | Categoría | Propiedades | Trigger | Prioridad | Conversión |
|---|---|---|---|---|---|
| cta_clicked | Adquisición | button_textlocationpage_section |
Click CTA | Alta | — |
| demo_form_submitted | Adquisición | company_sizespecialtysource_page |
Form submit | Alta | Conversión |
| trial_signup_started | Activación | methodsource_pageplan_interest |
Click "Empezar gratis" | Alta | — |
| pricing_plan_viewed | Revenue | plan_namebilling_period |
Hover/focus plan | Media | — |
| pricing_toggle_changed | Revenue | billing_period |
Toggle mensual/anual | Media | — |
| blog_article_read | Adquisición | article_titlecategoryread_pct |
Scroll 75% | Baja | — |
| resource_downloaded | Adquisición | resource_nameresource_type |
Click descarga | Media | Conversión |
| video_play_started | Adquisición | video_titlevideo_location |
Click play | Baja | — |
| chat_widget_opened | Adquisición | page_location |
Click chat | Baja | — |
| exit_intent_shown | Retención | offer_typepage_location |
Mouse exit viewport | Baja | — |
Plan de Tracking — Producto (App)
Onboarding, activación de features y conversión a pago
Product Events
14 eventos
| Evento | Categoría | Propiedades | Trigger | Prioridad | Conversión |
|---|---|---|---|---|---|
| trial_signup_completed | Activación | methodplan_interestreferral_source |
Cuenta creada OK | Alta | Conversión |
| onboarding_step_completed | Activación | step_numberstep_nametime_spent_sec |
Step completado | Alta | — |
| onboarding_abandoned | Activación | last_steptime_in_flow |
Cierre sin completar | Alta | — |
| first_patient_added | Activación | days_since_signup |
1er paciente creado | Alta | Conversión |
| feature_used | Retención | feature_nameplan_type |
Uso de feature | Alta | — |
| report_generated | Retención | report_typepatient_count |
Click "Generar informe" | Media | — |
| plan_selected | Revenue | plan_namebilling_periodplan_price_eur |
Click "Seleccionar plan" | Alta | — |
| checkout_started | Revenue | plan_namecoupon_applied |
Stripe checkout abierto | Alta | — |
| purchase_completed | Revenue | plan_namevaluebilling_periodcurrency |
Stripe webhook | Alta | Conversión |
| trial_expiring_banner_shown | Retención | days_remaining |
Banner visible | Media | — |
| upgrade_cta_clicked | Revenue | locationcurrent_plan |
Click upgrade | Alta | — |
| subscription_cancelled | Retención | reasonplan_namemonths_active |
Cancelación confirmada | Alta | — |
| integration_connected | Activación | integration_name |
OAuth completado | Media | — |
| team_member_invited | Referral | roleteam_size |
Invitación enviada | Media | Conversión |
Implementación GTM / Next.js 14
Fragmentos de código listos para usar
gtm-datalayer.ts
trial-signup.tsx
purchase-webhook.ts
// lib/analytics/gtm.ts — NutriFlow tracking utilities export function pushEvent(eventName: string, params: Record<string, unknown> = {}) { if (typeof window === 'undefined' || !window.dataLayer) return; window.dataLayer.push({ event: eventName, ...params, }); } // ── Marketing Site ────────────────────────────────────────── export const trackCtaClicked = (buttonText: string, location: string) => pushEvent('cta_clicked', { button_text: buttonText, location: location, }); export const trackDemoFormSubmitted = (companySize: string, specialty: string) => pushEvent('demo_form_submitted', { company_size: companySize, specialty: specialty, source_page: window.location.pathname, }); // ── Product (App) ─────────────────────────────────────────── export const trackTrialSignupCompleted = (method: 'google' | 'email', planInterest: string) => pushEvent('trial_signup_completed', { method: method, plan_interest: planInterest, // ⚠ NO incluir email ni nombre — GDPR }); export const trackOnboardingStep = (stepNumber: number, stepName: string, timeSec: number) => pushEvent('onboarding_step_completed', { step_number: stepNumber, step_name: stepName, time_spent_sec: timeSec, }); export const trackPurchaseCompleted = (planName: string, value: number, billingPeriod: string) => pushEvent('purchase_completed', { plan_name: planName, value: value, currency: 'EUR', billing_period: billingPeriod, // GA4 revenue event: value se usa en informes de ingresos });
Estrategia UTM — NutriFlow Lanzamiento
Convención lowercase + underscores en todos los canales
🔍 Google Ads — Búsqueda
utm_sourcegoogle
utm_mediumcpc
utm_campaignlanzamiento_julio26
utm_contenthero_cta / pricing_cta
utm_termsoftware+nutricion+clinica
💼 LinkedIn Ads — Retargeting
utm_sourcelinkedin
utm_mediumpaid_social
utm_campaignretargeting_visitantes
utm_contentcarousel_features / video_demo
utm_term—
💌 Email Marketing (Mailchimp)
utm_sourcemailchimp
utm_mediumemail
utm_campaignnurturing_trial / launch_announcement
utm_contentcta_primary / cta_secondary
NotaSin utm_term en email
🤝 Partners (Colegios dietistas)
utm_sourcecolegio_dietistas_madrid
utm_mediumreferral
utm_campaignpartnership_colegios
utm_contentnewsletter / web_banner
utm_term—
Dimensiones y Métricas Personalizadas — GA4
8 dimensiones custom para segmentación avanzada
Nombre (GA4)
Descripcion
Alcance
Parametro evento
user_plan_type
Plan activo del usuario (trial / starter / pro / clinica)
Usuario
plan_type
user_account_id
ID interno (anónimo, no PII) para cruzar con CRM
Usuario
account_id
clinic_specialty
Especialidad de la clínica (nutricion, endocrino, deporte)
Usuario
specialty
onboarding_completed
Si el usuario completó todos los pasos de onboarding
Usuario
onboarding_done
plan_interest
Plan de interés en el momento del signup
Sesión
plan_interest
trial_days_remaining
Días restantes de prueba gratuita
Sesión
days_remaining
feature_name
Nombre del feature usado en la sesión
Evento
feature_name
cancellation_reason
Motivo seleccionado al cancelar (precio / alternativa / bug)
Evento
reason
Privacidad GDPR y Validación
Checklist de cumplimiento y pasos de validacion pre-lanzamiento
✅ Cumplimiento GDPR
Consent Mode v2 activo antes de GTM load
Cookiebot configurado (analytics cookies clasificados)
IP anonymization habilitado en GA4
Retención datos: 14 meses (Admin > Data Settings)
Sin PII en parámetros de eventos
DPA firmado con Google (GA4 Terms)
Ads personalization: desactivado hasta DPA
📋 Convenciones de Nomenclatura
Formato: objeto_accion (object_action)
Todo lowercase, separador: underscore
Sin mezclar camelCase y snake_case
Nombres específicos: cta_hero_clicked no button_clicked
UTMs: lowercase, sin espacios, underscores
Documentar en Notion/Confluence (tabla viva)
Version control del plan de tracking en git
👀 GA4 DebugView
1Añadir ?debug_mode=1 a la URL de la app
2Abrir Admin > DebugView en GA4
3Navegar por cada flujo del funnel
4Verificar nombre del evento y propiedades
5Confirmar que conversiones aparecen en azul
👀 GTM Preview Mode
1Publicar container en modo Preview (no publicar)
2Abrir Tag Assistant en Chrome
3Verificar que cada tag se dispara en el trigger correcto
4Comprobar variables del dataLayer con valores reales
5Verificar en mobile (viewport 375px)
📢 Alertas de Calidad
1Crear alerta GA4 si trial_signup_completed = 0 por 24h
2Alerta si purchase_completed duplicado en 1h mismo user
3Monitor semanal: eventos sin propiedades esperadas
4Revisar Explore > Funnel cada lunes post-lanzamiento
5Lookerstudio dashboard conectado a GA4 en tiempo real