CULTIVA IA
Datos & Analítica
GA4 + GTM + GDPR

Plan de Tracking
NutriFlow SaaS

Implementación completa de analítica para SaaS B2B de nutrición clínica — funnel de adquisición a revenue con 24 eventos, dimensiones personalizadas y cumplimiento GDPR.

24Eventos definidos
6Conversiones GA4
8Dimensiones custom
Next.js 14Stack
GDPRCompliant
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