lección 1

Bienvenido a AdPulse

Conoce la agencia, el equipo de datos, tu cliente PharmaLife y el problema de las 3 fuentes que no coinciden entre si.

30 min

### Un mensaje de LinkedIn que lo cambia todo

TaskFlow te enseñó a pensar en producto y métricas. Construiste cohortes de retención, pipelines de ingesta desde Kafka y hasta descubriste bugs de tracking que llevaban meses sin detectarse. Pero después de 3 meses allí, sentías que te estabas especializando demasiado pronto: un solo producto, un solo set de eventos, una sola fuente de datos. Querías variedad.

Dos semanas después, firmaste contrató. El viernes hiciste tu último commit en TaskFlow y el lunes siguiente te plantaste en Chamberi, Madrid, a las 8:50 de la mañana, delante de un coworking con terraza y olor a cafe recien hecho.

Lo que te atrajo de AdPulse no fue solo el puesto -- fue la variedad. En una agencia trabajas con multiples clientes, cada uno con sus datos, sus problemas y sus urgencias. No te estancas en un solo dominio. Y Carmen, en esa primera conversacion de cafe, te dijo algo que se te quedo: "Aqui cada semana es diferente. Un día estas reconciliando datos de farmacéuticas, al siguiente estas analizando el funnel de una fintech, y al siguiente ayudando a una cadena de restaurantes a entender por que nadie hace click en sus anuncios de TikTok. Si te aburres, es que no estas prestando atención."

En FreshMart aprendiste que los datos de una empresa caben en un solo PostgreSQL. En TaskFlow aprendiste que los eventos de producto fluyen como un rio de JSON. En AdPulse vas a aprender algo diferente: que el mundo real tiene MULTIPLES fuentes de datos que no se hablan entre si, que usan nombres distintos para lo mismo, y que cada una miente un poquito a su favor. Tu trabajó aquí no es solo mover datos -- es encontrar la verdad entre versiones contradictorias.

### AdPulse -- La agencia

AdPulse es una agencia de marketing digital fundada en 2017 en Madrid. Tres ex-Google y una ex-Havas vieron que las agencias clasicas no sabian medir el retorno real de la inversión publicitaria. Su propuesta fue radical para la epoca: "te gestionamos las campañas Y te demostramos con datos cuanto dinero te hacen ganar". Nada de métricas vanidosas como impresiones o likes. Solo euros invertidos vs euros ganados.

Siete años después, AdPulse tiene 200 empleados distribuidos entre Madrid, Barcelona y Lisboa. Gestionan 50 clientes grandes (presupuesto superior a 50K euros/mes cada uno) y mueven un volumen total de 180 millones de euros al año en publicidad digital. Su ventaja competitiva es precisamente la que tu vas a construir está semana: un sistema de medicion que cruza lo que dicen las plataformas publicitarias con las ventas reales del cliente.

El modelo de negocio es simple: AdPulse cobra un fee del 10% sobre el gasto publicitario que gestiona. Si PharmaLife gasta 2M/mes, AdPulse cobra 200K/mes por gestionarlo. Eso significa que cada cliente que se va es una perdida enorme. La retención de clientes depende directamente de demostrar VALOR con datos -- y ese es el trabajó de tu equipo.

  • Fundacion: Madrid, 2017. Cuatro fundadores (3 ex-Google, 1 ex-Havas)
  • Empleados: 200 (Madrid 120, Barcelona 50, Lisboa 30)
  • Clientes activos: 50 cuentas con budget >50K EUR/mes
  • Volumen gestionado: 180M EUR/año en publicidad digital
  • Especializacion: Performance marketing (Google, Meta, TikTok, Email)
  • Stack de datos: PostgreSQL, Airflow, Python, Tableau
  • Diferencial: medicion de ROAS real cruzando plataformas con CRM del cliente
  • Ingresos: ~18M EUR/año (fee del 10% sobre gasto gestionado)

### El equipo de datos

El equipo de datos de AdPulse es compacto pero experimentado. A diferencia de FreshMart (donde eras el quinto fichaje de un equipo joven) o TaskFlow (donde el equipo estaba orientado a producto), aquí el foco es claro: hacer que los clientes vean el valor real de su inversión en publicidad. El equipo de datos no es un centro de coste -- es el motor que justifica los 180M euros que los clientes gastan a traves de AdPulse.

Equipo de datos de AdPulse + cliente principal PharmaLife

### Carmen Delgado -- Directora de Datos (tu jefa)

Carmen tiene 40 años y una trayectoria que impone respeto. Empezo como analista en BBVA, ascendió a lead de BI en 4 años, y lideró la migración del reporting legacy a un data warehouse moderno que procesaba 200M de transacciones diarias. Cuando la burocracia del banco la asfixio, aceptó la oferta de AdPulse donde lleva 3 años construyendo el equipo de datos desde cero.

Personalidad: pragmática, directa, cero tolerancia con las excusas. No le importa si tu código es elegante -- le importa si da los números correctos a tiempo. Protege a su equipo del ruido del negocio pero espera resultados puntuales. Si le llevas un problema, más te vale traer también una propuesta de solución. Su frase más repetida: "Dame los números limpios para el jueves. Si hay discrepancia mayor al 5% quiero saber POR QUE antes de presentar a Ana."

Como comunica: Slack directo, sin rodeos, a veces sin saludos. Un mensaje típico de Carmen es: "El factor de correccion bajo a 0.58 está semana. Que pasó? Necesito respuesta antes de las 14:00." No es maleducada -- es eficiente. Aprendes rápido que un "ok" de Carmen vale más que un parrafo de alabanzas de otro jefe.

### Ivan Romero -- Data Engineer Senior (tu mentor)

Ivan tiene 29 años y es el tipo más metódico que vas a conocer en tu carrera. Estudio informatica en la Politecnica de Madrid, hizo practicas en Telefonica (donde aprendió a odiar los sistemas legacy) y aterrizo en AdPulse hace 2 años. Es responsable de toda la infraestructura de datos: los pipelines de ingesta, el warehouse, los DAGs de Airflow y la calidad del dato.

Ivan vino de un mundo donde los datos estaban centralizados (un solo Oracle en Telefonica que tenía todo). En AdPulse descubrió el caos de multiples fuentes heterogeneas y se obsesiono con resolverlo de forma sistemática. Cada nuevo cliente que entra en AdPulse pasa por Ivan para el onboarding técnico: el define como se conectan las fuentes, donde se almacenan los datos y que checks de calidad se aplican.

Su mantra: "si no está en el repo, no existe". Todo lo documenta. Cada decisión técnica tiene un ADR (Architecture Decision Record) en Confluence. Cada pipeline tiene un README. Cada tabla tiene un schema definition. Es exigente en code reviews -- si tu variable se llama "df2" te la devuelve sin leer el resto. Pero su exigencia es constructiva: siempre te explica el POR QUE de la correccion.

Frase típica en code review: "Por que LEFT JOIN y no INNER? Piensa que pasa con campañas que existen en Google pero no en Meta. Si pierdes esas filas aquí, el totalizador de abajo no va a cuadrar con el CSV original."

### Raul Merino -- Analista Senior de Paid Media

Raul tiene 34 años y lleva 5 años en AdPulse. Es el tipo que conoce Google Ads y Meta Ads como la palma de su mano: sabe que un CTR del 3% en Search es bueno, que el CPM de Instagram Stories bajo un 12% el mes pasado, y que la ventana de atribución de Meta cambio de 28 a 7 días en 2021 y eso lo rompio todo. Vive en Tableau y Google Sheets. Tiene una Google Sheet que llama "mi biblia" -- es una tabla de mapeo manual donde conecta nombres de campañas entre plataformas.

El problema de Raul: no sabe SQL. Cuando necesita cruzar datos, exporta CSVs y los junta en Sheets con VLOOKUP. Eso funciona para 5 campañas pero no para 50. Sabe que necesita ayuda técnica y por eso está encantado de trabajar contigo. No tiene ego con lo técnico -- reconoce que no es su fuerte y te deja trabajar. "Yo te digo QUE datos necesita el cliente, tu me dices COMO sacarlos," es su forma de definir la colaboracion.

Frase típica: "Mira, la campaña se llama PharmaSpring_2024_Search en Google pero en Meta la pusieron como pharma_primavera_leads. Es un lio. Tengo un sheet donde las mapeo pero cada semana hay 3-4 nuevas que no están. Si puedes automatizar eso, te invito a cervezas."

### Ana Soler -- Marketing Director, PharmaLife (tu cliente)

Ana tiene 42 años y no trabaja en AdPulse -- es la clienta. Directora de Marketing en PharmaLife, una farmacéutica que vende suplementos y vitaminas online (DTC). Facturan 120M euros al año y destinan 24M a publicidad digital. Ana es responsable de esos 24M y tiene que justificar cada euro ante su CEO cada trimestre.

Personalidad: inteligente, impaciente, no tolera la ambiguedad. Cuando dice "necesito los números", los necesita EXACTOS, no aproximados. No entiende (ni quiere entender) la diferencia entre un LEFT JOIN y un INNER JOIN, pero detecta al instante cuando un número no tiene sentido. Su pregunta más temida: "No me importa cuantas impresiones hay. Cuantas ventas REALES me genero cada euro que inverti?"

Ana contrató a AdPulse hace 14 meses precisamente porque quería medicion real. Estaba harta de que su agencia anterior le mandara reports con métricas de vanidad (impresiones, alcance, engagement). Quiere euros. Solo euros.

### PharmaLife: tu primer cliente real

PharmaLife es una farmacéutica española que vende suplementos y vitaminas online con modelo DTC (direct to consumer). Fundada en 2015, creció explosivamente durante el COVID cuando todo el mundo empezó a preocuparse por su salud. Hoy factura 120M euros al año, tiene 450.000 clientes activos en su CRM (HubSpot) y opera principalmente en Espana, Portugal y Francia.

  • Presupuesto publicitario mensual: 2M EUR -- Google Ads 55% (1.1M), Meta Ads 35% (700K), Email 10% (200K)
  • Productos principales: suplementos deportivos, vitaminas premium, omega-3, proteinas, colageno
  • Modelo de venta: DTC via web propia (no Amazon, no farmacia fisica)
  • CRM: HubSpot con 450K contactos activos y tracking de touchpoints pre-compra
  • Objetivo de ROAS: 3x (por cada euro invertido, generar 3 en ventas)
  • Ticket medio: 90.48 EUR
  • Frecuencia de compra: 2.3 veces al año de media
  • Relacion con AdPulse: 14 meses, satisfechos con la gestion pero frustrados con la medicion

### El problema central: las tres verdades

El problema que vas a resolver está semana es el más comun y frustrante del marketing digital: la inflacion de atribución. PharmaLife invierte en 3 canales (Google Ads, Meta Ads, Email Marketing). Cada plataforma reporta sus propias conversiones. Pero cuando sumas las conversiones reportadas por las 3 plataformas, el total es MAYOR que las ventas reales en el CRM. Significativamente mayor.

1CONVERSIONES REPORTADAS POR PLATAFORMA (Enero 2024):
2-----------------------------------------------------
3Google Ads reporta: 2.340 conversiones
4Meta Ads reporta: 1.890 conversiones
5Email Marketing: 480 conversiones
6 -----
7TOTAL REPORTADO: 4.710 conversiones
8
9VENTAS REALES EN CRM (HubSpot):
10-----------------------------------------------------
11Ventas cerradas: 3.150 ventas
12
13DISCREPANCIA:
14-----------------------------------------------------
15Inflacion: 4.710 / 3.150 = 1.495x
16Porcentaje inflado: +49.5%
17
18La diferencia: 1.560 conversiones "fantasma"
19que las plataformas se atribuyen pero que
20NO existen como ventas reales.

El problema número 1 del marketing digital: la doble (y triple) atribución

Esto pasa porque un usuario puede ver un anuncio en Google, hacer click en un anuncio de Instagram y luego recibir un email promocional. Si compra, las 3 plataformas se atribuyen la conversión. Cada una dice "esa venta fue mia". Es como si 3 vendedores de una tienda se atribuyeran la misma venta: el que saludo al cliente, el que le enseñó el producto y el que le cobro. Los 3 dicen "sin mi no habria comprado".

La inflacion de atribución es un secreto a voces en AdTech. Todas las plataformas sobrereportan conversiones porque les conviene -- así el anunciante sigue gastando. Google tiene incentivo de decirte que Google funciona genial. Meta tiene incentivo de decirte que Meta funciona genial. Tu trabajó como data engineer no es juzgar -- es cuantificar la diferencia y dar visibilidad al cliente con datos reales del CRM.

### Lo que vas a construir está semana

  1. 01.Explorar las 3 fuentes de datos heterogeneas (CSV, JSON, CSV semanal) y documentar discrepancias
  2. 02.Disenar un esquema unificado y normalizar nombres de campañas entre plataformas
  3. 03.Calcular ROAS por canal -- el reportado por plataforma vs el real basado en CRM
  4. 04.Implementar un modelo de atribución multi-touch (lineal) para distribuir el credito justamente
  5. 05.Reconciliar conversiones de plataforma con ventas reales del CRM usando factores de correccion
  6. 06.Construir alertas de calidad para detectar campañas sin mapping y discrepancias anomalas
  7. 07.Presentar resultados al cliente (Ana) en el quarterly review del viernes
  8. 08.Automatizar todo en un pipeline semanal reproducible

### Tu primera mañana en AdPulse

Llegas al coworking de Chamberi a las 8:50. Tercer piso, techos altos, ladrillo visto, plantas en cada esquina. El espacio de AdPulse ocupa media planta: 40 puestos con monitores ultrawide, 3 salas de reuniones con nombre de métricas (sala "CTR", sala "ROAS", sala "CAC") y una cocina con maquina de cafe de las buenas. Carmen te recibe con un cafe ya preparado.

1Carmen Delgado [09:02]:
2Bienvenido. Tu primera semana va a ser intensa. Te voy a poner
3directamente en la cuenta de PharmaLife porque necesitamos resolver
4el tema de la atribución antes del quarterly review del viernes.
5Ivan te hace onboarding técnico hoy. Manana ya tocas datos.
6
7Una cosa: aquí no hacemos onboarding de 2 semanas leyendo docs.
8Aprendes haciendo. Si tienes dudas, Ivan. Si tienes dudas de
9negocio, Raul. Si necesitas una decisión, yo. No pierdas tiempo
10buscando información que alguien del equipo ya tiene.
11
12Ah, y bienvenido de verdad. Me alegra que aceptaras.

Carmen: directa, eficiente, cero ceremonia innecesaria

Ivan te sienta a su lado después del cafe. Tiene dos monitores con tmux abierto en uno y pgAdmin en el otro. Te explica el stack técnico mientras dibuja en un post-it:

  • Base de datos: PostgreSQL 15 en AWS RDS -- es el warehouse principal
  • Orquestacion: Apache Airflow 2.8 -- 34 DAGs activos, 12 por cliente
  • Ingesta: Scripts Python que tiran de APIs (Meta, Google) y procesan CSVs (email)
  • Transformacion: SQL puro en Airflow (SQLExecuteQueryOperator) + algo de Pandas
  • Visualizacion: Tableau Server -- cada cliente tiene su workspace
  • Repo: GitHub (adpulse-data) -- PRs obligatorios, CI con linting y tests basicos
  • Migracion en curso: moviendo de PostgreSQL a BigQuery (solo 2 clientes migrados)
  • Lenguajes: Python 3.11 + SQL para todo. Nada de Spark (no necesitan ese volumen)

Lo que hace difícil este caso NO es la complejidad técnica individual de cada fuente -- cada CSV es simple, el JSON de Meta tiene estructura clara. Lo difícil es que las 3 fuentes usan nombres diferentes para las mismas campañas, tienen granularidad temporal diferente (diaria vs semanal) y no comparten ningun ID comun. Unificarlas requiere mapping manual + logica de reconciliación + criterio de negocio.

### El stack técnico visual

Flujo de datos completo: 4 fuentes heterogeneas hacía un warehouse unificado

### Lo que ya sabes (y lo que vas a aprender)

Ivan te pregunta al final de la mañana: "Cuentame que hiciste en tus dos trabajos anteriores. Asi se por donde empiezo." Le explicas FreshMart (limpieza de CSVs, pipelines de ingesta, dashboards de ventas) y TaskFlow (eventos de Kafka, cohortes de retención, bugs de tracking). Ivan asiente: "Perfecto. Ya sabes mover datos y escribir SQL intermedio. Lo que te falta es trabajar con fuentes que se contradicen entre si. Eso es lo que hacemos aquí todos los días."

1Lo que ya dominas (de FreshMart + TaskFlow):
2 - Python + Pandas para limpieza y transformacion
3 - SQL intermedio: JOINs, CTEs, window functions
4 - Git + PRs + code review
5 - Comunicacion con stakeholders no técnicos
6 - Ingesta de datos desde multiples formatos (CSV, JSON)
7 - Diagnostico de problemas de calidad del dato
8
9Lo que vas a aprender en AdPulse:
10 - Unificacion de fuentes heterogeneas que NO comparten ID
11 - Mapping tables manuales y sus limitaciones
12 - Calculo de ROAS y métricas de marketing digital
13 - Modelos de atribución (last-click, lineal, time-decay)
14 - Reconciliacion de datos de plataforma con realidad (CRM)
15 - Comunicacion de hallazgos a un cliente EXTERNO (no interno)
16 - Alertas de discrepancia y detección de anomalias
17 - Automatizacion de reports recurrentes con Airflow

Tu progresion: de junior puro en FreshMart a junior-mid en AdPulse

En una agencia de marketing, el data engineer no solo mueve datos -- es el arbitro de la verdad. Cuando Google dice una cosa y Meta dice otra, tu pipeline decide cual es el número real. Esa responsabilidad es enorme: si te equivocas, el cliente toma decisiones de millones de euros con números incorrectos.

### El vocabulario que necesitas

AdTech tiene su propio lenguaje. Ivan te pasa un glosario que necesitas dominar para la semana:

  • Impression: el anuncio se mostró en pantalla (no implica que lo vieron activamente)
  • Click: el usuario hizo click en el anuncio (interes activo)
  • CTR (Click-Through Rate): clicks / impressions. Un CTR del 2% en Search es normal.
  • Conversion: una accion deseada (compra, registro, etc.). Cada plataforma define la suya.
  • CPA (Cost Per Acquisition): cuanto cuesta cada conversión. CPA = spend / conversions.
  • ROAS (Return On Ad Spend): revenue / spend. ROAS 3x = por cada euro, ganas 3.
  • Atribucion: decidir que canal "merece credito" por una venta que tuvo multiples touchpoints.
  • LTV (Lifetime Value): cuanto vale un cliente durante toda su relación con la marca.
  • DTC (Direct To Consumer): venta directa al consumidor sin intermediarios (farmacias, Amazon).
  • Retargeting: mostrar anuncios a gente que ya visito tu web (alto intent, alto overlap).
  • Overlap: cuando un usuario ve anuncios de multiples canales antes de comprar.
  • CAC (Customer Acquisition Cost): coste total de adquirir un cliente nuevo.

No memorices estas definiciones -- las vas a aprender usandolas durante la semana. Cuando veas "CTR" en una query, sabrás que es clicks/impressions. Cuando Ana diga "mi CPA es demasiado alto", sabrás que significa que cada conversión le cuesta mucho. El contexto hace que el vocabulario se grabe naturalmente.

### Tu setup técnico

Ivan te ha dado acceso a todo lo que necesitas para la semana:

  • GitHub: repositorio adpulse-data, branch feature/pharmalife-reconciliation
  • PostgreSQL: credenciales de la base de datos pharmalife_staging (lectura/escritura)
  • S3: bucket s3://adpulse-raw/pharmalife/ con los CSVs históricos
  • Slack: canales #canal-pharmalife (equipo interno) y #pharmalife-external (con Ana)
  • Confluence: espacio "PharmaLife" con la documentación del cliente
  • Airflow: acceso de lectura a los DAGs existentes para entender el patron
  • Datasets locales: los 4 archivos de enero descargados a tu maquina para explorar

Trabajarás con datos heterogéneos de PharmaLife (Google Ads, Meta, Email y CRM) durante toda la semana. Descárgalos primero desde el apartado de datasets del caso. Ivan te recomienda: "Trabaja en local con los CSVs descargados; cuando el pipeline funcione, lo conectamos a la base de datos y a S3. Así iteras más rápido sin depender de red ni credenciales."

volver a la visión del caso y descargar los datasets

## ejercicios

[01]

Calcular la discrepancia entre fuentes

Escribe una query SQL que calcule la inflacion de atribución total y por plataforma, comparando las conversiones reportadas con las ventas reales del CRM.

Cargando editor...
[02]

Identificar el impacto económico de la inflacion

Si Ana toma decisiones basandose en los números inflados de las plataformas, cuanto dinero está asignando incorrectamente? Calcula el impacto de decidir con datos malos.

Cargando editor...

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...