Power Marketing EPN
Roadmap macro · organizado por prioridad

Por dónde empezar

No es una cadena de pasos en fila: es un tablero de prioridades. La mayoría de las acciones no dependen de nada y se hacen ya, en paralelo; solo unas pocas tienen un candado (dice qué falta antes). Se alimenta solo: cada auditoría mensual deja caer lo nuevo en su banda.
El diagnóstico en una línea

EPN venía midiendo lo barato (hooks, guardados) y razonando lo caro (incrementalidad, margen, destino del clic). El roadmap pone primero la plata verificada sin candado (destopar B2B Marca 86×, sacarle a Natier lo que no convierte) y manda a medir lo caro antes de reasignar el resto.

El camino recorrido
0%
Organismo vivo. Lo tildado con candado verde es lo que ya está hecho y queda registrado en el cerebro: el equipo lo ve y toda sesión de Claude arranca sabiéndolo. Cuando la auditoría mensual encuentra algo nuevo, cae en su banda por prioridad — el roadmap crece, no se reescribe. Los pendientes los podés tildar acá para tu vista (queda en este navegador); para dejarlo oficial, avisame y lo registro.
El mapa de prioridades
Tareas de la semana · lo táctico que vence
Cargando tareas…
El principio que ordena todo
Regla 1
Prioridad = impacto × sin candado

Primero lo que da plata verificada y no depende de nada. La dependencia es una etiqueta del paso, no su lugar en una fila.

Regla 2
Medir no es un paso, es lo que desbloquea

Sin medición limpia, reasignar plata es a ciegas. Por eso los habilitadores corren en paralelo desde el día 1 y abren la banda 3.

Regla 3
Tapar el agujero antes de meter más agua

El mayor punto de pérdida está después del clic (carrito→checkout). Traer más tráfico a un balde agujereado es tirar plata.

Las bandas · tildá lo hecho
0
Banda 0 · prioridad

URGENTE

Vacía = buena señal. Acá cae SOLO lo que invalida trabajar en el resto del plan: datos rotos que contaminan toda decisión, la app/hub caída, un canal quemando plata sin control. Si hay algo acá, se resuelve antes de tocar cualquier otra banda.
1/4 pasos
Por qué esta prioridad: Un bloqueante no compite por prioridad con el resto: lo anula. Avanzar con la banda 1 mientras hay un incendio acá es construir sobre datos o infraestructura rotos. La llena la auditoría mensual o cualquier sesión que detecte uno.
Candado sobre escalar presupuestoDetectado en la auditoría CRO del front-end 08/07, con dato duro de la API de Tiendanube. Se abrió justo cuando el plan es escalar pauta fuerte — por eso es bloqueante: subir presupuesto sobre esto es tirar plata.
⛔ 77% del catálogo AGOTADO — no escales pauta hasta resolverlo
DATO DURO (API Tiendanube, 08/07): de 1.327 productos PUBLICADOS en la B2C solo 306 son comprables (23%); 1.021 están agotados (77%). En la B2B: 931/1.196 agotados (78%). Verificado (solo 5 productos con stock sin gestionar → el número es real, no artefacto; spot-check OK: Gentech creatina y Gold Whey comprables). Los agotados siguen PUBLICADOS → contaminan categorías, buscador y probablemente el feed de Merchant, así que PMax/Shopping puede estar pagando clicks a productos que no se pueden comprar. Escalar $28k/día (o más) sobre un catálogo 77% muerto es quemar plata. La REPOSICIÓN es de Comercial/Compras (no marketing), pero marketing tiene 3 candados ANTES de escalar: (1) EXCLUIR agotados del feed Merchant/Shopping ya; (2) mostrar in-stock primero (home/PLP por disponibilidad) + despublicar/ocultar los muertos; (3) back-in-stock→Klaviyo para cosechar la demanda que hoy rebota. Es el "no traer tráfico al funnel agujereado" cuantificado. Confirmar con Comercial el plan y la fecha de reposición: sin eso, el escalado de presupuesto queda en pausa. · RE-VERIFICADO 30/07 (misma API, mismo método): B2B 932 agotados de 1.201 publicados (78%, IGUAL que el 08/07) y B2C 1.137 de 1.339 (85%, EMPEORÓ desde 77%). Tres semanas y el número no se movió. Y ahora tiene costo medible del otro lado: el stock es el motivo #1 de las 37 devoluciones del win-back (~10 clientes lo nombran, incluido Shuk con $15,7M — "muchos quiebres de stock" fue su punto principal). JD informó el 30/07 que Comercial pasó a trabajar con STOCK DIRECTO DE FÁBRICA en la mayoría de las marcas a partir de acuerdos nuevos con proveedores: si eso es real, la capacidad existe pero la DISPONIBILIDAD PUBLICADA no lo refleja — nadie actualizó el catálogo. Pendiente concreto con Comercial: reflejar en Tiendanube lo que ya se puede traer de fábrica. Hasta que eso pase, no se le puede decir a un cliente "ya tenemos stock" porque entra a la web y ve lo contrario. · CUANTIFICADO EN ORGÁNICO 04/08 (cruce de las 768 fichas que rankean en Google Search Console contra el stock real de la API de Tiendanube — antes se sospechaba, ahora está medido): el 85% de las impresiones orgánicas de producto van a páginas de productos AGOTADOS (22.129 de 25.902), y esas convierten 2,7× peor — CTR 0,24% contra 0,64% de las que tienen stock. LAS DOS PÁGINAS MÁS VISIBLES DE EPN EN GOOGLE SON PRODUCTOS QUE NO SE PUEDEN COMPRAR: "Collagen Powder x 600g (Myvitamins)" con 10.971 impresiones en posición 5,3 y CERO clicks (es el 42% de TODA la visibilidad orgánica B2C, una sola ficha), y "Creatine Monohydrate x 300 gr (Gold Nutrition)" con 2.199 y cero clicks. Siguen: Creatina Micronizada CREAPURE de ENA (649 imp, agotada) y Magnesio Bisglicinato Natier (323 imp, agotado — el mismo que ya figura en b2c-stock-marcas-demandadas). ESTO EXPLICA EL CTR GLOBAL DE 0,33%: el CTR está 17× por debajo de lo esperado incluso en POSICIÓN 1-2 (1,17% real contra ~20% esperado), o sea que no es un problema de ranking ni de título/meta (ejecutados el 07/07 sobre 115/115 categorías y 1.448/1.465 productos) — es qué ve el usuario cuando aparecemos. CONSECUENCIA DIRECTA SOBRE EL ÁRBOL NUEVO (cat-arbol-granular-vitaminas): de las 18 categorías propuestas, 4 nacerían VACÍAS (Vitamina A, Potasio, Creatina micronizada, Creapure: cero productos con stock) y 9 nacerían casi vacías con 1-2. El caso extremo es Creatina monohidrato — 47 productos, 675 impresiones de demanda medida y UN SOLO producto con stock; Creatina micronizada tiene 452 impresiones de demanda y CERO. Solo 8 nacen con góndola real (Whey concentrada 19 con stock · Magnesio 12 · Zinc 5 · ZMA 4 · Whey aislada 4 · Vitamina D 3 · Vitamina K 3 · BCAA 3). Por eso el árbol se crea igual (es aditivo y gana antigüedad SEO) pero la metadata fina, los links desde pauta/mails y el lugar en el menú van SOLO a las 8 vivas, y el listado de cada categoría se ordena por disponibilidad. Doc: 4-Canales/Tiendanube/auditoria-arbol-categorias-2026-08-04.md §10-11.
MáximoGlobal
La caja de la pautaDetectado 12/07 en la sesión del Keyword Planner (banner de Ads) y VERIFICADO por API (account_budget).
🚨 El presupuesto de CUENTA de Google Ads se agota en ~2-3 días
La cuenta corre con presupuestos PREPAGOS (facturación a nombre "ALFANO GABRIEL FERNANDO"). El vigente (29/06, sin fecha fin) es de $700.000 y al 12/07 lleva $505.591 gastados (72,2%): quedan ~$194k, ≈2-3 días al ritmo actual (~$80-90k/día entre Brand B2B $30k + PMax B2C $28k + Brand B2C + Promarine + Search Marcas $8k). Si se agota, TODA la pauta de Google se corta de golpe — incluida la mina B2B 86×. Historial de recargas: $1M (feb), $3M (feb-jun), $700k (jun). ACCIÓN (JD/pagador, no automatizable): ampliar el presupuesto de cuenta en Facturación → Presupuestos, idealmente dimensionado al plan del mes (~$2,7-3M/mes al ritmo actual + campañas nuevas por encender). Verificación API: _Sistema/analisis-google/keyword_planner_20260710.json (alerta_lateral).
MáximoGlobal
Candado sobre el motor de win-backVerificado 30/07 contra la casilla jsagasti@ (inbox + enviados desde el 01/07): 37 dormidos respondieron el mail personal de JD y a NINGUNO se le contestó por mail. Mientras tanto el sender sigue preguntando ~200/día.
⛔ 37 clientes respondieron el rescate y NADIE les contestó — frená de preguntar hasta contestar
DATO DURO (Graph, casilla jsagasti@, verificado 30/07): 37 dormidos contestaron el mail "¿qué podemos hacer mejor?" y a los 37 solo les salió el win-back original — cero respuestas nuestras por mail. El más viejo espera desde el 07/07 (23 días). Lo que Sebas o Nacho hayan contestado por WhatsApp no queda registrado en ningún lado auditable, que es parte del problema. Por qué es bloqueante del motor y no un pendiente más: el mail PROMETE textualmente "lo que esté a nuestro alcance —precios, stock, envíos, condiciones— estamos dispuestos a verlo y a mejorártelo", y el sender sigue mandando ~200/día. Cada día que sigue preguntando sin contestar convierte una iniciativa de recuperación en evidencia de que no escuchamos — con los clientes que MENOS margen de error nos dan. Ya pasó en vivo: Patricio Hankin ($1,7M) esperó 20 min en la videollamada que le agendamos, nadie apareció ni le contestó el WhatsApp, escribió "es una falta de respeto total" el 13/07 y sigue sin respuesta. Augusto Rettori le escribió DOS veces al contacto que le pasamos y nunca le contestaron. ACCIÓN: los 37 mails ya están redactados y esperan revisión de JD en 2-Iniciativas/Winback-Mayorista/RESPUESTAS-DEVOLUCIONES-2026-07-30.md (firma JD, salen de jsagasti@ en el hilo de cada cliente; 6 huecos que solo JD puede llenar). Candado real: no subir el ritmo del sender hasta que la cola de respuestas esté en cero, y montar el circuito de "toda respuesta se contesta en 48 h" antes de seguir escalando el volumen. · AVANCE 30/07: (1) el tab 📥 Respondieron del CRM pasó de 16 a los 37 curados (orden de contacto, motivo, palanca y qué hacer por cliente) y las tarjetas de motivo ahora se calculan solas — antes estaban hardcodeadas en los conteos de las primeras 14; (2) JD le pidió a Nacho por Teams (chat 1:1, 08:44 ART) que marque en ese tab el estado de cada uno y deje una línea en Notas de lo que ya habló, porque eso cambia el contenido de cada mail. Los 37 mails salen recién con esa info + la definición del claim de stock. Motivo #1 real de las 37 devoluciones: STOCK (11 casos), por encima de precio (9) — ver el candado de catálogo agotado en esta misma banda.
MáximoB2B
Infraestructura de automatización (GitHub Actions)Detectado 17/07: la cuota Free de GitHub Actions (2.000 min/mes por CUENTA) se agotó el día 14 del ciclo y TODOS los crons quedaron caídos (winback sender/devoluciones, CRM daily, refresh del hub, sync Klaviyo de EPINN). Dieta de minutos aplicada y pusheada el mismo día en los 2 repos.
GitHub Actions: cuota agotada 14/07 → budget + dieta + fase 2 verificada (resuelto 17/07)
CERRADO 17/07: JD habilitó el budget de Actions (~$9-14/mes de overage esperado) y el sistema REVIVIÓ (devoluciones capturó las respuestas de los 2,5 días caídos; sync EPINN, cupones, refresh y cross-canal re-disparados). La auditoría de ingeniería con timing REAL de los runs encontró los devoradores verdaderos (distintos de los estimados): winback_live bajaba 400 días de órdenes cada 2 h dentro del refresh (12,5 de sus 14,6 min, ~3.000 min/mes él solo) → ahora INCREMENTAL con estado en actions/cache + re-pull full 1×/día que corrige canceladas — VERIFICADO salida idéntica (1.200 cuentas, 0 diferencias). b2b_kpis_reales y cac_ltv bajaban la MISMA data 365d por separado → tn_orders_cache.py compartido — VERIFICADO idéntico (437 claves, 0 diferencias). Sender: GAP entre mails 18→10 s (mismo perfil de corrida probado) y cron partido: MANTENIMIENTO 1×/día 09:07 ART permanente + línea TRANSITORIO horaria que liquida el backlog (dry 17/07: 194 pendientes ≈ 1 día) → ⚠️ PENDIENTE CHICO: borrar la línea TRANSITORIO de winback-sender.yml cuando el dry dé cola 0 (deja el sender en ~90 min/mes). EPINN auditado por dentro: el fetch full (34 min) es volumen que pide el DataProcessor, sin sleeps evitables — nada seguro que tocar hoy (el catálogo 2×/semana de ayer ya ahorra ~590/mes). CONSUMO: ~9.100 min/mes medidos pre-optimización → ~3.800 (backlog vivo) → ~3.100 al borrar el transitorio. Sigue >2.000: el budget cubre la diferencia. FASE 3 opcional para volver a GRATIS: sync EPINN incremental de verdad (diseñar con Juanan — estampa perfiles reales de Klaviyo, no es un patch) o runner self-hosted en máquina siempre prendida. Commits: 5ad504b + 6791dab cerebro / 9a05e20 EPINN. AUDIT MULTI-AGENTE 17/07 (24 agentes, verificación adversaria): confirmó idénticos mis cambios y cazó lo que la muestra manual no vio → (a) el timeout estaba en 11 de 13 workflows, no en los 13: agregado a checkpoint-pauta-b2b + reporte-remarketing (14768a8); (b) cupones EPINN sin cache:pip → agregado (4df7c47); (c) git push pelado en cross-canal/sync-metricas/reporte-semanal → rebase-retry (6a23b52, tras un fallo real en vivo). VERDAD DE LOS NÚMEROS: con TODO lo seguro el sistema queda ~3.600-3.850 min/mes = sigue ~1.700 arriba de 2.000; no hay forma honesta de cerrar el gap solo con lo seguro. Palanca LIMPIA nueva: hacer PÚBLICO el repo EPINN (si no expone secretos/PII → minutos ilimitados gratis, saca ~1.550/mes de lo facturado) — validación de Juanan. Lección: lessons-learned/2026-07-17-infraestructura-gratis-tiene-techo.md.
MáximoGlobal hecho
1
Banda 1 · prioridad

Hacé ya

Lo que la data banca hoy y no depende de nada. Ordenado por impacto × facilidad. Distintos dueños pueden correrlo en paralelo esta semana.
22/66 pasos
Por qué esta prioridad: Ninguno de estos pasos necesita medición perfecta ni ningún arreglo previo: recuperan o suben plata YA. Es donde empieza el mes.
Voz del dormido · respondieron el win-backRe-consolidado 30/07: ya son 37 los dormidos que respondieron el mail personal de JD ($86,6M de facturación histórica juntos). Curaduría operativa en el CRM (clientes/ → tab 📥 Respondieron); textual en 1-Estrategia/voz-cliente/winback-devoluciones-dormidos.md; respuestas redactadas en 2-Iniciativas/Winback-Mayorista/RESPUESTAS-DEVOLUCIONES-2026-07-30.md.
📥 Contestar y trabajar a los 37 dormidos que respondieron
$86,6M de facturación histórica juntan los 37 (verificado 30/07). Los 37 mails de respuesta ya están redactados para revisión de JD. Urgencias operativas: Diego Díaz pidió la LISTA MAYORISTA el 10/07 y nadie se la mandó (20 días); Carolina Portela ($2,3M) pidió coordinar llamada "el lunes" el 17/07 y pasaron dos; Augusto Rettori pide la escala de descuentos por volumen y dice que va a comprar; Santiago García tiene el carrito armado (29/07); Simon Ibarra pide disponibilidad de bisglicinato Natier + geles Nutremax y el costo de envío a Carlos Casares; Johanna Neumann pregunta derecho si ya hay stock. Los grandes por valor: Shuk ($15,7M, 3 fricciones concretas), Cristian Debiassi ($8,6M, Star), Mariana De la Colina ($5,6M, esperando reposición), Héctor Glaser ($5,4M), Grit ($4,8M, financiación). Oportunidad no obvia: Sebastián Aguilar ($2,8M) organiza eventos de ciclismo y running y necesita kits de corredor — se cotiza como kit, no producto por producto. Asignar responsable en el CRM y marcar estado.
MáximoB2B
🔧 6 fallas de atención concretas que salieron del rescate — el diagnóstico del 13/07 quedó viejo
CORRECCIÓN de criterio: la síntesis del 13/07 (14 respuestas) concluyó "se van por el número, no por el vínculo: 0 quejas de atención y 6 elogios espontáneos". Con 37 respuestas eso ya NO se sostiene — la segunda tanda trajo 6 fallas de servicio duras y verificables, todas con nombre: (1) Patricio Hankin ($1,7M) esperó 20 min en la videollamada que le agendamos, nadie apareció ni le contestó el WhatsApp de Sebastián → "falta de respeto total"; (2) Augusto Rettori ($2,1M) le escribió DOS veces al contacto que le pasamos y nunca le contestaron — dice que ESE es el motivo por el que se había ido; (3) Daniela Gimeno compró por error en la web minorista, ofreció comprar por un monto MAYOR para arreglarlo tomando esa compra a cuenta, y no le dimos solución → "perdí tiempo y plata"; (4) Lucas Holgado: mercadería en mal estado y nadie se responsabilizó; (5) Lisandro Tacca: compró cajas cerradas para revender y le llegaron unidades sueltas; (6) Maximiliano Margaruccio: demoras de entrega + envío pago cuando otros mayoristas lo dan gratis y en el día. Los tres primeros son fallas del PROCESO de recuperación en sí (agendamos y no atendimos, pasamos un contacto que no responde) — el motor de win-back se está comiendo su propio resultado. ACCIÓN: dueño y SLA para el WhatsApp de Atención al Cliente, y regla de que toda reunión agendada por Bookings tiene staff confirmado. El criterio corregido va a CRITERIO-MACRO.
AltoB2B
Pricing Star/One Fit: contraoferta con los números de la competencia en mano
Voz-cliente con evidencia DURA (2 clientes, sin preguntarles el precio): distribuidores de Chaco venden creatina Star DoyPack a $19.100 y whey One Fit a $26.200 — brechas de hasta $5.000/u contra nuestra lista. Star ya había aparecido en la respuesta #1 (Cristian: "diferencia apreciable con otros distribuidores"). Dato clave: Yanet NOTÓ la mejora reciente de lista en Star ("vi que mejoraron el precio, está bueno") → el mercado registra los movimientos rápido. Acción de Comercial: cruzar costo vs esos precios y definir si se iguala en las 2-3 referencias de mayor rotación (no toda la lista). Marketing ya tiene a quién comunicárselo: los dormidos que se fueron por esto.
AltoB2B
Definir política de condiciones de pago B2B — la competencia financia y nosotros no
Motivo NUEVO que emergió en las devoluciones (3 de 14, ~$14,5M juntos): la competencia toma echeq a 30 días sin recargo y tarjeta (Shuk), deja retirar y pagar a 7-15 días (Grit), y el cliente chico pide plan de pagos semanal para rearmar la rueda (NYU Esport). En un contexto de rotación lenta, el capital de trabajo pesa más que el descuento. Decisión de Comercial/JD (riesgo crediticio), no de marketing — pero define si estos 3 vuelven y cuántos más no se van. Opción piloto: límite chico a clientes con historial (los 3 tienen 2+ años o compras grandes).
AltoB2B
Base viva de dormidos · no mailear a quien ya compróHallazgo 14/07 medido en vivo contra Tiendanube: el sender NO trabajaba sobre una lista congelada (re-consulta en cada corrida). La causa real de los "pero si acabo de comprar" son las CUENTAS DUPLICADAS: 39 dormidos con una cuenta gemela activa, 119 con cuenta duplicada en total. Aparte, la base VISUAL del CRM estaba congelada desde el 29/06.
Compuerta "¿despertó?" en el sender + corte por estado del CRM
✅ DEPLOYADO 14/07: antes de cada envío, el sender revisa la cola contra órdenes válidas frescas y saca a quien compró hace ≤60d por su cuenta O por una cuenta gemela (match por teléfono) — mata el mail a quien ya volvió a comprar. Además corta a quien el equipo ya trabajó en el CRM (estado ≠ "Sin contactar"), para no cruzar el discurso del vendedor con el mail automático de JD. Si no puede leer las órdenes (error de API), aborta la corrida en vez de mailear a ciegas. Verificado en seco: 8 despertaron + 2 ya trabajados, sacados de la cola de hoy. Cambios en _Sistema/Scripts/winback_sender.py.
MáximoB2B hecho
El CRM ahora es la base B2B COMPLETA (8,4k) — vista "Toda la base" + export a Kommo
✅ HECHO 15/07 (deployado, pedido de JD): el ciclo de vida dejó de ser solo dormidos y pasó a ser la base de datos mayorista entera (tn_build_base_completa.py: padrón + historia). Solapa "Toda la base", cortes por Zona (CABA/GBA/interior/Sin dato), ciclo y provincia, y botón Exportar CSV (respeta filtros, formato Kommo). Tope de render 1500 (export usa el set completo). 🔎 Del corte salió un HALLAZGO de higiene: los "~6.900 que nunca compraron" eran casi todos un import B2C del 06/07 (ver crm-limpiar-import-b2c-06jul). Ya excluido → base limpia = 2.392 B2B reales (1.212 compraron + 1.180 leads de newsletter). Detalle en memoria project_crm_base_completa_b2b.
AltoB2B hecho
🚩 Limpiar de la tienda MAYORISTA el import B2C del 06/07 (5.880 altas, 74% consumidores finales)
Al abrir la base completa (15/07) apareció que los "~6.900 que nunca compraron" eran casi todos UN import: 5.880 altas el mismo día 06/07/2026 (5.880 mails pelados, sin teléfono/empresa/domicilio). CRUCE contra la tienda B2C: 74% (4.356) ya son clientes de la minorista → es una LISTA B2C cargada por error en la tienda mayorista = contaminación B2B/B2C. Ya lo saqué del CRM (IMPORTS_EXCLUIDOS en tn_build_base_completa.py) → base limpia = 2.392 B2B reales. PENDIENTE (acción manual de JD en Tiendanube, no lo toca el cerebro): borrar/mover ese lote del padrón mayorista. Lista de los 4.356 duplicados confirmados en _Sistema/Scripts/_borrar_import_b2c_06jul.csv. Los otros 1.521 del lote (no están en B2C) revisar antes de borrar. Aparte: ver por qué entró (¿popup/form de la mayorista captando consumidores? ¿import a la tienda equivocada?).
AltoB2B
✅ "Recuperado" pasó a ser automático — aparecieron 74 cuentas por $155,9M que el reporte contaba como 0
✅ HECHO 03/08 (pedido de JD: "Estado Recuperado debe ser automático, hoy el reporte marca 0 y varios recuperados volvieron"). El estado dependía de que el vendedor tildara el combo, así que medía memoria del equipo, no realidad. Ahora lo deriva crm_recuperados_auto.py de la recompra real en Tiendanube: cuenta que estuvo +60 días sin comprar (el mismo corte con el que el tablero dice "Dormido") y volvió. Resultado: 74 recuperadas, $155,9M de facturación histórica, 46 CON contacto previo del equipo o del win-back y 28 que volvieron solas — la primera medición de que el win-back mueve la aguja. Quedaron marcadas en el CRM firmadas "auto · recompra" (72 escritas + 4 que ya estaban a mano). Dos trampas resueltas que valen para cualquier métrica derivada: (1) el ancla —desde qué fecha una compra cuenta como recuperación— se congela en _crm_recuperados.json, porque cada rebuild de la base la corría hacia adelante y borraba la evidencia (con el corte fresco se veían 5 en vez de 23); (2) el detector no puede leer su propia marca como señal de contacto o se atribuye todo (daba 74/74). De paso salió que clientes/_live.json estaba 20 días congelado en el repo: se generaba y solo se publicaba en Vercel, nunca se commiteaba.
AltoB2B hecho
Trabajar los 74 recuperados: la recompra abre la ventana, no la cierra
De las 74 recuperadas, **63 no tienen responsable** ($108,5M de facturación histórica): nadie del equipo las había tomado nunca (estaban en "Sin contactar"), volvieron igual y el sistema las marcó, pero no hay una persona atrás. El sistema marca el hecho; el seguimiento no lo puede hacer. ACCIÓN: repartirlas en el CRM (tab Clientes, filtro Estado = Recuperado → asignar responsable). El reporte diario avisa solo a los 7 días de detectada cada una. · MEDIDO 03/08 contra Tiendanube, cuánto valió la vuelta: entraron **$36.083.580 de compra nueva** — $24,5M de las 46 con contacto ($532k/cuenta) y $11,6M de las 28 que volvieron solas ($415k/cuenta). No es una comparación limpia (a las 46 las elegimos nosotros, no salieron por sorteo), pero es lo más cerca que estamos de medir si el win-back sirve; repetir el corte a 60 días con las que vuelvan a comprar lo convierte en un número defendible. · A las 28 espontáneas NO hay que llamarlas: 22 volvieron con un ticket igual o MAYOR al histórico (Nelson Temudio 1,7×, Rosacher 1,5×) — ya volvieron a su volumen, un llamado no agrega y con la web 78% agotada es más riesgo que beneficio. Las 6 que volvieron CHICO (<70% de su ticket) sí ameritan un toque: están tanteando y ese pedido es frágil. · ⏸️ PARADO POR JD el 03/08 ("dejámelo como pendiente, necesito resolver sólo lo urgente"). No requiere nada urgente: las correcciones del reporte ya corren solas. Retomar cuando haya aire. · DATO NUEVO que justifica el paso, medido sobre 471 recuperaciones históricas de la base B2B (antes de esta campaña): después de recuperarse, una cuenta vuelve a comprar dentro de 60 días solo el **37%** de las veces, contra **84%** de una compra normal en ciclo — o sea **63% se vuelve a dormir** y se cae **4× más seguido** que una cuenta sana. Recuperado es el estado MÁS FRÁGIL de la base, no el más resuelto: es un cliente probando, no un cliente. Aplicado a las 74 de ahora, ~47 se vuelven a dormir antes de octubre si nadie las toca. Lo que NO está probado es que poner dueño mueva ese 63% — nadie lo midió nunca acá. Forma limpia de saberlo cuando se retome: partir las 63 huérfanas al medio (mitad con responsable asignado, mitad sin tocar) y comparar a 60 días; sale gratis y deja el número real de cuánto vale un vendedor encima de una cuenta recuperada.
AltoB2B
Fusión de cuentas duplicadas + "Combinar" en el CRM + estado + refresco vivo
✅ HECHO 14/07 (todo deployado): (1) FUSIÓN TOTAL — winback_identidad.py agrupa por teléfono y colapsa cada grupo en un líder con gasto/compras/última compra SUMADOS; el dossier lista "las cuentas de este cliente" y la tabla marca "🔗 N cuentas" (46 clientes fusionados, 47 cuentas absorbidas). (2) Botón "Combinar con…" en el dossier para unir a mano lo que el auto no agarra (guardado en crm_leads con lead_id sintético merge::M::L, sin tabla nueva — anon key alcanza). (3) Estado "No Trabaja Con Suplementos". (4) REFRESCO VIVO sin PII: winback_live.py genera clientes/_live.json (id→última compra+dormido, sin nombres) en refresh-dashboards (cada 2h) y el tablero lo superpone → el ciclo de vida deja de congelarse (760 del 29/06 → 742 vivos). Los "solo nombre" NO se auto-fusionan (homónimos): van por el botón Combinar.
AltoB2B hecho
Destopar lo comprobadoRetorno probado, hoy frenado. Subir sin arriesgar.
Google B2B Marca: destopá la mina (86×)
✅ PASO A HECHO (06/07): puja → “Maximizar valor” + budget $10k→$18k/día. FALTA Paso B (~7d, si el CAC aguanta): $18k→$25-30k + sitelinks propios al subdominio mayorista + RSA con ángulo revendedor. Le aparecés a 3 de cada 10 que te buscan por nombre (IS 30%): perdés 46% por ranking + 18% por presupuesto.
MáximoB2B hecho
Sacale a Natier lo que no convierte → Gold + Nutremax
Natier se lleva el 25% del presupuesto de marca B2B y trae solo el 1,5% de la venta real (cruce cross-canal). Reasignar ese presupuesto a Gold Nutrition y Nutremax, que sí mueven. NUEVO en la auditoría de julio: la data lo volvió una jugada concreta y verificada, sin candado.
AltoB2B hecho
Google B2C Marca: sacá las genéricas a campaña aparte
21% del gasto de la marca se fuga a términos genéricos mezclados ahí. Mezclar cosecha con prospección hace que el algoritmo alimente la marca infinito.
MedioB2C
Optimización Google B2B (auditoría 06/07)Auditoría exhaustiva verificada en vivo (16 agentes). Doc: 7-Datos-Reportes/mensuales/2026-07-06-auditoria-b2b-google.md. Hallazgo estructural: solo 2 campañas activas, todo el motor de prospección B2B está pausado desde 03/2026 (agencia "Bakian") — una mina ya construida.
Blindá la puja de la Marca B2B al goal "Compra Mayorista"
La campaña destopada (23140531348) puja sobre el goal DEFAULT de cuenta (PURCHASE~WEBSITE, incluye compra B2C), NO sobre el custom goal "Compra Mayorista (solo B2B)" 6458127351 que existe desde el 25/06. Hoy sin contaminación activa (preventivo), pero cualquier cambio de GTM desviaría la puja a B2C sobre $18k/día. Es el PRIMER DOMINÓ: destraba también reactivar Search Marcas y el OCI B2B-limpio. ✅ MECANISMO RESUELTO Y PROBADO 2 VECES (09-10/07): mutate a conversionGoalCampaignConfigs/{campaign_id} con {"goalConfigLevel":"CAMPAIGN","customConversionGoal":…} + updateMask "goal_config_level,custom_conversion_goal" — funcionó al crear la Search Marcas B2C (24013445742, goal B2C) y la Dietéticas B2B (24025982041, goal Mayorista). Solo falta APLICARLO a la campaña viva: probar primero sobre la Search Marcas B2B PAUSADA (23138383148) por prolijidad y después a la Brand de $18k/día. Patrón en google_crear_dieteticas_b2b.py paso 4.
MáximoB2B hecho
Cortá la fuga de sitelinks B2B→B2C (~$60k/mes)
3 sitelinks de la campaña mayorista mandan al revendedor a la tienda de CONSUMIDOR (epnstore.com.ar): 259 clicks/30d mal ruteados. Están compartidos con la B2C (removerlos de la B2B no la toca). Reemplazar por sitelinks propios al subdominio mayoristas.epnstore.com.ar. Reversible, downside puro.
AltoB2B hecho
Negativizá el no-brand que sangra a 0× (~$90-120k/mes)
Términos genéricos sin conversión que se queman bajo break-even, agravado por el destope. CONSERVAR los no-brand productivos ($98k/90d a 43,6×: "mayorista suplementos deportivos", "distribuidora de suplementos"). Corte quirúrgico. Candado: va ANTES de reactivar Search Marcas (si no, se duplica el sangrado).
AltoB2B hecho
Extensiones B2B propias (callouts + snippet de marcas)
Hoy 1 callout + 1 snippet, compartidos con B2C en lenguaje de consumidor. Sumar callouts mayoristas (Precios Mayoristas, Compra Mínima, Cuenta Corriente, Envío Nacional) + snippet "Marcas" (Star, Gold, ENA, Gentech). Aditivo, mejora Ad Rank sobre el rank-lost 46%.
MedioB2B hecho
Dietéticas: campaña CREADA y verificada — falta el OK del budget para encender
✅ EJECUTADO 10/07 (OK de JD al armado): campaña "Mayorista_Perf_GS_Search-Dieteticas_Purchase_AO" (24025982041) creada por API y verificada — 11 keywords PHRASE de la familia dietética, RSA "proveedor de dietéticas" (surtido amplio salud/bienestar), goal Compra Mayorista scopeado, geo AR, negativas (epn/empleo/cursos/informacionales), $6.000/día propio. QUEDA PAUSED: encender = OK de JD del budget (~$180k/mes de plata nueva). El porqué: el revendedor se busca como DIETÉTICA ("dietetica mayorista" 1.000 búsq/mes = el término más grande del universo B2B, capturamos <1%; familia ~2.900/mes al <1-5%) mientras "suplementos por mayor" ya se captura al 57-75%. Fondo de embudo, CPC top ~$200-620, long-tail geo cubierta por PHRASE. ⚠️ Encender DESPUÉS de recargar el presupuesto de cuenta (banda 0). Script: google_crear_dieteticas_b2b.py · datos: keyword_planner_20260710.json.
AltoB2B
Reactivá "Mayorista - Search Marcas" (la joya dormida)
Campaña 23138383148 pausada 03/2026: budget-lost histórico 34,9% (demanda comprobada), ROAS last-click 3,64× (casi break-even), 7 anuncios ya armados, 0 overlap con la activa. Budget $12-15k/día. Proyección 5-7× ≈ $750k-1,1M/mes de contribución. Plata nueva (~$360k/mes) → OK de JD del budget.
MáximoB2B Poner las negativas (ggl-b2b-negativas-sangria) + scopearla a Compra Mayorista antes (arrastra $759k de compra B2C) hecho
Campaña no-brand propia (el ~75% del gasto ya es no-brand)
El no-brand ya captura $4,39M/90d a 11,2× SIN campaña ni landing propia. Separarlo (MAX_VALUE + tROAS~5) con ad groups Marcas-Distribuidas + Conquista-Competidores. Semilla gratis: 187 keywords EXACT ya cargados en $0 en el ad group "GA - Marca". Budget $150-200k/mes.
MáximoB2B Landing de captación (ggl-b2b-landing-captacion) + idealmente OCI midiendo (med-oci-google-b2b)
Landing de captación mayorista (alta + lista de precios)
mayoristas.epnstore.com.ar con formulario de alta + catálogo + lista de precios. ~$200k/90d de genéricos convierten 0 HOY no por keyword malo sino por falta de landing. Candado de la campaña no-brand.
AltoB2B
Test de incrementalidad de la marca B2B (geo-experiment)
Apagar la puja de marca en medio país 21-28d para medir cuánto del 86× es incremental vs recompra que migra gratis al orgánico. Define el destino de ~$44k/mes de marca pura. new-vs-returning da 100% UNKNOWN en Ads → no es auditable sin experimento.
AltoB2B Después de limpiar la marca (negativas) y con el no-brand ya capturando
Descartá las campañas mayoristas muertas
"Competencia" (0 conv de por vida, $1,5M quemados 2024), "Multimarca-Nacional" ($187k→2 compras B2C), las 2 de Neuquén (0-2 conv, CPC 2-3×). Dejar pausadas/removidas. No reactivar = no tirar plata.
MedioB2B
Demanda por objetivo · Keyword Planner 10-12/07Criterio nuevo de JD (al CRITERIO-MACRO): la demanda se audita por OBJETIVO del consumidor, no solo por producto/marca — revela categorías invisibles. 6 tandas corridas (48k ideas), doc: 7-Datos-Reportes/mensuales/2026-07-10-auditoria-keyword-planner.md.
Quemadores: ~11k búsq/mes de una categoría que no existe en la cuenta
La familia "quemador de grasa" (quemador 6.600 + natural 1.600 + pastillas ~960 + abdominal/gym/té/mujer) ronda 11.000 búsq/mes y NO aparecía en ninguna búsqueda por producto: el consumidor dice "quemador", el producto se llama "termogénico" (590). Cero cobertura hoy. ENA tiene quemador ("ena quemador de grasa" 260, +24% en 3m) — hay surtido distribuido. Paso: (1) verificar surtido+stock de termogénicos por API TN (ENA, ¿Star? ¿Gentech?); (2) categoría/landing "Quemadores" en la B2C; (3) ad group con el lenguaje del consumidor. Ángulo MUJER primero: "quemador de grasa para mujer" +425%. CPC top $300-460 vs $600 del genérico bajar-de-peso.
AltoB2C
Electrolitos + geles: ~19k búsq/mes creciendo +23-100% y EPN tiene el surtido exacto
El runner/ciclista busca el PRODUCTO, no el objetivo: "electrolitos" 9.900 (+23%, CPC top $1.624 = el más caro de toda la auditoría, señal de valor comercial) + "sales de hidratacion" 5.400 (+22%) + familia geles ~3.700 TODA creciendo fuerte (geles energeticos +39%, gel energetico +49%, geles deportivos +85%, geles con cafeina +100%, electrolitos naturales +125%). Las marcas premium (Maurten/SIS/GU) mueven ~10 búsq/mes: demanda GENÉRICA sin dueño → la captura quien puje. EPN distribuye el surtido exacto: SUMA (electrolitos sin azúcar), Nutremax (Energy Gel/Hydromax/Pro Salts), Mervick (geles Race), Enargy gel ENA (720/mes propio). Hoy 0 puja en todo esto. Paso: verificar stock → ad group "Hidratación y Geles" a categoría con stock; el copy conecta con el calendario running (maratones/temporada). Sinergia con el lanzamiento SUMA (banda 1 grupo Lanzamientos).
AltoB2C
Cortar la sangríaPlata que ya sabés que se pierde. Recupera YA.
Promarine: apuntá los anuncios a la ficha real
Hoy van a /health-care/?mpage=3 (categoría, pág. 3). “promarine antioxidants” gastó $112k con 0 ventas — y Promarine es de lo que MÁS factura en B2C. La campaña tira a la basura un producto que vende.
MáximoPromarine
Promarine: puja “clics” → “conversiones”
Mientras pague por visitas, compra clics que no venden.
MáximoPromarine
Cortá la campaña Meta Salud-Bienestar (0,9×) → $0
Esta campaña puntual pierde plata: por cada $1 vuelven $0,90, debajo del break-even. Es un recorte quirúrgico de UNA campaña perdedora — NO “Meta es malo” (el CR bajo general de Meta está contaminado por la medición rota; eso se decide con el test de la banda 3).
AltoB2C
Pausá Meta WhatsApp engagement hasta que mida
No invertir a ciegas. Se reactiva cuando Kommo esté midiendo (banda 2).
AltoB2B
Sacá el copy cruzado entre segmentos
El grupo mayorista dentro de la B2C y el minorista dentro de la B2B. Corregir los final URLs cruzados.
MedioGlobal
Negativá términos basura (~$969k)
Competidores que EPN no distribuye (optimum, myprotein, gatorade…). Star/ENA/Nutremax NO se bloquean.
MedioGlobal
Revisá el gasto en la marca del competidor (morashop)
La campaña Mayorista paga $21k/90d por el término "morashop mayorista" (el nombre del competidor líder). Confirmar con Mateo si es conquesting deliberado (rinde) o fuga; si no convierte, negativar. Detectado en la auditoría SEO+GEO B2B (01/07).
MedioB2B hecho
Google full-tuneup · auditoría integral 09/07Auditoría 24 agentes con verificación adversarial (18 hallazgos confirmados, 2 refutados). APLICADO EL MISMO DÍA: 33 sitelinks 404 reparados · ruteo marca-mayorista Brand→Marcas (12 negativas EXACT, candado anti-convertidor) · budget Brand B2B $22k→$30k (perdía 16% IS por presupuesto a ROAS 64,7) · PAE sin Display/Partners · geo BA→Argentina (PMax + Marcas B2B) · CREADA Minorista_Perf_GS_Search-Marcas_Purchase_AO (24013445742, $8k/día, 6 marcas, goal B2C, bajo monitor cloud). Log: _Sistema/analisis-google/tuneup_20260709_log.jsonl. Queda lo que no es de Ads:
Reponé el stock que la demanda YA pide (Gold Nutrition, Natier)
La demanda de búsqueda existe y está medida (GSC 90d): creatina Gold Nutrition y magnesio bisglicinato Natier (152 impr, posición 10) — pero la tienda B2C tiene CERO stock de ambos (verificado por API: las 2 creatinas Gold en 0, las 5 variantes de magnesio Natier en 0). Por eso quedaron AFUERA de la campaña Search Marcas B2C nueva. Coordinar reposición con compras; con stock, se suman los 2 ad groups a la campaña 24013445742 (ya está previsto en el monitor). Es la misma lección de ML: distribuimos lo que la gente busca pero el B2C no lo puede servir. REFUERZO Keyword Planner 10/07: "natier" solo mueve 12.100 búsq/mes (mismo volumen que Star y ENA) y es la ÚNICA marca grande del portfolio SIN cobertura en la cuenta; su familia suma ~17k/mes (omega 3 natier 1.300 +30%, natier productos 880 +108%, colageno natier 720…). También creció la urgencia de Gold: "creatina gold nutrition" 1.900/mes +60%. · AMPLIADO 04/08 con el cruce demanda-vs-surtido de TODO el catálogo (auditoría del árbol de categorías, GSC B2C+B2B con outliers excluidos — script tn_demanda_vs_catalogo.py). Aparecieron CUATRO inversiones donde la demanda le gana al surtido, y una es más grande que la de Natier: (1) CREATINA EN GOMITAS — 433 impresiones y UN SOLO producto en catálogo (Goom). Es además el cluster con MÁS clicks de todo el análisis (10) y el único que rankea en posiciones 3-4, o sea que convierte: "gomitas de creatina goom" 85 imp, "creatina en gomitas" 60, y cinco permutaciones más del mismo término. Hay demanda probada, posición ganada y una sola cosa para vender. (2) PROTEÍNA VEGETAL — 626 impresiones contra 9-15 productos; "proteina vegetal" (230 imp) es la 8ª consulta más buscada de toda la B2C y encima la categoría está PARTIDA EN DOS en la tienda (Proteínas Vegetales 15 + Proteina Vegetal 4, comparten 1 solo producto) → se arregla junto con cat-categorias-duplicadas-b2c. (3) BISGLICINATO DE MAGNESIO — confirma y agranda lo de Natier: 195 impresiones contra 6 productos, o sea 4× la demanda del citrato con 1/4 del surtido (el catálogo tiene 27 citratos). (4) ASPARTATO DE MAGNESIO — EPN rankea en POSICIÓN 2 para algo que NO VENDE (8 impresiones, 0 productos). Contraprueba de que el método discrimina: caseína 0 productos y 0 impresiones (no hay hueco), creatina HCL 0 y 3. Todo esto es de Compras, no de marketing — marketing ya tiene la página y la demanda medida. DOC PARA JD/COMPRAS (pedido suyo 04/08: "dejame anotado esto como importante así me ocupo"): 1-Estrategia/decisiones/2026-08-compras-demanda-sin-surtido.md — las 4 inversiones con su número, la contraprueba de que el método discrimina (caseína 0 productos y 0 búsquedas, creatina HCL 0 y 3, krill/IFOS/Informed Sport 0 y 0) y el candado de stock que les da contexto.
AltoB2C
Redirects 301 de las categorías muertas — falta solo la mayorista
✅ MINORISTA RESUELTO (09/07): descubierto que el admin nuevo de TN SÍ tiene "Redireccionamientos 301" (Configuración → seo-redirects) — cargados 17 redirects 301 reales por Chrome (health-care y sus 9 hijas, oportunidades, indumentaria, 4 productos borrados → categorías vivas), verificados con curl uno a uno (301 → destino 200). FALTA la MAYORISTA (3 pares, tenía /health-care/ + multivitaminicos1 + articulaciones en 404 con ~130 impr GSC): /health-care/→/salud-y-bienestar1/ · /health-care/multivitaminicos1/→/multivitaminicos/ · /health-care/articulaciones/→/huesos-y-articulaciones/. Bloqueo: el Chrome conectado solo tiene sesión del admin minorista — cargar los 3 cuando esté la sesión del mayorista (2 min de trabajo).
MedioB2C
Base de mails viva · KlaviyoAuditoría de flows 06/07: la mitad de la base es inalcanzable y los flows clave están rotos. Email es canal propio — arreglarlo no depende de nadie.
Reconstruí Engaged/Dormidos con ventana MÓVIL
Los 4 segmentos usan fecha CONGELADA (11/03/2026), no "últimos 90 días": el engaged se vuelve más laxo cada día (quien abrió UNA vez en marzo cuenta como engaged para siempre) y toda alta nueva sin aperturas cae a "dormidos" al instante (sin condición de antigüedad). Rehacer con ventana móvil 90d + "created > 90d" en dormidos + carril "nuevos". Hoy inalcanzables: B2B 2.033 (56% de la lista) / B2C 5.700 (51%). · 08/07: DESCONGELADO EN VIVO — 5/6 segmentos pasados a ventana rolling «in-the-last 90 day» por API (X23m72, WtDyPM, R7EUr3, U5gnMV, TeJf3a; kla_defrost.py). FALTA para cerrar: «created > 90d» en dormidos (hoy el alta nueva sin compra cae a dormido al instante) + carril «nuevos». UXZwJH intacta (fecha 03/06, posible campaña BA).
MáximoGlobal
Sunset FLOW real — hoy el dormido nuevo no recibe NADA
El "sunset" de junio fueron 6 campañas one-shot (11-18/06), NO un flow: quien entra a dormidos después del 18/06 no recibe nada, nunca. Armar el flow segment-triggered (3 mails + splits; los templates ya existen) para que cada dormido nuevo reciba la cascada solo. Y decidir el destino de los ~7.700 ya quemados: supresión vs re-sunset trimestral. · 07/07/2026: el flujo continuo para dormidos COMERCIALES (dejaron de COMPRAR, def. Tiendanube) ya está LIVE — winback auto-sender por mail personal de JD, GitHub Action ~200/día 8-18 ART. Resta acá el sunset para los dormidos de ENGAGEMENT de email (dejaron de ABRIR) en Klaviyo.
MáximoGlobal Necesita los segmentos con ventana móvil
Nuevo Cliente B2C+B2B: rotos desde el 4-8/06
B2C: 5 mails en 3 MESES. B2B: de ~130/mes a 7/mes justo tras la edición del 04/06. Causa más probable: el filtro "Placed Order = 1 alltime" agregado en esas fechas descarta al comprador nuevo (al evaluar, el conteo aún no incluye la orden que dispara). Corregir el filtro y verificar volumen a la semana.
AltoGlobal
Welcome B2B: el revendedor nuevo entra a un agujero negro
No existe bienvenida B2B por alta a la lista (solo por primera COMPRA). El registrado que no compra: sin welcome, fuera de campañas (nunca abrió → no es "engaged") y contado como "dormido" desde el día cero. Es la fuente principal de los dormidos B2B nuevos (~5/día). Armar welcome B2B: catálogo, mínimos, cómo pedir.
AltoB2B
Higiene de flows: inglés, asuntos repetidos, one-shots
El flow que MÁS convierte ($6,7M/30d, remarketing de producto visto) tiene el asunto en INGLÉS ("Did you see something you liked?"). Welcome B2C: 5 mails con el MISMO asunto. Restock/PreChurn: re-entrada bloqueada (el cliente recibe el aviso UNA vez en la vida). Borrar el draft basura "Essential Flow Recommendation".
MedioGlobal
REVIVIR el motor de cupones (la mejor palanca histórica de JD)
PRIORIDAD JD 08/07 (mejor palanca histórica). MUY AVANZADO esta sesión (repo ya de EPN): construida la pieza faltante = generador de pool bulk_coupons_for_klaviyo.py (crea cupones únicos en TN + CSV, prefijo por origen CARRITO/RECUPERO/…), commiteado. Arreglados 2 bugs que trababan TODO: create_coupon usaba el campo fantasma individual_use → ahora combines_with_other_discounts (campo real); y faltaba KlaviyoClient.get_segment_profiles (rompía el refresh). Pool B2C 10% COMBINABLE creado (JD: combinable + cuidar margen por % bajo, porque no-combinable en TN es todo-o-nada). Workflow diario RE-ENCENDIDO. Dry-run OK: 417 perfiles en campaña de cupón activa (winback), 50 recibirían código ya con el pool inicial. VERIFICADO en vivo que el mail de winback YA renderiza el código (tn_coupon_generic_code). FALTA para cerrar: (a) el apply masivo a los 417 — JD lo DIFIRIÓ ("no ya fue", 08/07); (b) confirmar que el cron scheduled corra con apply=true (el dispatch default es apply=false); (c) B2B después. Ver project_epinn_klaviyo_engine.
MáximoGlobal hecho
Gobernanza: sacá el backbone de Klaviyo del repo de un tercero
NUEVO · auditoría EPINN 08/07. Todo el Klaviyo + la API key + las credenciales de las 2 tiendas vivían en el GitHub personal de Justo (punto único de falla sobre el canal propio). RESUELTO EL MISMO DÍA (08/07): Justo transfirió la propiedad del repo → ahora es juandisagasti/EPINN (JD dueño + admin). Los 10 secrets sobrevivieron la transferencia (no hubo que recomponer nada) y el sync no se cortó. Falta menor: sumar alerta de fallo de workflow (se cuelga de sys-alerta-drafts-vencidos). Ver project_epinn_klaviyo_engine.
AltoGlobal hecho
Lanzamientos B2B frenados · Deseado + SUMARecuperado de las rutinas semanales de claude.ai (06/07, ya eliminadas): las dos secuencias de lanzamiento quedaron a medio ejecutar, con mails en Draft y fechas vencidas. Lo urgente con fecha vive en Tareas de la semana.
Deseado Cold Brews: relanzá la secuencia frenada
Salieron 5 de 13 mails y la Wave 2 ENTERA (E6-E9, 12-18/06) + E10 quedaron en Draft con fecha vencida: 25 días de silencio en pleno lanzamiento. Wave 1 dejó 11 pedidos ~$6,7M (ticket ~$600k, concentrado en E1). Recuperar con mail de reactivación + replan E11-E13, y diagnosticar por qué quedaron en Draft (aprobación, contenido, nadie mirando).
MáximoB2B
SUMA: retomá la secuencia (M5 vencido, M6 al borde)
Al día 30: 15 tiendas de 703 (2,1%), reorden 13,3% — revisión Día 60 en la ventana 27/07-03/08. M5 (22/06) nunca salió y M6 estaba en Draft a días de su fecha. OR en caída (23%→15,6%) y ningún mail pasó CTR 2%. Retomar cadencia + ampliar audiencia M7-M11 si el objetivo es masa crítica pre-primavera.
AltoB2B
Exclusión de dormidos = default en todo envío de lanzamiento
La prueba la dieron los propios lanzamientos: Deseado E5 con dormidos excluidos hizo OR 49,7% vs 17-21% de la lista llena; SUMA M2 (solo no-abrieron M1) fue el único mail del programa sobre benchmark. Regla operativa hasta que los segmentos móviles estén reconstruidos (ver kla-segmentos-moviles).
AltoGlobal
CRO tiendas · auditoría front-end 08/07Auditoría CRO en vivo de las 2 tiendas Tiendanube (verificada por panel adversario). Quick-wins de config/merchandising, casi todo sin candado.
Sacá "SIN FC" (sin factura) del mayorista + barré ML/Merchant
NUEVO · auditoría CRO 08/07. Cada card del home mayorista muestra público "$X con SIN FC — Efectivo, depósito o transferencia" (verificado por DOM, ej $73.390,20): medio de pago custom de Tiendanube llamado "SIN FC" (=sin factura), sin precio "con FC" apareado. Publica evidencia escrita, pública y permanente de venta sin factura, en el canal B2B que ARCA/AFIP más scrapea, y viola la regla fija de JD (feedback_descuento_efectivo). Fix de 2 min: Config → Formas de pago → Otros medios → renombrar a "Efectivo / Transferencia" (sin "factura"), sin tocar el precio; confirmar el label exacto en el admin. Y BARRER la misma leyenda en Mercado Libre (ML da de baja publicaciones con "sin factura") + feed Merchant + PDP/checkout. NO cuesta conversión: es compliance de wording; la práctica fiscal es de Comercial. La exposición GEO de precios públicos NO se toca — solo la palabra "factura".
MáximoB2B
Re-curá el módulo "Más Vendidos" del home (tapado de agotados)
NUEVO · auditoría CRO 08/07. Los módulos "Suplementos Más Vendidos" y "Alimentos Saludables" (entera) del home B2C (y B2B) muestran "Avísame cuando haya stock" en muchos productos; /creatinas/ SÍ tiene stock → el problema es el MÓDULO curado con agotados, no el catálogo (inferido de 1 colección — confirmar por API TN + si es SKU o variante agotada). Fix de merchandising en el editor de tema: apuntar a una colección viva u ordenar por disponibilidad. Hermano front-end de la reposición por compras (Gold+Natier en 0): este cura la vitrina sin candado de compras. Conecta con la lección "stock B2C bloquea demanda".
AltoB2C
Verificá en GA4 dónde aterrizan los ads de PMax
NUEVO · auditoría CRO 08/07. Chequeo de 5 min que resuelve un flip: no está verificado si el $28k/día de PMax cae en home (módulos agotados), PLP o PDP. PMax/Shopping suele deep-linkear a PDP vía feed Merchant, no al home → hasta ver el landing report de GA4 NO se puede afirmar que el pago aterrice en los agotados. Si cae en home/módulos agotados → home-curar-modulo-stock pasa a URGENTE (sangrado activo sobre tráfico pago). Si cae en PDP con stock → cosmético. Relacionado con fun-ab-destino (ese es el experimento; esto es la verificación del ruteo actual).
AltoB2C
Ponele frequency-cap al popup de newsletter
NUEVO · auditoría CRO 08/07. El modal de newsletter (checkboxes de intereses) reaparece en CADA navegación en ambas tiendas, sin cap ni cookie: impuesto directo a la conversión sobre tráfico pago (en desktop interceptó un click de "Agregar al carrito" — n=1; el bug duro es la reaparición). Fix de config: 1 aparición/sesión + cookie, delay/scroll-trigger, y que NO tape el CTA en móvil (z-index/timing). NO eliminarlo — la captación alimenta la base Klaviyo (kla-*). Feed también a fun-carrito-checkout como causa a testear; en móvil un interstitial que tape el CTA además penaliza SEO.
MedioB2C
Probá A MANO que el "Agregar al carrito" + checkout funcionen (desktop + móvil)
NUEVO · auditoría CRO 08/07. En la auditoría automatizada el "Agregar al carrito" NO poblaba el carrito ni en el panel ni en el Chrome real (aparecía "¡Agregado con éxito!" pero el carrito quedaba vacío, contador 0). Lo más probable es que sea artefacto de la sesión automatizada (la tienda vende, hay órdenes en la API), NO un bug real — por eso NO se reporta como roto. PERO justo antes de escalar presupuesto fuerte, el riesgo de que sea real es enorme: verificar a mano, con un pedido de prueba real, que agregar al carrito + llegar al checkout + completar funciona en desktop Y móvil. 5 min, downside catastrófico si estuviera roto. Además: el add NO abre slide-cart/drawer (solo un aviso) y el ícono de carrito no tiene label accesible.
AltoB2C
Alta de Matter · auditoría del alta 03/08JD cargó los 8 SKUs de Matter en las 2 tiendas CON SU APP (que sigue el estándar de altas) y pidió revisión. Auditado por API de Tiendanube producto por producto (16 fichas) contra _Sistema/Scripts/matter_alta.json, contra el resto del catálogo, contra el PVP oficial de mattersupplements.com y contra el RÓTULO del envase (tabla nutricional en Diseño & Multimedia/Fotos de productos/Suplementos/Matter/). Las FICHAS están bien de forma: 16/16 idénticas a lo aprobado, sistema v3 completo, SEO dentro de límite (títulos 28-63 chars, descripciones 127-155), B2B corto de reventa y B2C educativo sin cruce. LO QUE SE CAYÓ AL VERIFICAR (no son errores del alta, es el estándar funcionando — importante para no auditar mal la próxima): la categoría base genérica es lo que el estándar asigna en el alta y el afinado es un paso 2 aparte (con VITS pasó igual el 27/07 y se afinó el 28/07 con assign-cats); el eje "tipo de negocio" del mayorista está en el estándar como OPCIONAL y con VITS también se generó y no se cargó; el SKU = EAN es consistente con VITS, que usó el código de la fábrica (COLAGENO-360G); y "Novedades" nunca estuvo en el estándar (era sugerencia). Los 16 están con Mostrar en tienda = No y stock 0 (coherente con el pre-lanzamiento) → hay ventana para arreglar antes de que se vean.
✅ Precios de Matter: el bug era el IVA faltante en minorista — corregido; los 8 SKUs están exactos (cerrado 03/08)
VERIFICADO 03/08 contra el PVP oficial de mattersupplements.com y la API de TN. Los 8 SKUs quedaron con minorista = mayorista × 1,1425 EXACTO (la mediana del catálogo sobre los 868 SKUs que están en las 2 tiendas es × 1,695 · p25 1,60 · p75 1,93). Contra el PVP de la marca: Green Boost 30 sobres PVP 89.000 / EPN B2C 69.421 (−22%) / B2B 60.763 → el revendedor tiene +46%; Doypack 77.000 / 61.983 (−20%) / 54.253 → +42%; Creatina Creapure 300g 62.500 / 47.107 (−25%) / 41.232 → +52%; Sticks 42.000 / 30.992 (−26%) / 27.127 → +55%; Living Relax y Living Happy 36.000 / 19.339 (−46%) / 16.926 → +113%. SON DOS PROBLEMAS DISTINTOS: (1) La línea LIVING está cargada con otra lógica que el resto — a mitad del PVP de la marca y con el doble de margen para el revendedor que los demás SKUs. Uno de los dos grupos tiene el número mal, y la pregunta a hacerse es la que dejó la lección de VITS de esta misma mañana: ¿el número que se cargó es lo que PAGAMOS o lo que COBRAMOS? (y si la lista de Matter viene sin IVA, ×1,21, porque la tienda mayorista carga IVA incluido — verificado contra Promarine MEB). (2) El B2C a −20/−26% del PVP no es el problema en sí (es competitivo: otro retailer lista Green Boost 30 a ~63.000), el problema es el SPREAD INTERNO: el revendedor compra Green Boost a 60.763 y ve NUESTRA tienda vendiéndolo a 69.421 → su techo real de mostrador es nuestro precio, o sea 14% de margen, no el 46% que le habilita el PVP. Le estamos compitiendo a nuestro propio canal, y precio es el motivo #2 de las 37 devoluciones del win-back. Decisión de JD/Comercial (criterio VITS: el precio al revendedor lo define JD y no se deduce de otra marca), pero bloquea publicar. · ACTUALIZACIÓN 03/08 (tarde): los precios B2C YA SE CORRIGIERON — ahora son mayorista × 1,382 uniforme, que deja la tienda minorista al 89-97% del PVP de la marca (creatina 56.999 vs PVP 62.500; Green Boost 30 sobres 83.999 vs 89.000; doypack 74.999 vs 77.000; sticks 37.500 vs 42.000). Eso cierra el problema del B2C: ya no le competimos al revendedor. LO QUE QUEDA ABIERTO, y es una sola cosa: el precio MAYORISTA de la línea Living. Los 5 SKUs de greens y creatina están al 65-70% del PVP de la marca; Living Relax y Living Happy están al 47% (16.926 contra PVP 36.000) y Living Focus al ~42%. Con el ×1,382 aplicado, eso arrastra el B2C de los Living al 65% del PVP mientras el resto va al 89-97%. Si la lógica de los otros 5 es la correcta, el mayorista de los Living debería estar en torno a $24.500 y no en $16.926. NO SE TOCÓ el precio: hace falta la lista de Matter para saber si ese número es costo o precio de venta (la lección de VITS de esta misma mañana) y el precio al revendedor lo define JD. · CERRADO 03/08 con la LISTA DE MATTER en mano (JD la pasó). LA REGLA, para la próxima marca: la lista de la marca viene SIN IVA y las dos tiendas cargan CON IVA → minorista = PDV × 1,21 · mayorista = (Precio Distri / 0,8) × 1,21. Verificado a mano contra los 8 SKUs: 8/8 exactos al peso en las DOS tiendas. El margen que le queda al revendedor es 27,7% uniforme en los 8. OJO con la columna: el costo de EPN es "Precio Distri" (EPN es el distribuidor), NO "Precio Minorista" — si se usara esa, el mayorista quedaría a 7,4% del minorista y ningún revendedor trabaja con eso. QUÉ ERA REAL Y QUÉ NO de lo que reporté a la mañana: (a) REAL — el spread de 14,25% existía porque la minorista tenía cargado el PDV PELADO SIN IVA ($69.421 en vez de $83.999); ya se corrigió sumando el 21%. (b) MI ERROR — la supuesta anomalía de la línea Living ("está a mitad del PVP") salió de comparar contra los precios de la web propia de Matter (canal directo de la marca, que vende Living Relax a $36.000) porque no tenía la lista de PDV. Con la lista, la línea Living tiene EXACTAMENTE el mismo tratamiento que el resto. Lección: no inferir una anomalía de precio desde el sitio DTC de la marca — pedir la lista, que es la única fuente.
MáximoGlobal hecho
📷 Las fotos de Matter YA están en el disco desde el 28/07 y los 16 productos siguen en 0 imágenes — es subirlas
CORRECCIÓN de diagnóstico (03/08): no hay que pedírselas a Matter. El pack está en Diseño & Multimedia/Fotos de productos/Suplementos/Matter/Foto Producto/ desde el 28/07 — el ZIP "Foto x Articulo" trae packshot de 7 de los 8 SKUs (Green Boost, Green Boost 5 Unidades, Creatina Creapure, Creatina Sticks, Living Focus, Living Relax, Living Happy; falta SOLO el doypack), más 4 tablas nutricionales (Creatina, Green Boost, Living Happy, Living Relax) y fotos de estilo/estantería. Verificado por API producto por producto: 0 imágenes en los 8 de minorista y los 8 de mayorista. Sin foto el producto sale con placeholder y no se clickea, sobre fichas que ya están escritas al nivel del sistema v3. ACCIÓN: subirlas con el mismo patrón que se usó hoy para VITS (vits_fotos.py: idempotente por tienda+SKU+archivo, done file, flag --aplicar), packshot en position 1 y tabla nutricional detrás; pedirle a Santi solo el packshot del doypack. Y sumar "foto cargada" como condición de publicación en el estándar de alta, para que la próxima marca no repita. · AVANCE 03/08 en VITS: la fábrica mandó el pack completo (13 carpetas, 88 imágenes) y se cargaron 154 placas en las 2 tiendas (`vits_fotos.py`) → los 13 SKUs pasaron de 1 render suelto a galería de 6-8 (packshot + hero + beneficios + modo de uso + tabla nutricional + certificaciones/RNPA). Destrabado ELECTROLITOS, que estaba oculto SOLO por falta de foto. El Colágeno Peptan sigue en 0: es el único de los 14 que la fábrica no mandó. Referencia de lo que hay que pedirle a Santi: exactamente ese pack.
MáximoGlobal
✅ Peso y medidas de Matter completos en las 2 tiendas (cerrado 03/08)
Los 8 productos quedaron con peso 0,100 kg en las dos tiendas (0,050 la caja de 5 sobres). El catálogo declara pesos reales: en la muestra 368/368 variantes con peso > 0, y los comparables directos son creatina Star 300g pote = 0,400 kg, Vitatech 60 comp = 0,450 kg, VITS Colágeno 360g = 0,400 kg. Un pote de 300 g de creatina no pesa 100 g con envase. En B2C Tiendanube cotiza el envío por peso → cada venta con envío sale subfacturada y la diferencia la come EPN. Fix: pesar los 8 con balanza cuando llegue la mercadería a Torcuato (2 min) y cargarlos; si hay que publicar antes, poner el estimado por comparable, que redondear para arriba no cuesta ventas y redondear para abajo cuesta plata. · CERRADO 03/08: 16 escrituras (8 SKUs × 2 tiendas), 0 fallos. Los 8 estaban en 0,100 kg de default (0,050 la caja de 5) y ahora tienen peso real o estimado con base trazable. Método: peso NETO publicado por Matter + el delta de envase MEDIDO en los equivalentes de VITS que ya estaban cargados en las mismas tiendas (VITS creatina 300 g = 0,340 kg · 10×13×10; VITS colágeno 360 g = 0,400; frasco 30 caps = 0,070 · 5×9×5; frasco 60 caps = 0,100). Cargado: creatina pote 300 g → 0,340 · 10×13×10 (análogo idéntico); Living Focus → 0,070 · 5×9×5; Living Relax y Happy → 0,100 · 5×9×5; doypack → 0,390 (360 g netos + envase); caja de 30 sobres → 0,470 (360 g netos + film de los sobres + caja); caja de 5 sobres → 0,090; caja de 30 sticks → 0,240 (150 g netos + film + caja). MEDIDAS: los 4 con formato idéntico a un análogo medido las tienen copiadas de ahí. Los otros 4 (doypack, caja de 30 sobres, caja de 5, caja de 30 sticks) no tenían análogo, así que JD pidió inferirlas y dejar el alta completa — se cargaron deducidas del contenido y del formato, validando que el volumen del envase sea coherente con el volumen del polvo (greens y creatina ~0,45 g/cm³): doypack 12×22×7 (1.848 cm³, ocupación 43%), caja de 30 sobres 16×13×9 (1.872 cm³, 43%), caja de 5 sobres 8×13×4 (416 cm³, 32%), caja de 30 sticks 12×11×5 (660 cm³, 51%). Las 4 son INFERIDAS: si alguna cotización de envío sale rara, empezar por acá y medir con cinta. Los 4 análogos y el peso de los 8 sí son trazables. Nota: la web de Matter publica solo el peso NETO del contenido (0,36 kg los 30 sobres), no el de envío.
AltoB2C hecho
✅ Categorías, tags y SEO de Matter y VITS completados en las 2 tiendas (resuelto 03/08)
NO es un error de la carga — el estándar asigna la categoría base en el alta y el afinado es un segundo paso, igual que con VITS (7 cayeron en "Salud y Bienestar" el 27/07 y se reasignaron el 28/07 con tn_crear_productos.py assign-cats, leyendo vits_cats_.json). Lo que falta correr para Matter: los 3 Green Boost están solo en "Salud y bienestar" existiendo Multivitamínicos (45 en B2C / 57 en B2B), Vitaminas y minerales (118/134) y Probióticos (6/8); Living Relax es bisglicinato y no está en "Magnesio" (46/48); Living Focus no está en "Neurobooster" (13, solo B2C). Decisiones que NO son del estándar y quedan a criterio de JD: sumarlos a "Novedades" (101 en B2C / 80 en B2B, categoría activa) por ser lanzamiento, y cargar el eje secundario "tipo de negocio" en la mayorista (Dietética / Gimnasio / Tienda de Suplementos / Farmacia, 200+ productos cada rama) — que el estándar marca como OPCIONAL y que también quedó pendiente en VITS, así que conviene decidirlo para las dos marcas juntas y no por marca. Asimetría a corregir: las creatinas están en "Suplementos Deportivos + Creatinas" en mayorista y solo en "Creatinas" en minorista. Todo esto es tributario del proyecto de taxonomía granular + dedup que pidió JD el 28/07.CERRADO 03/08 (pedido de JD: "así no creamos productos deficientemente nunca más"). ESTADO PREVIO: los 8 de Matter tenían 1 SOLA categoría ("Salud y bienestar" o "Creatinas") y 10 de los 14 de VITS también; ninguna de las 2 marcas estaba en el eje "Tipo de negocio" de la mayorista. HECHO: 43 escrituras por API, 0 fallos. Matter B2C pasó de 1 a 2-6 categorías y B2B a 5-10; VITS B2C a 3-7 y B2B a 8-10. Método (el que hay que repetir): se copió el set de category-ids de un producto de REFERENCIA del catálogo por familia (Gentech para creatina, Natier para bisglicinato, HTN Vitamin Pro para multivitamínico, Star para omega 3 y resveratrol, Kyojin para probiótico, Natier Triptófano para ánimo, Fungileon para hongo, Age Biologique para colágeno) y se le sumó lo que la composición pide y se le RESTÓ lo que no aplica — el colágeno y el NAD quedaban dentro de "Multivitamínicos" por arrastre de la referencia. Se excluyeron las categorías de MERCHANDISING (Los Más Buscados, Novedades, Ofertas, Importados, Caja Cerrada, Combos): meter un producto nuevo en "Los Más Buscados" falsea el módulo e "Importados" sería falso en marcas de industria argentina. DATO que fija la regla: de 1.417 productos con categoría hija en las 2 tiendas, 0 están sin el padre asignado → padre+hija siempre explícitos, TN no lo hace solo. Y el eje "Tipo de negocio" (Bicicletería/Gimnasio/Dietética/Farmacia/Tienda de Suplementos) NO es opcional como decía el estándar: todos los comparables del catálogo lo tienen. TAGS Y SEO: se encontró un defecto sistemático en VITS mayorista — las 14 descripciones SEO eran la MISMA plantilla hueca con el nombre cambiado ("…VITS al por mayor para tu negocio: precio de distribuidor y stock para reventa. Comprá por mayor en EPN Store."), sin un dato del producto y cerrando con CTA promocional que el estándar prohíbe; y 10 de 14 títulos no llevaban la marca. Las 14 reescritas + tags normalizados a 6 con los rubros que corresponden. Verificación final: 44 productos, 0 con CTA en SEO, 0 mayoristas sin rubro. Todo escrito en los estándares (Partes 13 y 14 del B2C, Partes 6 y 7 del B2B) para que la app de altas lo aplique sola.
AltoGlobal hecho
⚖️ Las fichas de Green Boost contradicen el rótulo: falta la contraindicación del envase y recomendamos fibra que el producto ya trae
VERIFICADO 03/08 contra la tabla nutricional del envase (Diseño & Multimedia/.../Matter/Foto Producto/Tablas nutricionales/Green Boost.png). Esto SÍ es error de contenido nuestro, no del alta. (1) El rótulo dice textual "No utilizar en caso de embarazo, mujeres en período de lactancia, ni en niños" y NINGUNA de las 3 fichas B2C de Green Boost lo menciona — mientras que en Living Focus y Living Happy sí pusimos la advertencia. Tampoco están los alérgenos que declara el envase ("puede contener leche, soja y sulfitos"), que en un greens vegetal es la primera pregunta que hace el cliente. En un producto que vendemos como "la toma de todos los días", omitir lo que el propio envase advierte es el hallazgo más serio de las 16 fichas. (2) Las 3 fichas recomiendan "sumar un prebiótico de fibra, porque el polvo concentra micronutrientes pero pierde casi toda la fibra del alimento entero" y el rótulo declara 1 g de fibra alimentaria por sobre (4% VD) con INULINA como ingrediente, que es justamente el prebiótico más usado: estamos recomendando comprar algo que el producto ya trae, con un argumento que el envase contradice. (3) "3 probióticos" y "2 proteínas vegetales" no están respaldados por el rótulo, que dice "fermentos lácticos liofilizados" (sin cepas ni UFC) y "proteína vegetal aislada" (una sola) — y nuestro desglose de 50 ingredientes se apoya en esos dos números. (4) SOBRE EL 58 vs 50: NO es error. La marca comunica 58 ingredientes y las 6 fichas dicen 50 porque el desglose de la propia marca suma 50 (13 vitaminas + 13 minerales + 18 extractos + 3 probióticos + 2 proteínas + CoQ10) — fue una decisión deliberada aplicando la regla de verificación del estándar ("¿cualquier dato afirmado se puede sostener?") y quedó documentada en el commit del alta. Queda un solo detalle de merchandising: si las placas que manda Matter dicen 58 y la ficha dice 50, en la misma página conviven dos números — decidir cuál se muestra. Matiz: decimos "Matter es un laboratorio argentino" y el rótulo dice Industria Argentina, elaborado por BEAUTY INVESTMENTS S.A. — Matter es la marca, no necesariamente el laboratorio. DATO REGISTRAL para la ficha: RNE 01002093 · RNPA EX2024-36408763-GCABA. Porción: 12 g (1 sobre), 34 kcal, 6 g de hidratos, 2,4 g de proteína, 13 vitaminas y 13 minerales confirmados.
MáximoB2C
✅ Estándar de fichas B2B escrito + contradicción interna del estándar arreglada (resuelto 03/08)
CERRADO 03/08. La auditoría del alta de Matter encontró que el estándar de descripciones tenía dos defectos propios (no de la app que genera las fichas): (1) el encabezado remitía a `sistema-descripcion-b2b-mayorista.md` para las reglas del canal mayorista y ese archivo NO existía — ni en el repo local ni en GitHub, verificado por gh api (404 también en _Sistema/exports/cargar-productos-tn, donde vivía el SKILL.md portable, que además nunca se commiteó). Las fichas B2B salían bien porque el patrón estaba en el contexto del generador, pero no estaba escrito en ningún lado, así que nada garantizaba que la próxima tanda saliera igual. (2) Contradicción interna: la Parte 5 prohíbe el adjetivo "Ideal" y la plantilla de la Parte 9 usa literal el subtítulo "Momento ideal #1" — las 8 fichas B2C de Matter daban falso positivo en el checklist. HECHO: se escribió `4-Canales/Tiendanube/sistema-descripcion-b2b-mayorista.md` v1 AUTOSUFICIENTE (anatomía M0-M3, SEO del canal, tono, guardarraíl de "sin factura", guardarraíl ANMAT, regla de verificación con el caso 58-vs-50, checklist de 17 puntos y una tabla de lo que la ficha NO cubre: precio/IVA/peso/medidas/costo/stock/categorías/fotos con el aprendizaje de cada uno), se agregó la excepción de "ideal" al estándar B2C, y los DOS documentos ahora llevan REGISTRO DE CAMBIOS obligatorio — porque hay más de una app generando fichas contra ellos y una de esas apps los lee por la API de GitHub, o sea que toma siempre la versión publicada. Evidencia del alta auditada: 16/16 fichas pasan el checklist del propio estándar (0 adjetivos prohibidos reales, 0 español neutro, 0 entidades HTML, 0 h1/h2, 0 objetivos regulatorios, tablas con estilos inline, SEO en límite); el único desvío de output fue el M0 de Living Relax en 1 de 8.
AltoB2B hecho
🔧 Prolijidad del alta: nombres sin formato, costo vacío en minorista, B0 de Living Relax desalineado
Tres detalles de 10 minutos. (1) NOMBRES sin formato, contra la práctica del catálogo y contra el propio alta de VITS ("Colágeno Hidrolizado Peptan 360 g", "Creatina Monohidrato (POTE) x 300 gr EEUU"): "Green Boost (Matter)" son 30 sobres de 12 g, "Creatina monohidratada Creapure® (Matter)" son 300 g, Living Focus/Happy/Relax son 30/60/60 cápsulas — y con los 3 formatos de Green Boost en la misma grilla el principal es justo el que no se entiende; "Green Boost 5 Unidades" debería decir "x 5 sobres". (2) COSTO vacío en los 8 de minorista cuando 365/368 variantes de la muestra lo tienen cargado → entran sin margen calculable a cualquier reporte de rentabilidad (en mayorista el catálogo tampoco tiene costos, ahí no es la excepción). (3) La ficha técnica (B0) de Living Relax dice "Living Relax x 60 Caps (Matter)" y el producto se llama "Living Relax (Matter)": rompe la regla de que B0 se copia tal cual del nombre, que existe para que la IA de WhatsApp y el buscador interno lo encuentren sin ambigüedad. Si se corrigen los nombres del punto 1, el 3 se resuelve solo. NOTA — un claim que quedó VERIFICADO y NO hay que tocar: "el doypack sale menos por toma" (3 fichas) es cierto — sobre de 12 g × 30 = 360 g y el doypack pesa 0,36 kg según la propia marca, o sea 30 tomas: $2.066 vs $2.314 por toma.
MedioGlobal
Fotos de VITS · pack de la fábrica cargado 03/08La fábrica mandó el pack completo de listing (13 carpetas / 88 imágenes) y se subieron 154 placas a las 2 tiendas con `_Sistema/Scripts/vits_fotos.py` (idempotente por SKU+archivo, 0 fallos). Al revisar las placas una por una aparecieron tres cosas que no son de carga sino de criterio, y quedan en manos de JD. CERRADO 03/08 con las respuestas de JD: los claims se dejan, él publica Electrolitos, él consigue la foto del Colágeno y pide el packshot blanco, el Omega 3 se queda con 1 sola foto ("es lo que hay"), y el faltante de Melena/B12 es de FÁBRICA, no un error de carga.
⚖️ Claims de las placas de VITS: JD decidió DEJARLOS (03/08) — es material de la marca
Las placas son material oficial de la marca (llevan su RNPA y sus certificaciones), pero el que las publica en su vidriera es EPN. Seis productos afirman cosas que un suplemento dietario no puede afirmar en Argentina: VITAMINA C + ZINC — "es tu escudo diario para PREVENIR ENFERMEDADES", "escudo contra virus y bacterias externas", "acelera la reparación de los tejidos y la cicatrización" (el más expuesto: acción preventiva explícita). CÚRCUMA — "Poderoso antinflamatorio", "ayuda a reducir el DOLOR y la rigidez en las articulaciones", "el calmante natural que desinflama tu cuerpo" (4 de sus 7 placas). NAD + RESVERATROL — "propiedades antiinflamatorias", "es el tratamiento de rejuvenecimiento celular", "antienvejecimiento". MELENA DE LEÓN — "el hongo MEDICINAL que funciona como un superalimento para tu cerebro". VITAMINA B COMPLEX — "reduciendo la ansiedad". CITRATO DE MAGNESIO — "− ansiedad" en el diagrama de beneficios. ✅ DECISIÓN DE JD (03/08): **se dejan**. "Si VITS puso claims dejalos, es su marca, ellos lo pusieron." EPN distribuye, no es dueña de la marca: el claim que redacta el fabricante en su propio material es responsabilidad del fabricante. No se confunde con el caso IFOS —ahí la propia fábrica había documentado por escrito que el lote no estaba certificado, y por eso ese claim SÍ salió (mismo día, sin contradicción)—. La línea quedó escrita en CRITERIO-MACRO: duda regulatoria ≠ contradicción documentada; lo que redactamos NOSOTROS (nombre, SEO, descripción, mails, placas propias) se verifica siempre. Si algún día se quiere revertir, los IDs de cada imagen están en `_Sistema/Scripts/_vits_fotos_done.json`.
MáximoGlobal hecho
🧾 Arreglos finos post-carga de fotos VITS — hechos 03/08, queda el 301 y el packshot de Electrolitos
✅ HECHO 03/08 (`_Sistema/Scripts/vits_correcciones.py`, verificado contra la API): (1) BORRADAS las 4 fotos con etiqueta vieja (2 por tienda) — la de MELENA DE LEÓN mostraba "+ Vitamina B3" cuando la real es "+ Vitamina B6" (lo confirma la tabla nutricional del propio pack: 20 mg), y la de OMEGA 3 tenía el sello IFOS estampado en el frasco. Las dos quedaron respaldadas en `Diseño & Multimedia/.../VITS/_fotos-reemplazadas-03ago/` antes de borrarlas. (2) OMEGA 3 SIN IFOS EN NINGÚN LADO, las 2 tiendas: el 30/07 se había corregido solo `name` + `seo_title` de mayorista; quedaban con IFOS el cuerpo de la descripción de las dos, el `seo_description` de mayorista y —en minorista— el nombre, el seo_title y el handle. Verificado: 0 apariciones de "IFOS" en los 14 productos de las 2 tiendas. El SKU sigue siendo OMEGA3-IFOS-60 (identificador de fábrica, no lo ve el cliente). (3) ELECTROLITOS: como principal quedó la placa hero sobre fondo claro, así no rompe la grilla. ⏳ QUEDA: (a) el PACKSHOT de Electrolitos sigue viniendo sobre fondo negro con viñeta y no se puede recortar limpio (el frasco también es negro, y rembg deja halo) → JD lo pide a VITS. · ESTADO FINAL DEL CATÁLOGO VITS (JD, 03/08), para no volver a levantarlo como pendiente: **MELENA DE LEÓN y VITAMINA B12 no los tiene la fábrica** — por eso nunca estuvieron en la lista de precios de distribuidor, por eso están ocultos y sin precio en mayorista y publicados con stock 0 en minorista. No es un error del alta: es faltante de VITS. **OMEGA 3 se queda con 1 sola foto**: la fábrica no mandó placas de listing y no las va a mandar ("es lo que hay"). **COLÁGENO PEPTAN**: JD consigue la foto. **ELECTROLITOS**: JD lo publica él (ya tiene precio, stock y las 8 fotos). ⚠️ Lo que sí conviene mirar del lado comercial: **Melena de León fue uno de los 4 héroes de la serie de 10 mails** del lanzamiento — se comunicó 6 semanas un producto que la fábrica no tiene. Vale para la próxima ronda de comunicación: chequear disponibilidad real antes de elegir los héroes. · DATO AL MARGEN, no es pendiente: al renombrar un producto Tiendanube regenera el handle y no deja redirect, así que las 2 URLs viejas del Omega 3 (mayorista desde el 30/07, minorista desde el 03/08) dan 404. **Google se reindexa solo** —encuentra la nueva por el sitemap y baja la vieja—, y el 301 solo sirve para conservar antigüedad y posicionamiento acumulados: acá no hay nada que conservar (Search Console, 30 días: 11 impresiones y **0 clicks** en la URL vieja de mayorista, la más vista de todo VITS). Se descartó cargarlos. Vale tenerlo presente el día que se renombre una página con tráfico real o años de historia —ahí sí, y ahí no se puede automatizar: los redirects son solo del admin, no hay endpoint en la API (probado: 404 en `redirects`, `url_redirects`, `seo/redirects`, `store/redirects`).
AltoGlobal
Alta de Moving Hydro Protein · armada 20/08, frenada por fotos y precioPedido de JD el 20/08: dar de alta los Hydro Protein. Es MOVING Hydro Protein x 500 ml (bebida proteica lista para tomar, 20 g de proteína + BCAA, sin azúcar, ~90 kcal), 5 sabores — Frutos Rojos, Limón, Mandarina, Sandía y Limón, Uva (SKUs MHP-*, Master Of The Costos filas 987-991). No existe en ninguna de las 2 tiendas (verificado por API). Fichas B2C (sistema v3) y B2B (sistema v1) escritas y CSV de alta generados para las 2 tiendas (1 producto + 5 variantes de Sabor, Mostrar en tienda = NO). Detalle completo: 4-Canales/Tiendanube/alta-moving-hydro-protein-2026-08-20.md
✅ Las fotos de Moving en el drive eran renders de IA (8 de 9) — resuelto con packshots oficiales
Hallazgo del 20/08 al armar el alta. `Diseño & Multimedia/Fotos de productos/Suplementos/Moving/` tiene 9 archivos y **8 son imágenes generadas con IA**: el texto chico de la etiqueta es garabato ilegible en todas. Casos verificados ampliando la imagen: `Uva Individual.webp` muestra "600ml / 500ml l" duplicado y el logo dice "MOVINQ"; `Frutos Rojos Aumentada.webp` dice "MOVINN"; `Limon Aumentada.webp` —la que más parece un recorte real de e-commerce, 363x1200— tiene el renglón legal garabateado y dice "sandía & limón" en una botella rotulada LIMÓN. La única real es `Naranja Sola.webp`, y es la BRASILEÑA: etiqueta en portugués, sabor TANGERINA, y otra fórmula (20 g proteína · 3 g creatina · zero açúcares · 90 kcal), distinta de la que declara la etiqueta argentina (20 g proteína · BCAA). Consecuencia: **no hay una sola foto publicable de los 5 sabores** y el alta no puede salir a la vidriera. ✅ **RESUELTO 21/08** (JD pidió usar las que había y, si no servían, buscar mejores en internet): se consiguieron los packshots oficiales de los 5 sabores, en `Diseño & Multimedia/Fotos de productos/Suplementos/Moving/_oficiales-2026-08/` con un FUENTES.txt al lado. Frutos Rojos, Limón, Mandarina y Uva salieron del CDN de hotbody.com.br (Shopify, archivos `HYDRO_PROTEIN_BCAA_-.png`, PNG 2000x2000 **con fondo transparente**, sirven también para placas y banners); Sandía y Limón de drogal.com.br (VTEX id 279742), único origen encontrado para ese sabor. Los 5 se normalizaron a 1600x1600 sobre blanco con la botella centrada y a la misma altura, para que la grilla del PLP quede pareja. **Las fotos reales cerraron además la duda de la fórmula**: la etiqueta dice NOVA FÓRMULA · PROTEÍNA + ELETRÓLITOS + BCAA · 20 g PROTEÍNA · BCAA · ZERO AÇÚCARES · APENAS 90 CALORIAS, **sin creatina** — la variante con 3 g de creatina es otra, y era justo la que mostraba la única foto real que había. Dos advertencias: las etiquetas son las brasileñas (en portugués), y Sandía y Limón dice EDIÇÃO LIMITADA, así que conviene confirmar reposición antes de empujarlo. LO QUE EXCEDE A ESTE PRODUCTO Y SIGUE ABIERTO: chequear si hay más carpetas del drive de fotos con material generado por IA — una vez cargado no se distingue del real hasta que el cliente recibe el producto y ve otra etiqueta. La prueba es barata: ampliar la letra chica de la etiqueta. En miniatura no se ve; ampliada salta enseguida.
MáximoGlobal hecho
Moving Hydro Protein: solo falta el stock y la tabla nutricional — el resto está cerrado
Tres huecos que frenan la publicación, ninguno resoluble desde marketing. (1) **MOVING NO ESTÁ DADA DE ALTA COMO PROVEEDOR en las tablas de pricing** — por eso los 5 SKUs tienen toda la fila en #N/A. El precio minorista NO lo calcula el Master: lo calcula `Administración 📚/Pricing/Pricing/Pricing TN.xlsx`, hoja `Base de Datos TN` (el Master lo espeja con un XLOOKUP). La cadena es `Costo sin IVA = Costo EPN/(1+%FC proveedor)` → `Margen Bruto = 0,4777 + ajustes` → `Precio sin IVA = Costo sin IVA/(1−Margen)` → `Precio TN = MROUND(×1,21 ; 100)`. Se rompe en dos puntos, los dos por el mismo motivo: **Moving no figura en `Condiciones de Compra`** (Master · define el % FC A → sin eso `Costo sin IVA` queda vacío) ni en **`Ajustes Globales`** (Pricing TN · ajuste por proveedor y por marca, y esos dos XLOOKUP no tienen valor por defecto → #N/A directo). Es carga de compras/administración, no de marketing. ✅ **RESUELTO 20/08:** JD confirmó que **Moving factura A por el total** → `Porcentaje FC A` = 0,21 (igual que Trust, Natier, VITS, Promarine). Aclaración de JD que vale para leer cualquier fila del Master: **el `Costo EPN` SIEMPRE viene con IVA**, así que esa columna no es la alícuota sino cuánto de ese IVA EPN recupera — qué parte de la compra viene con factura A (0,21 = marcas formales; 0 = los 17 proveedores de nombre de pila e importadores, donde el costo con IVA es el costo real; 0,1365/0,105/0,0525 = compra mixta al 65/50/25%). Con eso: 3.415/1,21 = 2.822,31 → **precio minorista $6.500** · Transferencia $5.850 · Efectivo $5.525. **El precio dejó de ser bloqueo**; queda solo la carga administrativa de Moving en `Condiciones de Compra` y `Ajustes Globales` para que las planillas dejen de mostrar #N/A. La fórmula está verificada: sobre BSN Amino X (SKU 3525, costo $104.474) devuelve $200.000, exactamente lo cargado. El precio MAYORISTA sí funciona ($4.020) porque se calcula dentro del Master con fórmula propia que no toca esas tablas: 3.415/(1−0,16+0,01) = 4.017,6 → MROUND 5. (2) **QUÉ PROTEÍNA TIENE:** la etiqueta argentina dice "20 g proteína · BCAA" y nada más, y las fuentes brasileñas se contradicen entre sí — Super Nutrição y Bebida In Box dicen **colágeno hidrolisado**, Hotbody dice extrato de levedura + **whey**, Atacadão Cerealista dice extrato de levedura y "proteína vegetal" sin whey. No es un detalle: si es colágeno es proteína incompleta (sin triptófano, baja en leucina) y la ficha NO puede argumentar recuperación ni síntesis muscular por los 20 g. Por eso la ficha B2C que se escribió defiende el FORMATO (líquido, transparente, listo, sin batir), que es verdadero pase lo que pase con la fuente — y por eso el producto quedó en el paraguas `Proteínas` y no en `Whey hidrolizada` ni en `Colágeno`. Pedir al proveedor: tabla nutricional argentina, ingredientes, **alérgenos** (si lleva whey, "contiene leche" es obligatorio) y RNPA. (3) **DATOS OPERATIVOS:** stock sin cargar, código de barras vacío (el único EAN encontrado, 7896050201749, es del limão brasileño), y peso/dimensiones cargados como ESTIMADOS (0,54 kg · 22 x 6,5 x 6,5 cm). Aparte, el Master registra el producto como procedencia **Nacional** siendo Moving una marca brasileña — chequear con compras si se importa o se embotella acá.
AltoGlobal
Credenciales del hub en texto plano dentro del repoSalió el 21/08 al sumar a Nacho y Gero como colaboradores: al darles el repo se les da también, sin quererlo, el acceso al hub de clientes.
Sacar del código la contraseña del hub y la API key de gerencia → variables de entorno de Vercel
HALLAZGO 21/08. `7-Datos-Reportes/Power-Marketing/middleware.js` tiene **hardcodeados en texto plano** el usuario y la contraseña del Basic Auth del hub y la API key de `/data/api-gerencia.json`. Ese middleware es el que protege JUSTO las secciones con datos personales: `/clientes/*` (nombres de revendedores con sus montos de facturación), `/cross-canal/*` (lo mismo) y `/ruta/*` (prospectos con dirección y teléfono, y quién los visitó). CONSECUENCIA CONCRETA: **cualquier colaborador del repo puede leer esas credenciales abriendo un archivo**. Hoy son Juanan, Lucas Luna y —desde el 21/08— Nacho y Gero. No es un agujero nuevo (está así desde que se armó el middleware), pero cada persona que se suma al repo lo hereda, y el permiso de solo lectura de GitHub no protege de esto: leer el archivo ES el problema. Tampoco sirve borrarlo de un commit nuevo, porque queda en el historial. QUÉ HACER: (1) mover los 3 valores a variables de entorno de Vercel (`process.env.HUB_USER` / `HUB_PASS` / `HUB_API_KEY`) y dejar el código sin secretos; (2) **rotar la contraseña y la API key** al hacerlo, porque las viejas ya circularon en el historial de git; (3) avisar la nueva a quien use el hub. No cambia nada para el que lo usa: sigue entrando igual. Es un rato de trabajo y cierra el tema. NOTA: si además se quiere trazabilidad de quién entra (hoy la credencial es una sola y compartida), eso ya es otro alcance — Vercel tiene auth por usuario, pero implica rearmar el acceso.
AltoGlobal
Drive de fotos de producto · material generado por IASalió del alta de Moving (20-21/08): la carpeta de fotos de un producto tenía 8 de 9 imágenes generadas con IA, con la etiqueta ilegible. Nadie lo había notado porque en miniatura no se ve.
Barrer el drive de fotos de producto buscando más material generado por IA
HALLAZGO 20/08 en `Diseño & Multimedia/Fotos de productos/Suplementos/Moving/`: de 9 archivos, **8 eran renders de IA**. Se detectan ampliando la letra chica de la etiqueta — ahí el texto legal es garabato ilegible, los logos salen mal escritos ("MOVINQ", "MOVINN" en vez de MOVING) y aparecen incoherencias como "600ml / 500ml" duplicado o un sabor que no coincide con el rótulo de la botella. En miniatura **no se distingue del real**, y una vez cargado a la tienda tampoco: el que lo descubre es el cliente cuando recibe el producto y ve otra etiqueta. Por qué importa más allá de la estética: una foto con claims inventados en la etiqueta es un claim que EPN publica en su vidriera sin poder respaldarlo, que es justo lo que el estándar de fichas prohíbe. QUÉ HACER: pasar por las carpetas de marcas cargadas en los últimos meses (las de altas nuevas son las de mayor riesgo, porque son las que se llenaron sin pack oficial del proveedor) y ampliar una foto de cada una. Donde aparezca material generado, buscar el packshot oficial — el método que funcionó con Moving está documentado en `4-Canales/Tiendanube/alta-moving-hydro-protein-2026-08-20.md`: los CDN de Shopify (hotbody.com.br) y VTEX (drogal.com.br) sirven los PNG a 2000x2000, muchos con fondo transparente, y no bloquean la descarga; los de Akamai (Drogasil/Droga Raia) sí bloquean, pero sus páginas igual dan el EAN y los IDs de imagen. REGLA PARA LAS PRÓXIMAS ALTAS: antes de usar una foto del drive, ampliarle la letra chica. Es un chequeo de treinta segundos.
AltoGlobal
Lanzamiento VITS · ventana del 10% (03→09 ago)VITS pasó su base de aplicantes al programa de distribución (76 contactos, gente que llenó el formulario de la marca pidiendo incorporarla). Cruzada contra Tiendanube: 70 NO son clientes de EPN. Es la única señal dura de intención de toda la acción — el resto son aperturas de mail, que con Apple Mail Privacy ni prueban que alguien haya mirado.
🔴 Los 76 leads que pasó VITS siguen SIN CONTACTAR y la ventana cierra el domingo 9
Estado al cierre del lunes 03/08 (día 1 de la promo): **0 de 76 tocados** en el CRM. No es problema de herramienta —ese mismo día hubo 72 movimientos en el CRM sobre otras cuentas— es de prioridad. Todo lo necesario está puesto: tab 🌱 Leads VITS en `power-marketing.vercel.app/clientes/` con los 76 ordenados por tier (A1 ya clientes → A2 interior+mostrador → A3 AMBA+mostrador → A4 online puro), cada uno con su botón de WhatsApp que abre el chat con el mensaje escrito y el nombre puesto, más estado/responsable/notas. Aviso mandado a "Dirección - Comercial" en Teams el 03/08 con los dos bloques de mensaje (lead nuevo / ya cliente) y los datos para responder. ARGUMENTO COMERCIAL: ~45% de margen sobre el PVP sugerido con el 10%, contra ~39% después — el salto de 6 puntos por una semana pesa más que "10% off" pelado. DATOS: 32 de los 76 no tienen mail (a esos SOLO se llega por WhatsApp); 42 son del interior, que es donde EPN gana estructuralmente (VITS entrega 1-5 días fuera de AMBA, EPN pone el producto en el estante local). Entre los A1 está Activa Sport Nutrition ($54,7M / 66 compras en la vista fusionada del CRM, última 08/07). Riesgo si no se hace: son hand-raisers; dejarlos sin respuesta es peor que no haberlos contactado, y repite exactamente el problema de los 37 del win-back. Archivos: `2-Iniciativas/2026-07-lanzamiento-vits/Mayorista/base-distribucion/`.
MáximoB2B
Medir el mail P11 (margen 45%) a 24 h — la hipótesis es que este segmento abre y no clickea
Enviado 03/08 16:37 ART a la lista `QT4jAJ` "VITS · Engaged serie 10" (869 perfiles = 895 que abrieron algo de la serie + 26 que clickearon, menos 3 del equipo y 26 desuscriptos/suprimidos). Resultado a 3 h: 811 entregados · 0 rebotes · 55 aperturas (6,8%) · **0 clicks** · 0 desuscriptos · 0 spam. La apertura a esa hora no dice nada (salió 16:37 de un lunes; la serie medía 37-42% pero a 24 h). Lo que hay que mirar es el CLICK: las 10 piezas anteriores juntaron 26 clicks únicos en 6 semanas sobre ~18.500 envíos. Si a 24 h sigue cerca de 0, queda confirmado que el mail no convierte en este segmento y el canal que queda es el 1 a 1 — y NO corresponde mandar un mail 12. Campaña `01KZ4HSQHF51QN326XHQYDDTDS` · template `WTPLKb` · pieza `Mayorista/email/P11_margen.html`. Nota de calendario: el 09/08 hay que SACAR A MANO el `promotional_price` de los 11 SKUs — no vence solo.
AltoB2B
✅ El tablero volvió a publicarse: el deploy pasó ANTES de winback_live (arreglado 03/08)
FALLA SILENCIOSA detectada porque JD no veía en la app cosas que SÍ estaban commiteadas (el tab de Leads VITS y el corte de Trust). Causa: `refresh-dashboards.yml` tiene `timeout-minutes: 15` en el JOB, y `winback_live` —que baja cientos de días de órdenes y tarda ~11 min— corría DENTRO del bloque de refresh, o sea ANTES del paso "Publicar en Vercel". El job se quedaba sin tiempo y moría cancelado antes de deployar: **3 corridas seguidas del 03/08 (13:16, 16:34 y una manual) canceladas**, con el tablero sirviendo la versión vieja y sin ninguna alerta (un run "cancelled" no notifica). FIX (commit `4d4a0fb`): refresh rápido → Cache CLI → **Publicar en Vercel** → `winback_live` (paso propio, `timeout-minutes: 8` + `continue-on-error`) → commit de `_live.json` (`if: always()`). Tradeoff aceptado: la recencia fresca se publica en la corrida siguiente (2 h), pero se commitea igual para los otros workflows que la leen del checkout. No agrega minutos de Actions. LECCIÓN: un `timeout-minutes` a nivel JOB no protege, MATA todo lo que viene después incluido el deploy → lo que publica va ANTES de lo lento, y lo lento se capa con timeout de PASO. Y si algo commiteado no aparece en la app, mirar primero las corridas del workflow, no el código.
AltoGlobal hecho
✅ Actions: −44% de minutos y el `winback_live` que se quemaba solo (11/08)
EL ARREGLO DEL 03/08 CREÓ UNA ESPIRAL. Al capar `winback_live` con `timeout-minutes: 8` de PASO, el pull completo (400 días, ~13 min) dejó de terminar; como al morir nunca escribe `full_at` en el estado, la corrida siguiente veía el estado viejo, reintentaba el FULL y volvía a morir. Resultado medido: **8,20 min exactos en cada una de las 8 corridas diarias ≈ 1.900 min/mes quemados sin escribir un byte**, y `clientes/_live.json` congelado desde el 03/08 (la recencia del CRM venía 8 días vieja y nadie lo vio, porque el paso tenía `continue-on-error`). FIX: `winback_live` salió del loop y vive en `winback-live.yml`, 1×/día 06:30 ART, timeout 25 y SIN `continue-on-error` — si falla, se ve en rojo. Verificado en la nube: FULL de 6.050 órdenes, 1.198 cuentas, 786 dormidas, 12,6 min, pusheado. CONSUMO REAL (timing de 7 días, no promedios): **5.816 min/mes**, no los ~3.100 que decía el registro de julio. Recortes aplicados: winback_live fuera del loop (−776 neto), cron TRANSITORIO del sender borrado con la cola en 0 (−519), refresh cada 2h→4h + `instagram_pull` solo 2×/día (era 2,6 de los 4,5 min del bloque) (−720), cross-canal diario→lunes (−382), devoluciones cada 2h→4h (−161). **Total 5.816 → ~3.230 min/mes (US$30,5 → US$9,8 de overage).** LO QUE QUEDA: el cerebro solo consume **1.417 min/mes y entraría gratis** — **el 100% del overage que se paga hoy lo produce EPINN** (1.812: sync de Klaviyo 54,7 min/día + cupones 5,7). JD decidió no tocar el repo de Juanan: la palanca abierta es sync incremental con `since_id` (−1.340) o bajarlo a 3×/semana (−940), y cualquiera de las dos devuelve la cuenta a $0. LECCIÓN: un timeout que no alcanza no ahorra, quema — si el trabajo no entra en la ventana, hay que bajar la FRECUENCIA, no apretar el reloj; y `continue-on-error` sin alerta convierte cualquier falla en gasto invisible.
AltoGlobal hecho
2
Banda 2 · prioridad

En paralelo

Todo lo que se puede empezar hoy sin ningún bloqueo. La medición no es “un paso más”: es lo que desbloquea las decisiones grandes de la banda 3. Y la cosecha (ML, SEO) tiene equipo propio y da plata directa.
12/61 pasos
Por qué esta prioridad: No depende de nada — corre al mismo tiempo que la banda 1. Los habilitadores destraban la banda 3; la cosecha propia factura sola.
Habilitadores · mediciónPrecondición de las decisiones grandes. Sin esto, reasignar plata es a ciegas.
Renová el token de Google Ads (OAuth vencido)
La auditoría mensual de julio no pudo traer datos frescos de Google (invalid_grant: token vencido/revocado) y tuvo que apoyarse en el pull del 23/06. Reautorizar el OAuth en ~/.config/google/auth destraba Ads + organic + Search Console y toda la medición de Google de acá en adelante.
AltoGlobal hecho
Verificá la app OAuth de Google (que el token no venza a 7 días)
El token de Google se cae cada ~7 días porque la app OAuth ("Power Marketing") está sin publicar/verificar (modo Testing). Fix permanente EN CURSO (01/07): app renombrada + página /legal/ live + subdominio powermarketing.epnstore.com.ar agregado en Vercel; falta el CNAME en Cloudflare (Juanan) + cargar el consent screen y reenviar a verificación. Con eso el token deja de expirar y no hay que renovarlo a mano cada semana.
AltoGlobal
Google: dejá “Compra” como única conversión principal
Bajar a secundaria las ~10 “basura” (clic-para-llamar, ver carrito, iniciar pago, acciones locales) + tags duplicados. El arreglo más barato y de mayor apalancamiento.
MáximoGlobal hecho
CAC por canal medido (Google limpio; Meta pendiente)
El CAC se mide desde la VENTA de Tiendanube atribuida por el UTM que el canal SÍ trae. Google B2B: CAC real $36,6k, LTV-6m 5,1×. Medible HOY (utm_source=google+gclid). Tool: cac_por_canal.py.
AltoB2B hecho
OCI: subile a Google la venta B2B offline (el candado maestro)
Google ve 1 de cada 7,5 pesos de la venta B2B; el gclid YA viene en las órdenes de Tiendanube. Clonar capi_b2b_daily.py (que ya hace esto para Meta): uploadClickConversions con gclid+paid+offline, dedup por order.id, filtrar pago-nube. ⚠️ CREAR una conversion action NUEVA B2B-específica (“Compra Mayorista Offline / OCI”) atada al goal Mayorista — NO revivir la vieja 6783986787 “Tiendanube Backend purchases” (verificado 06/07: cascarón vacío, 0 conv de por vida, de una integración TN deprecada reemplazada por el tracking GA4). Depende del scopeo de goal (ggl-b2b-blindaje-goal) para no ensuciar la puja B2C. Auditoría 06/07.
MáximoB2B
GA4 B2B: cross-domain para recuperar el ~35% Unassigned
El Unassigned (~$176M/90d) es la compra que pierde su origen al saltar al checkout de Tiendanube (hostName "(not set)" en 90,7% de los purchase). Fix de consola GA4 (Juanan): agregar mayoristas.epnstore.com.ar + *.mitiendanube.com al linker, referral exclusion, custom channel group. Refina med-ga4-unassigned con el mecanismo concreto. Auditoría 06/07.
AltoB2B
Instrumentá el checkout B2B (el "carrito→5%" es artefacto de tags)
El "carrito→checkout 5%" que frena la inversión NO es abandono real: es tags rotos (purchase eventCount 318 > begin_checkout users 290 = imposible). Taggear begin_checkout/add_payment_info/purchase en *.mitiendanube.com con el mismo measurement_id + corregir el doble-disparo de add_to_cart. Hasta arreglarlo, NO usar ese 5% para castigar pauta B2B rentable. Auditoría 06/07.
AltoB2B
GA4: arreglá el 45% B2B “Unassigned” ($211M/90d)
Taggear el checkout mayorista / subdominio. Sin esto, ningún canal B2B tiene crédito real de sus ventas.
MáximoB2B hecho
Documentá el margen por marca/categoría
El input que más mueve la aguja: convierte “reasignar por ROAS” (ciego) en “reasignar por contribución” (real). Dueño: comercial/compras.
MáximoGlobal
CAC:LTV + margen para B2C (el equivalente del que ya existe en B2B)
NUEVO en julio: para B2B ya hay margen de contribución (~10%) y CAC en cac-ltv.json; para B2C no hay ni eso. Sin el denominador B2C, todo ROAS/CR de minorista flota sin ancla.
AltoB2C hecho
Meta: separá el pixel por audiencia
Hoy el ROAS (42×/95× B2B, 343× “Importados”) es fantasía: pixel a nivel cuenta sin audiencia. No decidir sobre esos números. Destraba escalar Meta (banda 3).
AltoGlobal
WhatsApp: conectá Kommo/Burbuxa para medir
32 difusiones con cero datos de lectura/clic/pedido. Sin esto, la inversión es a ciegas.
AltoGlobal
Alerta automática: campaña Klaviyo planificada que quedó en Draft
El agujero sistémico que dejó morir la Wave 2 de Deseado y el M5 de SUMA: un mail del plan queda en Draft, su fecha pasa y nadie se entera. Workflow chico en la nube (cron diario) que compare las campañas con fecha planificada contra su status real y avise por mail. También habría cazado los 9 reportes de las ex-rutinas que nunca se enviaron.
AltoGlobal
Cerrá la fábrica de contenido (el proceso, no el qué)
De 153 piezas guionadas solo 17 se publican y registran. Diagnosticar si es capacidad (Melina), aprobación o prioridad, y desbloquear. Hasta resolverlo, optimizar “qué publicar” es inútil (sesgo de supervivencia).
AltoGlobal
db-maestra: deduplicar + completar ig_media_id
De 153 piezas, solo 17 matcheadas a un post real. Es el registro que alimenta “qué funciona”.
MedioGlobal
Fix del regex de build_db_maestra: rechaza los IDs R##/C## de julio
NUEVO · auditoría 07/07. build_db_maestra.py (IDRE ~línea 23) no matchea el naming nuevo MIN/MAY-2026-07-R##/C## → TODO el contenido de julio de AMBOS segmentos (13 guiones B2C + los MAY) queda invisible al aprendizaje pese a estar escrito. Fix de raíz: agregar el patrón al regex (no renombrar) + commitear los guiones untracked. Bug de sistema cross-segmento, no solo B2C.
AltoGlobal
Medir Mercado Libre como CANAL DE VENTA (hoy 0 datos propios)
DESTRABADO 09/07: API conectada (~/.config/mercadolibre, helper meli_api.py, seller EPN STORE). Ya hay lectura propia de órdenes/visitas/preguntas (15.510 órdenes hist., ~680/60d, 5.646 visitas/30d). FALTA para cerrar: consolidar revenue/share/ticket de ML por período y sumarlo al hub cross-canal (hoy el peso del canal en la venta B2C total sigue sin cuantificar en el tablero). El buy-box ya no se mide solo por observación externa.
AltoB2C
Analizar ticket promedio / AOV / política de promos B2C
NUEVO · hueco de la auditoría 07/07. No hay análisis de AOV, estructura de descuentos ni elasticidad B2C. Junto con el CAC:LTV faltante (med-cac-b2c) es la otra pata del denominador: sin AOV ni margen, todo ROAS/CPA "flota sin ancla". Palanca directa de rentabilidad y conversión.
AltoB2C
Todo reporte de venta/pauta muestra el MIX de clientes: nuevos / activos / dormidos que vuelven
PEDIDO JD 14/07: "es sumamente importante con estos reportes poder ver cuántos clientes nuevos están llegando y cuántos dormidos están volviendo". La primera corrida (semana 08-14/07, órdenes TN clasificadas contra el historial de cada cliente) probó el valor: B2C 14 de 36 órdenes (39%) fueron REACTIVACIONES de clientes dormidos 3-17 meses ($817k) + 11 nuevos ($723k); B2B $5,5M de clientes nuevos (21% de la semana) + $2,4M de reactivados — incluidas las 3 PRIMERAS COMPRAS del win-back de JD ($804k de dormidos contactados, la métrica pendiente del proyecto). Integrar la clasificación al reporte semanal cross-canal y como tab del hub (no xlsx suelto): nuevo (0 compras previas) / activo / reactivado (B2C >90d, B2B >60d = def. win-back), con cruce automático a _winback_enviados.json para medir la reactivación del win-back en continuo. Script semilla ya operativo: _Sistema/Scripts/tn_clientes_clase.py.
AltoGlobal
Control de estacionalidad (YoY) en toda comparación de ventana corta
NUEVO · hueco metodológico de la auditoría 07/07. Ninguna comparación (CTR 0,87→1,28%, "móvil convierte mejor", flows/90d, segmentar>>alcance) tiene control año-contra-año; jun-jul es invierno AR + Día del Padre. Sin YoY no se separa deterioro real de efecto estacional. Armar la línea de base histórica por canal para que cada lectura futura tenga contra qué compararse.
MedioGlobal
Tapar el agujero post-clicEl mayor punto de pérdida está DESPUÉS del clic. Candado de los motores nuevos (banda 3).
Arreglá el salto add-to-cart→checkout
CORREGIDO auditoría 07/07: el agujero B2C real es 64% (add_to_cart→begin_checkout: 1.531→555 ses/90d), NO el 18% que decía antes — es 3-4× más grande. Subir el reach de 36% a 50% ≈ +145 compras/90d sobre base de 374. El "B2B 5%" es artefacto de tags (ver med-funnel-tags-b2b). Atacar envío sorpresa, login obligatorio, fricción de pago.
MáximoGlobal
Arreglá la completitud del checkout MÓVIL (no la velocidad general)
CORREGIDO auditoría 07/07: "el móvil convierte 3× peor" es FALSO site-wide — el móvil convierte MEJOR (CR 0,91% vs 0,61% desktop). El problema está DENTRO del checkout: móvil completa al 60% vs 93% desktop. Auditar UX de pago móvil / login obligatorio / costo de envío sorpresa, NO Core Web Vitals genéricos.
AltoB2C
Remarketing de carrito abandonado
El visitante nuevo convierte 3× peor; sin remarketing la primera visita casi no compra.
AltoB2C
A/B del destino del clic (PDP vs home)
Probar el clic del anuncio a la ficha/categoría del producto vs la home. Ataca el CR 0,33% de Meta si gana. Como experimento controlado, NO redirigiendo a la URL de mayor CR (eso es falacia de selección).
MedioB2C
Bajá el myth-busting a la PDP (Tiendanube/ML)
Mapear los mitos que más frenan la compra en AR (¿la proteína daña el riñón?, ¿la creatina retiene líquido?) y responderlos en la ficha, donde está la ansiedad de compra. Bajo costo.
MedioB2C
Cosecha propia · la mina de Mercado LibreEquipo propio (comercial/compras). No depende de Google. Acceso por API a la cuenta EPN STORE habilitado 09/07 (helper meli_api.py) → ahora se audita y opera desde adentro, no por observación externa.
Auditá EPNSTORE desde adentro primero
Catálogo real listado, reputación, estado FULL. Confirmar la cuenta antes de dimensionar cuánto se recupera y por dónde empezar. DESTRABADO 09/07: API conectada (seller 237272870, 474 publicaciones activas, Platinum). En curso: auditoría por API + módulo del hub.
AltoB2C hecho
Monitor que contesta las preguntas de ML al instante
PEDIDO JD 09/07. La pregunta sin responder en ML es un lead caliente que se enfría (quien pregunta está por comprar) y el tiempo de respuesta es factor de ranking del seller. Monitor en la nube que lee las preguntas nuevas por API (questions/search UNANSWERED) y responde al instante. Diseño con candado de seguridad (acción PÚBLICA): auto-responder solo lo de alta confianza con datos ciertos (precio/stock/envío desde la ficha real) y ESCALAR a JD lo dudoso o sensible — nunca inventar. Empezar en modo borrador-con-aviso hasta calibrar, después auto-send. API de escritura ya disponible.
AltoB2C
Listá EPNSTORE a fondo
Natier (todas las variantes, demanda probada), Star, ENA, Gentech. Hoy EPNSTORE lista 1 Natier; un competidor menor lista 10.
MáximoB2C
Reescribí los títulos con fórmula técnica
“Monohidrato micronizada 100% pura” — el claim técnico (forma+dosis+pureza) es la palanca de conversión en ML.
AltoB2C
Conectá Tiendanube → Google Merchant
Bloqueante de Shopping. Sirve también a los motores nuevos (PMax, banda 3).
AltoB2C
Arreglá el feed de Merchant antes de reactivar Shopping
286 imágenes <500px + 4 productos con policy_violation (salud). Arreglarlo primero o se caen del feed.
AltoB2C
Precio quirúrgico por categoría
Buy-box en commodity (omega, colágeno, magnesio); margen firme en premium. NO descontar longevidad/NMN/isolada: ahí el descuento regala margen sin mover volumen.
AltoB2C
Tienda Oficial ML + logística FULL
En los caballos (creatina, whey, magnesio, colágeno). Sube reputación y buy-box.
MedioB2C
Cosecha propia · orgánico (SEO/GEO)Dejar de pagar por lo que ya tenés gratis. No depende de la medición de Google.
Quick wins técnicos
Títulos rotos (home = “EPN Store”, 9 chars), canonicalización (http no-www diluye autoridad), loop 301 en el host B2B. Base del resto.
AltoGlobal
Activá reseñas → estrellas (AggregateRating) en las fichas
0 de 20 hoy, sobre 23k impresiones de product-snippets a 0,33% CTR. Capitalizar las reseñas reales de ML. Empezar por Marine Epic, Marine Pulse, VitaFlex, Magnesio Natier.
AltoB2C
Cosechá las páginas que rankean con 0 clics (metadata ✓)
✅ EJECUTADO 07/07: 115/115 categorías + 1.448/1.465 productos B2C (suplementos 100%; los 17 sin tocar son indumentaria) con título+meta custom por intención, longevidad apuntada, verificado en Tiendanube API + live. OJO: el título rinde en clic recién con re-crawl — medir CTR AR-filtrado a 4-6 sem para aislar el efecto (el CTR del dominio ya subió 0,87→1,28%, pero puede ser estacional). El clic NO despega sin las estrellas → ver seo-resenas-rating. Patrón ganador replicado: “marine epic dónde comprar” 13% CTR. · RE-MEDIDO 04/08 (auditoría del árbol de categorías) — el clic sigue sin despegar y ahora hay números finos: el 89% de las impresiones B2C vienen de PRODUCT_SNIPPETS (23.290 impresiones → 77 clicks = CTR 0,33% en posición media 8,5). Casos concretos: "collagen powder" 11.088 impresiones y CERO clicks en posición 5,3 — es el 42% de TODA la visibilidad B2C en una sola consulta; "creatine monohydrate" 2.277 y 0 clicks; la categoría Magnesio (que existe, rankea y está bien armada) 305 impresiones y 0 clicks; "bisglicinato de magnesio natier" 65 impresiones, 0 clicks, posición 10,2. Es visibilidad enorme sin captura, y el patrón es transversal (no un producto puntual). CANDADO BLANDO sobre cat-arbol-granular-vitaminas: abrir 21 categorías nuevas replica el molde 21 veces — si la causa del 0,33% está en el título/meta, en el precio que se muestra en el snippet o en la falta de estrellas (seo-resenas-rating), se arrastra a cada página nueva. Entender el CTR primero cuesta poco y evita hacer 21 veces el mismo error. Nota de método para futuras mediciones: excluir del ranking de demanda toda consulta con >1.000 impresiones y 0 clicks — dos consultas se comían el 51% de las impresiones y daban a colágeno como la familia más demandada del catálogo cuando su demanda real en español es de 213 impresiones.
AltoB2C hecho
Bajá la pauta donde ya ganás en orgánico
“epn suplementos” ($76k, pos 1,8), “nad resveratrol” (pos 1,2). Coordinar con Mateo. (NO apagar “epn store”, que sí rinde.)
MedioGlobal
Construí el hub de longevidad (blog en el DOMINIO + FAQ H2)
Levantar el blog con guías formato tabla + FAQ (NAD, omega-3, antioxidantes, colágeno) + internal linking del cluster Marine (58 queries hoy sueltas). MATIZ auditoría 07/07: montarlo en epnstore.com.ar/blog, NO en el subdominio blog.epnstore.com.ar (hoy 404): desde subdominio la autoridad NO se transfiere a las fichas (brecha estructural del benchmark global). FAQ como pregunta-H2 + respuesta-primera-frase (Google deprecó el rich-result de FAQPage en 2026; el H2 igual lo cita Perplexity/Bing). Ejecuta el pilar de la banda 4.
AltoB2C
Frente B2B on-page: sameAs + cosecha GOOM (home meta y FAQ ya ✓)
On-page mayorista EJECUTADO 06/07: la meta descripción de la home se cargó con la keyword madre "distribuidor mayorista de suplementos deportivos" (Datos del negocio → Breve descripción; verificado live); se creó la página FAQ live (/preguntas-frecuentes) con Título SEO que lleva la keyword + condiciones + todas las marcas; categorías (102) y productos (796) ya optimizados; loop 301 arreglado. PENDIENTE: (a) el sameAs de la tienda apunta a las redes B2C (@epnstore.ar) → corregir a @epnstoremayoristas (por admin; el API da 401 en el recurso store); (b) cosechar el cluster GOOM (gomitas de creatina, pos 4-8, ~0 clics). El TÍTULO de la home = nombre de la tienda: NO se toca (renombrar afecta mails/facturas; la keyword ya entró por meta + FAQ). Desinfla el cluster de pauta mayorista ($390k/CPA $39k). Doc: auditoria-seo-geo-b2b-2026-06-30.md.
AltoB2B hecho
GEO B2B: hacé citable el mayorista para la IA
El audit del 23/06 descartó el GEO en B2B; el de 30/06 lo refutó: el revendedor le pregunta a la IA "quién me provee por mayor" y EPN es invisible en 9 de 12 consultas (gana Morashop). La IA YA manda 85 sesiones/90d al B2B y convierten 0. No es técnico: el copy de condiciones (tiers/mínimo/marcas) vive en el dominio B2C equivocado → migrarlo a mayoristas.epnstore.com.ar + FAQPage + schema LocalBusiness/NAP. Hueco sin líder editorial AR. PARCIAL 06/07: la página FAQ ya está live con las condiciones (mínimo/marcas/envíos/despacho) — falta el schema FAQPage (Tiendanube no lo emite solo), migrar el relato "por qué EPN" y sumar LocalBusiness/NAP. Doc: auditoria-seo-geo-b2b-2026-06-30.md.
MedioB2B
Google Business Profile del mayorista (señal de entidad)
Crear/reclamar la ficha de Google Business Profile del mayorista (sede Don Torcuato) con NAP consistente. Es lo único del checklist SEO oficial de Tiendanube que falta: ayuda al SEO local Y a que la IA reconozca a EPN como entidad (GEO). Detectado en la auditoría B2B (footprint de entidad).
MedioB2B
Limpiá los typos/duplicados del campo marca del catálogo
El campo "marca" del catálogo mayorista tiene typos y duplicados (Ultratech/UltraTech, Quuz/QUUZ, Hoch Sport/hoch sport/Hosh Sport, Vitatech/Vitatec, Núcleo Fit/Nucleo Fit): ~105 valores para ~65 marcas reales. Fragmenta el filtro por marca de la web (quien filtra una variante no ve los productos cargados con la otra) y ensucia la lista de marcas para la FAQ/GEO. Unificar los valores. Detectado en la auditoría B2B (06/07) sobre 1.487 productos con marca cargada.
HigieneB2B
Cuerpo editorial en las PLP de longevidad (la mitad citable del on-page)
NUEVO · auditoría comparativa 07/07. La cosecha de metadata está al 100%, pero /omega-3/ y /salud-bienestar-y-longevidad/ son GRILLA PURA, sin párrafo ni guía de compra. La IA extrae párrafos autocontenidos, no grillas: el on-page de intención está a mitad de camino. Sumar 2-3 párrafos + guía de compra por categoría de longevidad. Barato y desbloquea citabilidad.
AltoB2C
Matriz objetivo→producto: el calendario de contenido sale del planner
NUEVO · Keyword Planner 10-12/07. Los informacionales POR OBJETIVO suman ~70k búsq/mes a CPC $5-15 (hasta 20× más barato que lo transaccional) y competencia Media/Baja: "para que sirve" (colágeno ~20k, magnesio 22k, creatina 10k), "cuál es la mejor creatina" 2.700 (+19%, formato comparador = GEO puro), "magnesio para dormir" 3.900 (+50% en "cuál es el magnesio para dormir"), cortisol 390 (+50%), articulaciones (glucosamina condroitina +189%, ultraflex huesos +420%), memoria 990. Es punta de embudo para el Content Engine (guiones/blog/FAQ), NO para pauta de conversión. Línea editorial MUJER propia (~4.600/mes: creatina mujer +85%, quemador mujer +425%, "creatina en mujeres" +233%). Alimenta la MISMA matriz producto→objetivos de la taxonomía de tienda (un solo activo: categorías TN + hub longevidad + calendario). Datos: keyword_planner_20260710.json tandas 4a/4b/4c.
AltoB2C
Comparativa honesta por TIPO de omega-3 (el activo más citable por IA)
NUEVO · auditoría comparativa 07/07. La VENTAJA ÚNICA de EPN como retailer multimarca (no dueño) es escribir el ranking honesto que Thorne/Legion no pueden con credibilidad. Captura la búsqueda transaccional caliente ("mejor omega-3 argentina") y es el formato que la IA cita. Por TIPO (marino/vegetal/concentración), NUNCA "Promarine vs ENA" (que se distribuye). Munición gratis: certificaciones IFOS/GOED/Creapure que EPN ya vende y no capitaliza.
AltoB2C
Promarine estructurado para máquinas (canonical + JSON-LD + sitemap + H1)
NUEVO · auditoría comparativa 07/07. El mejor relato de autoridad (CONICET, Dra. Rubilar, espinocromas) es invisible a las máquinas: la IA arma Marine Epic desde la marca madre y ML, nunca desde epnstore. Corre por eje EriSea aparte pero alimenta el topic de longevidad B2C. Agregar canonical + JSON-LD Organization/Product + sitemap + fix del H1 roto en promarine.epnstore.com.ar.
MedioPromarine
CRO tiendas · estructura, medición y pendientes (auditoría 08/07)La parte estructural/medición de la auditoría CRO 08/07 + los chequeos pendientes (verificado por panel adversario). Complementan, no duplican: fun-carrito-checkout/fun-movil (fuga medida), seo-plp-editorial (párrafo PLP), cat-marcas-typos (marca B2B).
Completá la auditoría en MÓVIL + caminá el checkout paso a paso
NUEVO · auditoría CRO 08/07. Toda la auditoría fue desktop y el grueso del tráfico PMax es móvil → se auditó la minoría. Falta lo de MAYOR valor: caminar el checkout móvil paso a paso (¿invitado o login obligatorio? ¿cuántos campos? ¿dónde se rompe?) — es la acción diagnóstica que fun-carrito-checkout (64% fuga) y fun-movil (60% vs 93%) ya necesitaban. Sumar en el mismo pase: buscador interno (probar "creatina"/marcas/typos + "sin resultados"), visibilidad de "cuotas sin interés" en card/PDP/carrito, y cómo renderizan popup/agotados/menú en móvil. El screenshot del panel no anduvo (render pesado de TN) → auditar por árbol/DOM o Chrome real.
AltoB2C
✅ Duplicados fusionados 04/08 — 12 categorías borradas, 0 productos perdidos
NUEVO · auditoría CRO 08/07. Taxonomía B2C sucia: Omega-3 en 4 rutas; "Salud y bienestar1" (con el "1" literal) + "salud-bienestar-y-longevidad" + "bienestar-y-longevidad" = 3 categorías solapadas; Gift Cards ×3; Combos ×2; Antioxidantes ×2. Canibaliza SEO (thin content) + fricción + reparte la metadata de seo-cosecha-onpage entre duplicados. Consolidar con 301 (TN lo soporta por admin, ya usado en minorista) + podar el menú. PREREQUISITO del cluster de longevidad (seo-plp-editorial/seo-hub-longevidad/seo-comparativa-omega3). Sibling de cat-marcas-typos (ese limpia el campo MARCA del catálogo B2B; esto son CATEGORÍAS B2C). · AUDITADO Y CUANTIFICADO 04/08 (pedido de JD, API en vivo de las 2 tiendas — doc: 4-Canales/Tiendanube/auditoria-arbol-categorias-2026-08-04.md). MINORISTA 115 categorías / 1.488 productos: 8 duplicados de nombre exacto. Los caros por volumen: "Colágenos" (top, 62 prod) vs "Suplementos Deportivos > Colágeno" (53) comparten 53 = el 100% de la chica; "Salud y bienestar" (top, 337) vs "Suplementos Deportivos > Salud y bienestar" (192) comparten 179 (93%). Cuatro paraguas para el mismo concepto conviviendo: Salud y bienestar (337) + Salud y bienestar bajo SupDep (192) + "Salud, Bienestar y Longevidad" (6) + "Bienestar y Longevidad" (3) — las dos últimas suman 9 productos entre ambas y cada una arrastra su propio Antioxidantes y su propio Omega 3 adentro (por eso NAD+Resveratrol de VITS figura hoy en 7 categorías). Resto: Omega 3 ×3 (20+2+1, casi sin solapamiento → los productos están REPARTIDOS, no duplicados) · Potenciador sexual ×2 (6 y 5) · Comida Proteica ×2 (15 y 12) · Proteínas Vegetales ×2 (15 y 4, comparten SOLO 1 → el catálogo vegetal está partido en dos) · Gift Cards ×2 (una con 0 productos). CASI-DUPLICADOS sin mismo nombre: "Importados Premium" (44) ~ "Seleccion Premium USA" (44) comparten 34 con 10 exclusivos cada una; "Creatinas" (98) ~ "Creatine Monohydrate" (31) comparten solo 22 → 9 monohidratos NO están en Creatinas y la jerarquía está rota (es hermana en vez de hija). MAYORISTA está MUCHO más limpio: 108 categorías, UN solo duplicado real, y es el mismo — SupDep>Colágeno (57) vs Salud y bienestar>Colágenos (58), comparten 42 (74%). VACÍAS: 7 en minorista, 6 en mayorista. SIN CATEGORÍA: 17 productos en minorista (16 publicados) + 11 en mayorista. DIVERGENCIA ENTRE TIENDAS: 20 categorías idénticas colgadas de padres distintos (Proteínas/Creatinas/Multivitamínicos/Vitaminas y minerales/Magnesio/Bebidas Isotónicas/Barras de Proteína/Ganadores de Peso son top-level en minorista y cuelgan de SupDep o Salud y bienestar en mayorista; "Termos, Vasos y Shakers" vs "Vasos y Shakers") → cada una es una URL distinta que hay que mantener por separado en pauta, feeds de Merchant y links de mails, y obliga a cualquier automatización a llevar dos mapas de IDs. Lo B2B-only (Tipo de negocio, Promos Caja Cerrada, Indumentaria, PROMO Gentech) y lo B2C-only (Combos, Los Más Buscados, Ofertas Relámpago) queda como está — eso es correcto. ORDEN: fusionar duplicados va DESPUÉS de crear el árbol granular (cat-arbol-granular-vitaminas), porque renombrar mueve URLs y crear no. Chequear tráfico por categoría antes de renombrar (ver memoria tn-renombrar-mata-la-url). · ✅ EJECUTADO 04/08 con tn_fusion_go.py, después del árbol nuevo. La que se CONSERVA se eligió por TRÁFICO medido en Search Console, no por cantidad de productos — y en todos los casos coincidió con la del handle limpio: colageno (min 2 imp / may 65 imp) sobre colagenos · proteinas-vegetales (609 imp, 4 clicks — la más traficada de todas y confirma la inversión de surtido) sobre proteina-vegetal · comida-proteica (74 imp) · potenciador-sexual (112 imp) · omega-3 (82 imp) sobre las otras dos · antioxidantes (4 imp). DECISIÓN DE JD sobre "Salud y bienestar", el único caso donde tráfico y arquitectura se contradecían: se conservó la TOP-LEVEL (337 productos) y se borró la de Suplementos Deportivos (192) aunque esta última tenía las 3 impresiones — 3 impresiones es ruido, "Salud y bienestar" colgando de "Suplementos Deportivos" no tiene sentido, y en mayorista es top-level, así que la comunión global pesa más. Se borraron también los 2 paraguas de longevidad (Salud/Bienestar y Longevidad + Bienestar y Longevidad, 9 productos entre ambos) y la Gift Cards vacía. RESULTADO: minorista 146→135 categorías, mayorista 129→128, 50 productos migrados. Verificado contra snapshot previo (_snapshot_pre_fusion.json): 0 productos perdieron una categoría que no fuera la borrada, 0 quedaron huérfanos, 0 categorías sin nombre, los 1.488 y 1.510 productos intactos. ⛔ PENDIENTE MANUAL (la API no lo permite): quedan 2 handles con sufijo numérico —salud-y-bienestar1 y gift-cards1— que deberían tomar la URL limpia que liberó el borrado. La API de Tiendanube devuelve HTTP 500 ante CUALQUIER PUT de categoría que incluya el campo handle, con el valor que sea (probado incluso mandando el handle idéntico al actual): el campo rompe el endpoint. Verificado que el 500 es inocuo, no altera ningún otro campo. Hay que cambiarlos desde el panel a mano; son 2 clicks y ninguna de las dos URLs tiene tráfico. ⚠️ LECCIÓN TÉCNICA CARA de esta sesión: el PUT de categorías es REEMPLAZO TOTAL, no merge — mandar solo {parent: X} al re-colgar borró name, handle y SEO de 6 categorías, que quedaron sin nombre y con la URL rota ~1 hora hasta detectarlo. Todo PUT de categoría reenvía name + handle + seo_title + seo_description + parent aunque cambies uno solo.
AltoB2C hecho
✅ Árbol granular por principio activo EJECUTADO 04/08 — 42 categorías nuevas, 901 productos
NUEVO 04/08 · criterio de JD: cada vitamina y cada mineral tiene su propia categoría, y un producto compuesto figura en TODAS las que declara ("Vitamina C + Zinc" va en Vitamina C Y en Zinc). Aplica a TODOS los productos, no solo vitaminas. FOTO DE HOY (API en vivo, 04/08): "Vitaminas y minerales" es UNA bolsa de 125 productos en minorista y 143 en mayorista, con Vitamina C, D3, K2, B12, magnesio, zinc, potasio, multivitamínicos, jalea real, propóleo y resveratrol todos adentro. El único principio activo con categoría propia es MAGNESIO — y funciona: de 50 productos con magnesio en el nombre, 44 están tagueados (88%). Ese es el precedente a replicar. EL CASO QUE LO DISPARÓ: "Vitamina C + Zinc 60 Cáps (VITS)" hoy está en Salud y bienestar · Vitaminas y minerales · Suplementos Deportivos — ninguna dice C ni Zinc, así que quien busca vitamina C no lo encuentra. VOLUMEN detectado por nombre en el catálogo completo (minorista / mayorista): Magnesio 61/68 (ya existe) · Multivitamínico 28/34 (ya existe) · Zinc 17/20 · Vitamina C 16/18 · Vitamina D3 13/14 · Potasio 8/8 · Vitamina K2 7/8 · Complejo B 4/4 · Vitamina B12 4/5 · Cromo 3/4 · Calcio 3/3 · Vitamina E 3/3 · Vitamina A 3/3. Total alcanzado 172 y 199 productos = 47 y 56 MÁS de los que hoy captura la bolsa (quedan afuera 20+ citratos de magnesio, Complejo B de Vitatech, Calcio 500, 4 citratos de potasio, Daily Multivitamin de Myvitamins). COMPUESTOS a multi-asignar: 21 en minorista y 25 en mayorista — 11 productos ZMA (Magnesio+Zinc), 5 combinados K2+D3 (Vitamina D+Vitamina K), Calcio + Vitamina D, Vitamina C + Zinc, ZMA con B6 (tres categorías). REGLA DE CORTE: se crea categoría con 3 productos o más; con menos (B3, B6, Colina, Selenio, Yodo, Hierro) el producto queda en el paraguas hasta que haya volumen — una categoría de 1 producto es una página vacía que ensucia menú y SEO. CRITERIOS TOMADOS: D y D3 = una sola categoría (D3 es la forma, no otra vitamina); K y K2 = una sola; Complejo B separado de las B individuales (un complejo B no es buscar B12); los minerales cuelgan de "Vitaminas y Minerales", no de un paraguas nuevo (el comprador no distingue vitamina de mineral, busca "magnesio"). TRAMPA VERIFICADA — no se puede automatizar a ciegas por nombre: 19 productos "Iron" de Gentech (Iron Gel, Iron Bar, Iron Drink) son la LÍNEA DE MARCA, no el mineral — hierro real hay UNO solo (Hierro Quelado de Natier); "Guantes Fitness DRB CROMO" son guantes color cromo; "Gift Card Cobre" es un nivel de gift card. La propuesta se genera automática pero se revisa producto por producto antes de escribir en Tiendanube. COROLARIO QUE HOY NO SE CUMPLE: el paraguas siempre se agrega — de los 50 productos con magnesio en minorista solo 16 (32%) están también en "Vitaminas y minerales", por eso el filtro del paraguas miente. Lo bueno: los 113 compuestos de la minorista (nombre con "+") YA tienen 2+ categorías, ninguno tiene una sola → el hábito existe, faltan las categorías finas donde poner los productos. PASOS 1-3 (crear las categorías nuevas en las 2 tiendas · generar propuesta de tagueo · aplicar) son ADITIVOS y reversibles, no mueven ninguna URL existente → se pueden correr antes de tocar los duplicados. Doc completo: 4-Canales/Tiendanube/auditoria-arbol-categorias-2026-08-04.md · EXTENDIDO 04/08 A TODO EL CATÁLOGO (pedido de JD: "revisá el patrón y traé propuestas nuevas, dejamos todo nivel profesional"). Se cruzó cada familia grande contra la demanda real de Search Console (script tn_demanda_vs_catalogo.py). AJUSTE DE CRITERIO DE JD sobre la propuesta original: todas las vitaminas B van JUNTAS en una sola categoría, igual que C o D — una categoría por LETRA, no por subtipo; el detalle fino (B12, complejo, B3) vive en los tags. Los datos lo respaldan: B12 junta 25 impresiones y todas las demás B juntas 19 — no hay volumen que justifique páginas separadas. MAGNESIO va al revés y por eso SÍ se divide: de 444 impresiones solo 14 son "magnesio" a secas, el 97% busca la FORMA → 3 hijas (Citrato 27 prod/52 imp · ZMA 12/76 · Bisglicinato 6/195). No es contradicción: la regla es VOLUMEN DE CATÁLOGO × DEMANDA REAL, no "juntar por letra" ni "separar por subtipo". PROTEÍNAS se dividen por tipo de suero, que es el corte que usa el comprador: Whey concentrada 118 prod/586 imp · Whey aislada 19/192 · Whey hidrolizada 4/2 (caseína 0 y 0 — no hay hueco). CREATINAS: el corte NO es químico sino de marca y formato — monohidrato 47/675 y micronizada 17/452 sí van, pero 1.744 impresiones son genéricas o de marca (goom creatina 249, creatina gold 80) y 433 son de GOMITAS con 1 solo producto → eso es surtido, no árbol (ver b2c-stock-marcas-demandadas). AMINOÁCIDOS: BCAA 32 prod/45 imp es la subfamilia más grande sin página y Glutamina/Beta Alanina ya sientan el precedente; Carnitina 14, Arginina 11, HMB 5 y EAA 4 pasan el corte pero con demanda mínima → ola 2. NO SE DIVIDEN: colágeno (154 de 213 impresiones son genéricas — ahí el trabajo es fusionar el duplicado y taguear), omega 3 (122 de 145 genéricas), quemadores (52 impresiones y casi todas por nombre de producto: thermo fuel max, ripped extreme — es tema de posicionamiento, no de árbol). CAVEAT DE MÉTODO que hay que respetar al leer estos números: la demanda se midió sobre un sitio que HOY NO TIENE esas categorías, así que una demanda baja puede ser consecuencia de no tener la página → el volumen de catálogo decide si se abre (≥3 productos), la demanda decide el ORDEN, no el veto. SISTEMA DE TAGS (criterio JD: "los tags ayudan a mejorar la búsqueda interna"): 6 capas — principio activo, variantes de escritura, permutaciones del nombre, typos, sinónimo técnico↔común, beneficio y formato. Evidencia de que hace falta: los 6 productos de bisglicinato están escritos de 4 FORMAS DISTINTAS (Glicinato / Bis Glicinato con espacio / Bisglicinato / Magnesium Glycinate) y hay 5 permutaciones de "bisglicinato de magnesio natier" sumando 148 impresiones. REGLA DE HIGIENE: un tag vale si alguien podría escribirlo — hoy "fitness" está en 729 productos (la mitad del catálogo) y "salud y bienestar" en 308: devolver 729 resultados es lo mismo que no devolver ninguno. Estado del tagueo: 1.482/1.488 productos tienen tags (291 distintos) pero vitamina d = 0 productos, potasio = 0, calcio = 0, zinc = 2 de 17, vitamina c = 3 de 16; el único que funciona es magnesio (47). La mayorista peor: 424 tags casi todos de marca. Lo cargado con la app del estándar nuevo (VITS) SÍ está bien tagueado — el roto es el catálogo viejo. · ✅ EJECUTADO EN VIVO 04/08 con tn_arbol_v2.py (merge puro: no saca ninguna categoría ni tag, no mueve ninguna URL). MINORISTA 115→136 categorías, 403 productos actualizados, 0 fallos. MAYORISTA 108→129, 498 productos, 0 fallos. Total 42 categorías nuevas y 901 productos. Se re-colgaron además 4 categorías que eran HERMANAS en vez de hijas (Proteínas Vegetales, Proteina Vegetal y Proteínas De Huevo colgaban de Suplementos Deportivos en vez de Proteínas; Creatine Monohydrate de Suplementos Deportivos en vez de Creatinas) — mover de padre no cambia el handle, así que no rompe URLs. EJE "COMPRÁ POR OBJETIVO" (minorista): CERRADO — madre + 9 hijas creadas, 1.194 productos escritos con 0 fallos y 2.135 asignaciones totales, verificadas una por una contra la matriz con 0 incorrectas (Masa 539 · Energía 395 · Salud 374 · Resistencia 241 · Recuperación 225 · Piel y articulaciones 121 · Definición 109 · Control de peso 67 · Sueño 64). El eje TIPO DE NEGOCIO del mayorista NO necesitó re-correrse: se verificó y los 404 productos de las categorías nuevas ya tenían su tipo asignado, porque cada uno sigue estando en su madre y esas madres ya están mapeadas en la regla — la arquitectura de ejes ortogonales hereda sola lo que se agrega debajo, sin mantener dos mapas en paralelo. la matriz se regeneró contra el árbol nuevo y MEJORÓ sola (Recuperación 172→196, Sueño 52→62, Masa 473→493) porque las categorías nuevas aportan señal que antes no existía. El eje Tipo de negocio del mayorista quedó intacto conviviendo con el árbol nuevo. BARRIDO DE VERIFICACIÓN antes de escribir (a pedido de JD: "¿ya investigaste no estar cometiendo el mismo error del óxido nítrico en otra categoría?"): se revisaron las 24 reglas una por una y aparecieron CINCO casos del mismo tipo, todos corregidos — "Whey hidrolizada" se llevaba 10 COLÁGENOS hidrolizados y 1 albúmina; "Whey aislada" se llevaba proteínas VEGETALES aisladas (soja, arveja, plant) y una bebida isotónica (ISO Energy); "Taurina" iba a nacer con 3 productos donde la taurina es ingrediente secundario y NINGUNO es de taurina pura → eliminada; "Creapure" es la MARCA de Alzchem y todo Creapure ya es monohidrato → eliminada, queda como tag; y "ZMA" colgaba de Magnesio cuando es una FÓRMULA (zinc+magnesio+B6), no una sal → pasó a Suplementos Deportivos. Además HMB tenía 3 matches pero 2 eran el mismo producto duplicado con "¡Descuento especial!" → debajo del corte. Y DOS BUGS MÁS aparecieron al ejecutar, en las reglas HEREDADAS del eje de objetivos (fase 1 del 10/07, que no se habían auditado por asumirlas revisadas): "hidroliz → Definición muscular" metía 10 colágenos hidrolizados en definición (DEF 122→98) y "gel\b → Resistencia" matcheaba "SOFTGEL", o sea cápsulas blandas de CLA, vitamina D3 y omega 3 clasificadas como geles energéticos de running (RES 181→177). Se detectaron tras escribir los primeros 15 productos, se auditaron esos 15 contra la matriz corregida, apareció 1 asignación mal y se removió por API antes de seguir. Los dos patrones a recordar: un adjetivo de proceso (hidrolizado, aislado, micronizado) NO identifica el compuesto, y una marca NO es una forma. PENDIENTE: la fusión de duplicados (cat-categorias-duplicadas-b2c), que es el único paso que mueve URLs y por eso va al final.
AltoGlobal hecho
Eje "Suplementos por objetivo" en la tienda B2C (matriz lista → revisar → crear → pauta)
NUEVO 10/07 (idea JD; mismo playbook que el eje "Tipo de negocio" B2B del 08/07). Criterio JD: la matriz se define a nivel PRODUCTO, no categoría (una Iso Whey=definición ≠ whey común=masa) y el eje se diseña para reutilizarse en paid media. FASE 1 HECHA (10/07): matriz producto→objetivos construida (tn_objetivos_b2c.py → _Sistema/analisis-seo/matriz_objetivos_b2c.json + .csv): 1.465 productos, 9 objetivos multi-etiqueta (580 con >1), regla por categoría + refinamiento por nombre, 13 huérfanos legítimos (indumentaria/shaker). Publicados/con stock: Masa 470/109 · Salud 336/70 · Energía 326/89 · Resistencia 181/64 · Recuperación 168/28 · Piel-articulaciones 113/34 · Definición 109/17 · Control de peso 59/6 · Sueño 48/9. HALLAZGO: el eje expone la góndola percha — Control de peso, Sueño y Definición no se pueden abrir (ni en tienda ni en pauta) sin reponer stock → alimenta b2c-stock-marcas-demandadas con la lista de compras por objetivo. FASE 2 (tras revisión de JD sobre la matriz): crear madre+hijas y asignar por API (merge sin tocar el árbol, motor probado en B2B) — en la MISMA pasada que cat-categorias-duplicadas-b2c (no montar el eje sobre el árbol sucio) + título/meta SEO long-tail por hija ("Suplementos para ganar masa muscular"). FASE 3: trasladar el eje a paid media (ad groups/audiencias por objetivo, Search Marcas B2C 24013445742 / PMax / Meta). Nota: demanda por objetivo NO medida (seeds del planner 10/07 fueron de producto) — opcional 15 min de Keyword Planner vía Chrome para nombrar las hijas con el lenguaje real del consumidor.
AltoB2C
Verificá que "Avísame cuando haya stock" esté cableado a Klaviyo
NUEVO · auditoría CRO 08/07. Con los módulos del home tapados de agotados, el "Avísame cuando haya stock" o recupera demanda (si dispara mail de restock por Klaviyo) o es fuga pura. Verificar el cableado a Klaviyo/mail y conectarlo si falta: recupera parte de la demanda que hoy rebota en los best-sellers agotados.
MedioB2C
Verificá la exhibición del precio de contado/lista (Precios Claros)
NUEVO · auditoría CRO 08/07. Otro frente legal, sobre el canal de volumen B2C. Precios Claros (Res. 7/2002 SCI) exige exhibir el precio de contado final; si solo se muestra el precio con "descuento pagando con Transferencia" sin el de lista/contado apareado, hay tema de lealtad comercial. Verificar y aparear. Va junto con b2b-rename-sinfc como el barrido de compliance de precios.
MedioB2C
Medí LCP/Core Web Vitals (afecta CRO y el Quality Score de PMax)
NUEVO · auditoría CRO 08/07. Velocidad/CWV no medidos. Un LCP malo hunde la conversión Y sube el CPC del $28k/día de PMax (Landing Page Experience/Quality Score). Distinto de fun-movil (ese apunta a UX de pago móvil, NO a CWV genéricos). Temas de TN + apps suelen destruir el LCP. Medir en pagespeed.web.dev (home/PLP/PDP, móvil).
MedioGlobal
Verificá el mínimo $300k enforced + el conflicto de canal
NUEVO · auditoría CRO 08/07. Los precios mayoristas + mínimo $300k públicos sin login son tradeoff GEO deliberado (geo-b2b-citable, seo-b2b-landings) — NO se gatean (gatear rompe el GEO B2B). El riesgo real no es "el competidor ve el margen" (mystery-shoppeable igual) sino el conflicto de canal: ¿un consumidor final puede hacer checkout a precio mayorista? ¿el mínimo $300k está enforced como guardrail en el checkout? Eso es lo que hay que chequear.
MedioB2B
Sacá 2 fricciones concretas: buscador sin typos + cartel "monto exacto"
NUEVO · auditoría CRO 08/07, verificado en vivo. (1) BUSCADOR sin tolerancia a typos: "creatna" (falta la i) devuelve "No encontramos nada… escribilo de otra forma", SIN sugerencia, SIN "¿quisiste decir?", SIN productos, SIN CTA = callejón sin salida (en móvil los typos son la norma). El default de TN es flojo → evaluar app de búsqueda con fuzzy match, y rellenar la página de 0-resultados con más vendidos + CTA. (2) Cartel de ADVERTENCIA naranja pegado al "Agregar al carrito": "¡Tené en cuenta abonar el monto EXACTO de tu compra! Caso contrario el sistema marca tu pago como rechazado y la devolución se hace en 72hs hábiles." Mete miedo en el momento de convertir + delata un flujo de transferencia manual frágil. Suavizar/reubicar el copy y, de raíz, revisar el matching de pagos por transferencia.
MedioB2C
Ruta B2B territorial · el canal que no existíaNUEVO 29/07 (pedido de JD). Hallazgo estructural: TODO el B2B nuevo entra hoy por Google/mail/IG — o sea, SOLO el revendedor que ya está buscando proveedor. EPN tiene depósito y local adentro de una de las zonas comerciales más densas del GBA norte y cero motor de captación en la calle. Es el único canal donde EPN gana por algo que un mayorista de Once no puede copiar: estar a diez cuadras. Hoja de ruta completa: 1-Estrategia/research/ruta-b2b-don-torcuato.md
✅ Mapa territorial construido — 3.389 negocios georreferenciados, 78% con teléfono
HECHO 30/07 (Ola 0 de la hoja de ruta). Barrido con Google Places API (New) en 21 categorías sobre 15 km desde el local (Av. Ángel Torcuato de Alvear 2592 → -34,48829 / -58,62092). Salidas en _Sistema/analisis-ruta-b2b/: ruta-b2b-don-torcuato-places.csv (planilla de ruta con columnas vacías para llenar en la calle: visitado, decisor, WhatsApp, resultado) + mapa-ruta-b2b-places.html (navegable, filtros por tier/anillo/categoría, verificado: 3.389 marcadores y filtros exactos) + crudo JSON. Tool: _Sistema/Scripts/ruta_b2b_mapa.py --fuente places. CONTEO por anillo (0=≤3km · 1=≤8km · 2=≤15km): TOTAL 403 / 1.142 / 1.844 = 3.389. Lo relevante: 293 canchas y complejos deportivos · 254 gimnasios y boxes (49 a menos de 3 km) · 250 clubes · 266 minisuper · 212 kioscos · 189 dietéticas (21 a menos de 3 km) · 182 casas de deporte · 172 boxeo/artes marciales · 125 farmacias · 110 nutricionistas · 97 bicicleterías · 41 empresas de VENDING (el multiplicador de la ola 2). 2.657 negocios (78%) traen teléfono y 1.720 (51%) web o IG → se llama antes de ir en vez de golpear puertas a ciegas. LECCIÓN TÉCNICA (sirve para cualquier relevamiento futuro con Places): Text Search corta en 60 resultados POR CONSULTA — con una sola caja de 15 km esos 60 se los comen los negocios lejanos y el centro queda vacío (primera corrida: 1 sola dietética en el anillo 0 contra 21 reales). Se resolvió con un rectángulo POR ANILLO, cada zona con su propio cupo: el anillo 0 pasó de 46 a 403 negocios. Doc: 1-Estrategia/research/ruta-b2b-don-torcuato.md §6.
AltoB2B hecho
✅ Places API operativa — resuelto 30/07 (era un lío de CUENTAS de Google, no de permisos)
RESUELTO 30/07. La key está en ~/.config/google/auth como GOOGLE_PLACES_API_KEY y el barrido corre (ver ruta-b2b-mapa-ola0). ⚠️ LECCIÓN QUE VALE GUARDAR — EPN tiene VARIAS cuentas de Google y varios proyectos de Cloud, y eso hizo perder una hora: la key la generó JD desde epnsuplementos@gmail.com (proyecto 530485050128 / project-c09b36c4-b8f5-43ea-9c5, con prueba gratuita de Maps activa: USD 300 y 90 días), pero Chrome estaba logueado con juandiegosagasti@gmail.com, que NO tiene acceso a ese proyecto ("Necesitas acceso adicional", falta resourcemanager.projects.get) → parecía que la key era de un tercero cuando era propia. Y ninguno de los dos es el proyecto del OAuth de Google Ads (962155952008). REGLA PRÁCTICA para la próxima: antes de diagnosticar permisos en Google Cloud, confirmar CON QUÉ CUENTA está abierta la consola — se fuerza con &authuser= en la URL. Cuota: 10.000 llamadas/mes por SKU sin costo; el barrido completo (21 categorías × 3 anillos) son ~450 llamadas, entra holgado. Comando: python ruta_b2b_mapa.py --fuente places --km 15
AltoB2B hecho
Decidí el "Pedido Zona": el mínimo de $300k deja afuera al 60% de la ruta
DECISIÓN de JD/Comercial, y es la que gobierna la mitad de la hoja de ruta. Hoy: primer pedido mínimo $300.000 · reorden $150.000. Una dietética o una tienda de suplementos llega; un gimnasio, una cancha de pádel, una bicicletería o la cantina de un club NO — ese negocio compra 3 cajas de barritas, 2 de isotónicas y un display de geles: $60.000-$150.000. Con el mínimo nacional, ~2.000 de los 3.141 negocios del mapa se caen en la puerta. PROPUESTA: mínimo $80.000-$120.000 SOLO dentro del radio de reparto propio, con la MISMA lista de precios (se toca el mínimo, no el precio). Por qué así: bajar precio rompe la lista nacional y te lo reclama el cliente grande al día siguiente; bajar el mínimo no le saca nada a nadie. El mínimo alto existe porque servir un pedido chico a 600 km no cierra — a 3 km el costo de servir es casi cero, y esa geografía es exactamente lo que ningún competidor de Once o del interior puede replicar. Es un producto comercial nuevo y defendible, no un descuento. Sin esta decisión, las olas 3 y 4 no salen.
MáximoB2B
Encuesta de reparto a 478 mayoristas de CABA/GBA — armada, frenada hasta que el form identifique a quien responde
NUEVO 30/07 (pedido de JD). Mide la demanda de reparto propio ANTES de montarlo, y alimenta directo la decisión de ruta-b2b-pedido-zona. HALLAZGO QUE LA HABILITÓ: la zona de los clientes NO vive en el campo nativo de ubicación de Klaviyo (solo 25% cargado) sino en las properties $region/$zip. El 73% de la lista B2B figuraba sin zona, pero al abrirlo resultó que de los 1.181 mayoristas que ALGUNA VEZ COMPRARON, CERO están sin código postal — el agujero es todo gente registrada que nunca pasó un pedido (2.116) o que ni figura en Tiendanube (215). O sea: la base de compradores estaba sana, el 73% era ruido. DATO ESTRUCTURAL: un tercio de todos los compradores B2B (389 de 1.181) está dentro del radio de reparto — eso valida solo la hipótesis de la ruta. AUDIENCIA CONSTRUIDA: 478 perfiles (107 CABA + 339 GBA + 32 La Plata/Ensenada/Berisso · 414 compradores + 64 registrados sin compra). Se recuperaron 148 CP que Klaviyo no tenía, todos vía API viva de Tiendanube (el snapshot CSV de mayo y Kommo no aportaron nada: Kommo tiene la dirección VACÍA en las 20.463 filas). Excluidos: 4 perfiles con store_origin=B2C, 2 internos (uno era ventas@epnstore.com.ar, el propio remitente) y 2 falsos positivos por CP mal tipeado (Río Cuarto con CP 1428, Rawson/San Juan con 1754) — regla que quedó: la provincia viene de dropdown y el CP se tipea a mano, si se contradicen gana la provincia. ARCHIVOS: audiencia + mail en _Sistema/analisis-ruta-b2b/, doc completo en 1-Estrategia/research/encuesta-reparto-zona-amba.md. ⚠️ FRENADO POR DECISIÓN DE JD: el Google Form (forms.gle/38YXzPYSj5Kfv1eJ6) pide solo "Nombre y Apellido" — sin mail ni teléfono, y con ninguna pregunta obligatoria. Así se pueden juntar 40 respuestas útiles ("sí, martes a la mañana") sin saber de quién son ni a quién llamar, que es exactamente lo contrario del objetivo (levantar interesados para que Comercial los trabaje). DESTRABA CON: Configuración → Respuestas → Recopilar direcciones de correo, o un campo de WhatsApp obligatorio. Nada escrito en Klaviyo todavía.
AltoB2B Necesita que el formulario identifique a quien responde
Ola 1: caminá el core (dietéticas + gimnasios y boxes) — no depende de nada
Arranca sin ningún candado: buyer, ángulo, tono y material YA existen en el cerebro (3-Segmentos/Mayorista: Buyer 2 dietéticas "la demanda ya está" · Buyer 3 gimnasios "lo que ya tenés y no te diste cuenta"), así que no hay que crear nada. Es la ola que valida si el formato ruta funciona, al menor costo de preparación. EN EL MAPA: 254 gimnasios y boxes (49 a menos de 3 km, 83 más entre 3 y 8) + 189 dietéticas y tiendas naturales (21 a menos de 3 km, varias sobre la propia Av. Ángel T. de Alvear — la más cercana a 160 metros del local) + 98 tiendas de suplementos. Con teléfono el 78% → la ola se puede empezar llamando, no caminando. PROTOCOLO: la primera visita NO es para vender — es para llevarse el nombre del que decide, su WhatsApp, una foto de la góndola y una razón concreta para volver; con esos 4 datos el seguimiento lo hace el sistema (Kommo + comunidad de WhatsApp + mail), que es donde EPN ya es fuerte. Kit: lista por perfil con precio sugerido al público al lado (el margen es el argumento, no el precio de compra), muestras de barrita/gel/isotónica, exhibidor de mostrador con cartel, QR a mayoristas.epnstore.com.ar y a la comunidad. REQUISITO REAL: una persona con la ruta en su agenda semanal y carga en Kommo el MISMO día (origen "ruta-territorial" para poder aislarla del B2B digital). Sin dueño asignado la ruta muere en la semana 2 — es lo que mata al 100% de las rutas.
MáximoB2B
Ola 2: los multiplicadores — 5 reuniones pueden pesar más que 200 visitas
Corre EN PARALELO a la ola 1 (son reuniones que se agendan mientras se camina, no visitas). (1) EMPRESAS DE VENDING: el mapa ya trae 41 (OSM no veía ninguna) — manejan cientos de máquinas en oficinas, fábricas y gimnasios: una cuenta = 100 puntos de venta. (2) DISTRIBUIDORAS DE GOLOSINAS/KIOSCO Y BEBIDAS: ya tienen armada la ruta de kioscos que EPN nunca va a poder recorrer — venderles a ellos es palanca 10× sobre el tier kiosco (por eso los 212 kioscos del mapa NO se hacen a pie). (3) COUNTRIES Y BARRIOS CERRADOS: un contacto con la administración abre 3 puntos de venta (gimnasio + proveeduría + buffet del club house) con la clientela de mayor poder adquisitivo de la zona. (4) NUTRICIONISTAS: 110 en el mapa (11 a menos de 3 km) — no compran volumen, RECOMIENDAN: el canal más barato de conquistar y el que más vende sin ocupar stock. (5) PARQUE INDUSTRIAL DE DON TORCUATO: venta corporativa + vending, a minutos del depósito. Countries/barrios cerrados y parque industrial no salen como POI: esos dos se relevan a mano.
AltoB2B
3
Banda 3 · prioridad

Detrás de un candado

Lo único que sí tiene una dependencia real. El candado dice exactamente qué falta. En cuanto ese habilitador de la banda 2 esté listo, este paso pasa a “hacé ya”.
0/11 pasos
Por qué esta prioridad: Ejecutar esto sin el habilitador es decidir con datos rotos: reasignar sin margen, escalar Meta sobre ROAS fantasía, abrir motores nuevos hacia un carrito que pierde.
Tests que deciden las apuestas grandesBaratos de correr (apagar y medir). Deciden palancas de presupuesto grandes.
Test de incrementalidad de MARCA en search
Apagá la puja de marca unos días y medí si las ventas caen (pago incremental) o migran gratis al orgánico (era recompra). Decide cuánto del 86×/95× es plata real, y si la “canibalización” es recuperable.
MáximoGlobal Necesita la medición limpia (banda 2)
Test de incrementalidad de META (geo-holdout)
NUEVO en julio: antes de recortar Meta por su CR bajo, un geo-holdout / pausa controlada para saber cuánto de Meta es incremental. El CR bajo actual está contaminado por la medición rota — no se recorta sin esto.
AltoGlobal Necesita el pixel Meta separado
Escalar / reasignar con los números limpios
Reasigná el mix por contribución, no por ROAS
Mover presupuesto por contribución real, no por el ROAS inflado por marca. Es la reestructuración del paid media.
AltoGlobal Necesita el margen documentado (banda 2)
Meta B2B Marcas: escalá (95×)
Subir con tope, monitoreando compresión. Pero el 95× es fantasía hasta separar el pixel.
AltoB2B Necesita el pixel Meta por segmento
Meta B2B RMK: escalá el retargeting caliente (31×)
Audiencia tibia que ya te conoce.
AltoB2B Necesita el pixel Meta por segmento
Abrir motores nuevosPlata nueva (apuesta). Se abre cuando la base mide y el funnel no pierde.
Google PMax Compra B2C (7,7×)
Era el motor de clientes nuevos.
AltoB2C Necesita el feed Merchant arreglado + funnel tapado
Search no-brand B2C (6,7×) + B2B (4,0×)
Demanda nueva pura, hoy apagada. Captura al que busca “comprar creatina” / “mayorista de suplementos”.
AltoGlobal Necesita medición limpia + funnel tapado
Reactivá WhatsApp B2B ($1M parado)
1.235 conversaciones sin trackear.
AltoB2B Necesita Kommo midiendo (banda 2)
Motor wellness mujer 40+ (magnesio/colágeno)
En Meta a Tiendanube. Menos saturación de pauta; la tendencia global lo confirma.
MedioB2C Necesita el funnel tapado
Ruta B2B · las olas que esperan una decisiónNUEVO 29/07. Las olas 3 y 4 de la ruta territorial no son "más adelante en el tiempo": son "después de X". El mapa (3.141 negocios) ya está construido y estos negocios están adentro — lo que falta no es información, es una decisión comercial y un legajo.
Ola 3: punto de consumo denso (canchas, clubes, bicicleterías, casas de deporte, minisuper)
Es la ola de mayor volumen del mapa: 293 canchas y complejos deportivos + 266 minisuper/autoservicio/almacén + 250 clubes + 182 casas de deporte + 172 boxeo y artes marciales + 97 bicicleterías. Ticket chico, alta frecuencia, y la ventaja de la distancia jugando al máximo. DOS COSAS QUE NO SON OBVIAS: (1) "clubes" son DOS clientes en la misma dirección — la cantina la maneja un concesionario que decide en 5 minutos, el club decide en comisión directiva y tarda meses: se arranca SIEMPRE por el concesionario, y si funciona él te abre la puerta institucional. (2) el dueño de una cancha o un gimnasio NO es comerciante: si no le llevás el exhibidor, el cartel con precio sugerido y las 3 SKUs elegidas, no vende — hay que hacerle el trabajo. Ojo también con no prometer exclusividad de zona para cerrar una venta: es irreversible y te bloquea la manzana entera.
AltoB2B Necesita la decisión del "Pedido Zona" (ruta-b2b-pedido-zona): con el mínimo de $300k esta ola no cierra ni una cuenta
Ola 4: institucionales lentos (farmacias, geriátricos, ortopedias, kinesiología)
En el mapa: 125 farmacias + 140 kinesiología/fisioterapia + 107 geriátricos + 88 ortopedias. Ciclo de decisión largo — se siembra temprano y se cosecha tarde, así que la primera visita conviene hacerla antes de necesitarla. FARMACIAS: solo independientes (las de cadena compran centralizado), hablan idioma dermo/nutrición y NO deportivo, y ya tienen droguería con logística y plazos → se compite por la categoría que la droguería no les cubre bien (vitaminas, magnesio, colágeno, omega 3), nunca por precio. GERIÁTRICOS: compra institucional recurrente y previsible (proteína por sarcopenia, colágeno, vitaminas) y nadie del rubro fitness los toca — de lo mejor del mapa y no estaba en la lista original de JD. ORTOPEDIAS: colágeno, magnesio, articular; tampoco se los ofrece nadie.
MedioB2B Necesita el legajo ANMAT (RNE/RNPA) armado en PDF: farmacias y geriátricos lo piden antes de comprar, y sin eso la visita se quema y no volvés a entrar
4
Banda 4 · prioridad

Juego largo

No es apuesta ni urgencia: es construir margen y marca sobre la base ya sana. Se hace bien cuando la base ya mide y convierte.
0/5 pasos
Por qué esta prioridad: Es el norte donde EPN deja de pulir la forma del guión y construye el territorio (longevidad, autoridad) que un fabricante no puede copiar.
Ticket y verticales
Vertical Longevidad: el pilar
Marine Epic caballito (mejor CPA B2C) + NAD+Resveratrol (#1 orgánico). El hub de contenido lo ejecuta la banda 2 (SEO); acá vive la estrategia del territorio donde EPN puede dominar.
AltoB2C
Combos + planes 90 días
Subir el ticket promedio.
MedioB2C
Reposicionar creatina (cognición / mujer / +50)
No solo gym — ángulo desocupado, tendencia 2026.
MedioB2C
Serie orgánica “los más vendidos de Argentina”
Prueba social: “+250mil eligieron · 4.8★”. Reposicionar el RELATO, no solo el ranking de Ads.
MedioB2C
Incorporar Natufarma + ashwagandha KSM-66
Abre mujer 35+ no-deportista, cero canibalización.
MedioB2C
El norte (a dónde llega el camino): medir lo caro, destopar lo comprobado, dominar el buy-box, cosechar el orgánico, construir la vertical de longevidad. EPN deja de pulir la forma del guión y empieza a mover las palancas de plata real.
Power Marketing · EPN
Roadmap macro EPN · organizado por prioridad (bandas), no por cadena. Síntesis de todas las auditorías (transversal, Google+GA4+GSC, inteligencia ML, presupuesto paid media, SEO/GEO, longevidad) + auditoría mensual julio 2026. Progreso: data/roadmap-progress.json. Tus tildes pendientes se guardan en este navegador; lo oficial lo sincroniza el cerebro. Generado 05/09/2026.