lección 4
Día 3: ROAS y los datos que no cuadran
Calcula el ROAS reportado vs el ROAS real usando datos del CRM. Introduce los modelos de atribución y por que importan.
⏱ 45 min
### Jueves 7:32 AM -- El email de Ana
Todavia no has llegado a la oficina y ya hay fuego. Carmen reenvia un email de Ana a las 7:32 con un mensaje seco: "Ver abajo. Prioridad absoluta hoy."
1De: Ana Soler <ana.soler@pharmalife.com>2Para: Carmen Delgado <carmen@adpulse.io>3Asunto: RE: Quarterly review viernes4Fecha: Jueves 7:15 AM56Carmen,78Manana es el quarterly review con mi CEO. Necesito un número REAL9de ROAS por canal. No el que dice Google ni el que dice Meta -- el10REAL. Cuanto me devuelve cada euro que invierto en cada plataforma.1112Si no lo tenemos para mañana a las 10, voy a tener que improvisar13con los números de Google y eso no me gusta nada porque se que14están inflados.1516Necesito:171. ROAS real por canal (Google, Meta, Email)182. Recomendacion de donde poner más dinero193. Un número que yo pueda poner en una diapositiva sin miedo2021Gracias,22Ana
El email del cliente: números reales para mañana, sin excusas
Carmen te encuentra en la cocina a las 9:05: "Has visto el email de Ana? Es la prioridad de hoy. La tabla unificada ya la tienes. Ahora necesito que cruces con el CRM para sacar ROAS real. Ivan tiene acceso a la exportación de ventas de HubSpot. Trabajad juntos." Se gira y se va sin esperar respuesta. Asi es Carmen.
### Que es el ROAS y por que es LA métrica
ROAS (Return On Ad Spend) es la métrica fundamental del marketing digital. Mide cuantos euros de ingreso genera cada euro invertido en publicidad. La formula es simple: ROAS = Revenue / Spend. Un ROAS de 3x significa que por cada euro que inviertes, generas 3 euros en ventas. El objetivo de Ana es alcanzar 3x -- por debajo de eso, la publicidad no es rentable considerando margenes, costes operativos y el fee de AdPulse.
1FORMULA BASICA:2 ROAS = Revenue generado / Gasto publicitario34EJEMPLO:5 Gasto en Google Ads enero: 1,100,000 EUR6 Revenue que Google dice que genero: ~1,950,000 EUR7 ROAS segun Google: 1,950,000 / 1,100,000 = 1.77x89PERO... ese revenue es el que GOOGLE dice que genero.10Google tiene incentivo de mostrarte un número alto.11El ROAS REAL es el que sale de cruzar con ventas CRM confirmadas.1213ANALOGIA:14 Imagina 3 vendedores en una tienda. Cada uno dice:15 "Yo vendi 10 productos hoy" (30 total segun ellos).16 La caja registradora dice: solo se vendieron 21.17 Los vendedores se están atribuyendo ventas del otro.18 La caja registradora es el CRM.
ROAS: formula simple, pero la verdad está en QUE revenue usas
### Los datos del CRM (HubSpot)
Ivan te da acceso a la tabla de ventas del CRM de PharmaLife. Es un export diario que llega a las 5 AM desde HubSpot. Cada venta tiene un ID único, la fecha de compra, el importe y lo más valioso: los touchpoints previos -- que canales y campañas "toco" el cliente antes de comprar.
1-- Tabla: crm_conversions (export de HubSpot)2-- 3,150 ventas confirmadas en enero 202434SELECT * FROM crm_conversions LIMIT 5;56-- sale_id | customer_id | sale_date | amount_eur | touchpoints7-- S-00001 | C-4521 | 2024-01-03 | 89.90 | google:PL_Search_Vitamins_Brand,meta:pharmalife_vitamins_broad_fb8-- S-00002 | C-1203 | 2024-01-03 | 124.50 | meta:pharmalife_omega3_retarget_ig9-- S-00003 | C-8890 | 2024-01-04 | 67.00 | google:PL_Shopping_Supplements_All,email:Weekly_Vitamins_Promo,meta:pharmalife_vitamins_broad_fb10-- S-00004 | C-3301 | 2024-01-04 | 45.00 | google:PL_Search_Omega3_Generic11-- S-00005 | C-7720 | 2024-01-05 | 210.00 | email:Abandoned_Cart_Recovery,meta:pharmalife_protein_retarget_fb1213-- El campo touchpoints es un string con formato "source:campaign_name"14-- separado por comas, en orden cronologico (primero = primer contactó)1516-- Estadisticas del CRM enero 2024:17-- Total ventas: 3,15018-- Revenue total: 285,012 EUR19-- Ticket medio: 90.48 EUR20-- Ventas con 1 solo touchpoint: 1,230 (39%)21-- Ventas con 2 touchpoints: 1,240 (39%)22-- Ventas con 3 touchpoints: 680 (22%)
CRM: cada venta tiene la cadena de touchpoints que la precedieron
Ahora el panorama es claro. La venta S-00001 (89.90 EUR) fue tocada por Google Y Meta. Ambas plataformas se la atribuyen entera. La venta S-00003 (67.00 EUR) fue tocada por las 3 plataformas -- las 3 se la atribuyen. Ahi está la inflacion: la misma venta se cuenta 2 o 3 veces.
### Los modelos de atribución
Ivan te explica que hay multiples formas de "repartir" el credito de una venta entre los canales que participaron. Cada modelo da resultados diferentes y favorece a canales distintos:
- Last-click: 100% del credito al último canal antes de la compra. Favorece canales de cierre (Google Search, Email retargeting).
- First-click: 100% del credito al primer canal que toco al cliente. Favorece canales de descubrimiento (Display, Video, Social).
- Lineal: credito repartido equitativamente entre TODOS los touchpoints. El más justo y transparente. Si hay 3 touchpoints, cada uno recibe 1/3.
- Time-decay: más credito a los touchpoints cercanos a la compra, menos a los lejanos. Un equilibrio entre last-click y lineal.
- Data-driven: usa machine learning para asignar credito basado en patrones históricos. Requiere muchos datos y es una caja negra.
1EJEMPLO: Venta S-00003 (67.00 EUR)2Touchpoints: google -> email -> meta (3 canales, en orden cronologico)34LAST-CLICK:5 google: 0 EUR | email: 0 EUR | meta: 67.00 EUR (100%)67FIRST-CLICK:8 google: 67.00 EUR (100%) | email: 0 EUR | meta: 0 EUR910LINEAL:11 google: 22.33 EUR (33%) | email: 22.33 EUR (33%) | meta: 22.33 EUR (33%)1213TIME-DECAY (factor 0.5 por posición):14 google: 11.17 EUR (17%) | email: 22.33 EUR (33%) | meta: 33.50 EUR (50%)1516Cual es "correcto"? Ninguno y todos. Depende de que pregunta17quieras responder. Para Ana, recomendamos LINEAL por ser18transparente y fácil de auditar.
El mismo dato, 4 interpretaciones diferentes -- por eso la atribución es difícil
Ivan te dice: "Para la presentación de mañana usamos atribución lineal. Es la más fácil de explicar a un cliente no técnico. Ana va a entender que si una venta pasó por 3 canales, cada uno se lleva 1/3 del credito. Es justo, transparente y auditable. Los modelos data-driven son mejores pero son cajas negras -- y Ana no confía en cajas negras."
El campo touchpoints del CRM es un string separado por comas. En un mundo ideal seria un array JSON o una tabla separada (crm_touchpoints). Pero los exports de CRMs legacy vienen así -- texto plano que necesitas parsear. No te quejes, resuelvelo.
### Por que la atribución es tan difícil
Ivan se sienta contigo a media mañana y te explica por que este problema no tiene solución "correcta": "La atribución es fundamentalmente un problema de contrafactual. Para saber el VERDADERO impacto de Google, tendrias que volver atras en el tiempo, quitar Google, y ver cuantas ventas habrias tenido SIN Google. Eso es imposible. Asi que usamos modelos matematicos que APROXIMAN la realidad. Cada modelo hace suposiciones diferentes y da resultados diferentes."
Te pone un ejemplo: "Imagina a un cliente, Carlos. Carlos vio un anuncio de vitaminas en Instagram (Meta), luego busco omega 3 en Google y hizo click, y finalmente recibió un email de cart abandonment y compro. Pregunta: sin Meta, habria comprado Carlos? Quiza si -- quiza ya conocia la marca. Sin Google, habria llegado a la web? Quiza si -- habria buscado el nombre de la marca directamente. Sin el email, habria vuelto? Probablemente no -- el email fue el recordatorio final."
"Ves el problema? No hay forma de saber con certeza que habria pasado en un mundo alternativo. Asi que hacemos lo mejor que podemos: repartir el credito con un modelo matematico transparente y consistente. El modelo lineal dice 1/3 a cada uno. El time-decay dice más al email (último). El last-click dice todo al email. Ninguno es la verdad -- todos son aproximaciones útiles."
La mayor trampa de la atribución es buscar la respuesta "correcta". No existe. Lo que existe es la respuesta más UTIL para la decisión que el cliente necesita tomar. Si Ana necesita decidir donde poner más dinero, lo que importa no es el número exacto de ROAS -- es el RANKING relativo entre canales. Y en eso, los 3 modelos coinciden: Meta > Email > Google.
### El CRM como fuente de verdad
Ivan te explica un concepto fundamental: "En AdTech, la única fuente de verdad es el CRM del cliente. No Google, no Meta, no email. El CRM registra ventas REALES -- dinero que entro en la cuenta bancaria de PharmaLife. Todo lo demas son estimaciones con grados de confianza variable."
Pero el CRM tampoco es perfecto. Ivan te señala limitaciones: "Los touchpoints del CRM dependen de las cookies y el tracking. Si un usuario borra sus cookies entre el primer click (Google) y la compra, el CRM no sabe que pasó por Google. Solo ve el último canal. Eso introduce un sesgo hacía last-click: los canales de cierre (email, search brand) aparecen sobrerepresentados en los touchpoints del CRM."
1LIMITACIONES DEL CRM COMO FUENTE DE VERDAD:231. Cookie deletion: ~15% de usuarios borran cookies entre touchpoints.4 Impacto: sub-representa canales de awareness (display, video).562. Cross-device: un usuario ve el anuncio en movil pero compra en7 desktop. Sin cross-device tracking, solo ves el dispositivo final.8 Impacto: sub-representa mobile.9103. Offline conversions: un usuario ve el anuncio online pero compra11 por telefono. El CRM registra la venta pero sin touchpoints digitales.12 Impacto: ventas "sin atribuir" (~5-8% del total).13144. Latencia de registro: entre que el usuario compra y aparece en15 el CRM pueden pasar 24-48h (procesamiento de pago, antifraude).16 Impacto: desfase temporal entre fuentes.1718CONCLUSION: El CRM es la MEJOR fuente que tenemos, no la PERFECTA.19Usamos el CRM como verdad y aceptamos un margen de error del 5-8%.
El CRM no es perfecto pero es lo más cercano a la verdad que tenemos
## ejercicios
Diagnosticar la inflacion por tipo de campaña
Algunas campañas generan más overlap que otras (ej: retargeting aparece en muchos touchpoints). Calcula la inflacion estimada por product_category usando la tabla unificada.
Calcular ROAS reportado vs ROAS real básico
Usando unified_campaigns, calcula el ROAS que reporta cada plataforma y comparalo con el ROAS real usando el total de ventas del CRM. Cuantifica la diferencia.
Parsear touchpoints y calcular atribución lineal en Python
Escribe funciones Python que parseen el campo touchpoints del CRM, implementen atribución lineal, y calculen el ROAS real por canal.
Atribucion lineal en SQL puro (CTE complejo)
Implementa la atribución lineal directamente en SQL: expande touchpoints, cuenta por venta, distribuye revenue y agrega por fuente.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...