Módulo 8: Project Define Mercados Strategy
La capa de moats
Descripción
La cuarta capa del one-pager responde la pregunta que quedó abierta al final de la lección anterior: el espacio competitivo de Mercado está despejado hoy, pero tiene fecha de vencimiento — ¿qué, exactamente, va a defenderlo cuando alguien lo intente en serio? Esta lección corre moatScore sobre el inventario completo de ocho candidatos del módulo 6 — no solo los dos más repetidos, el inventario entero — y llena la capa moats del one-pager con un veredicto que no admite atajos: moat real, weak-moat, o, con toda honestidad, no es un moat todavía.
Conexión con el módulo. Esta lección reutiliza moatScore y el inventario completo de ocho candidatos verbatim del módulo 6, sin ningún cambio. El resultado de esta capa es el insumo que la lección 8 va a cruzar contra el filtro estratégico: una apuesta que pertenece a la estrategia pero no profundiza ningún moat real no es una mala apuesta, pero sí una que el equipo debería mirar con otros ojos.
Una analogía cotidiana: la inspección del castillo, no solo de la torre más fotografiada
El módulo 6 abrió con la imagen de dos castillos que se ven casi idénticos desde el camino, y cerró con un ingeniero militar recorriendo el castillo entero, estructura por estructura, sin dejarse impresionar por la fachada más bonita ni desanimar porque una estructura no tuviera nombre elegante. Esta capa del one-pager hereda exactamente ese estándar: no basta con auditar los dos moats más mencionados en las conversaciones de pasillo del equipo (sellerNetwork, purchaseData) — hay que poner el mismo criterio sobre todo el inventario, incluida la diferenciación que la lección anterior acaba de celebrar con evidencia sólida.
Ejemplo trabajado: la auditoría completa, ocho candidatos, un solo criterio
Corremos moatScore sobre el inventario completo: cuatro candidatos que ya conoces por nombre (sellerNetwork, purchaseData, fasterCheckout, curatedDiscovery — este último, la diferenciación que la lección 4 acaba de confirmar como real) y cuatro más (logisticsNetwork, sellerToolsWorkflow, localSellerTrust, mercadoBrand).
function moatScore(advantage) {
const { name, type } = advantage;
let durability;
let rationale;
switch (type) {
case 'networkEffect': {
const { sides, localDecay } = advantage;
durability = sides >= 2 ? 8 : 5;
if (localDecay) durability -= 3;
rationale = `network effect ${sides}-sided${localDecay ? ', con decay local' : ', sin decay'}`;
break;
}
case 'switchingCost': {
const { depth } = advantage;
const depthScore = { contractual: 3, habit: 5, dataAndWorkflow: 8 };
durability = depthScore[depth] ?? 3;
rationale = `switching cost de profundidad '${depth}'`;
break;
}
case 'scaleEconomies': {
const { fixedCostShare } = advantage;
durability = Math.round(fixedCostShare * 10);
rationale = `economias de escala con ${Math.round(fixedCostShare * 100)}% de costo fijo`;
break;
}
case 'dataMoat': {
const { feedbackLoop, uniqueToUs } = advantage;
durability = feedbackLoop ? 7 : 2;
if (feedbackLoop && uniqueToUs) durability += 2;
rationale = feedbackLoop ? `los datos alimentan un loop que mejora el producto${uniqueToUs ? ' y son exclusivos' : ''}` : 'los datos se acumulan pero no retroalimentan el producto';
break;
}
case 'brand': {
const { pricingPower } = advantage;
durability = pricingPower ? 6 : 2;
rationale = pricingPower ? 'la marca cambia el comportamiento de compra (tolera precio o fricción)' : 'la marca es reconocida pero no cambia comportamiento de compra';
break;
}
case 'feature': {
const { timeToCopyWeekends } = advantage;
durability = Math.max(0, Math.min(3, timeToCopyWeekends));
rationale = `feature copiable en ~${timeToCopyWeekends} fin(es) de semana`;
break;
}
default: {
durability = 0;
rationale = 'tipo de ventaja desconocido';
}
}
durability = Math.max(0, Math.min(10, durability));
const verdict = durability >= 7 ? 'moat' : durability >= 4 ? 'weak-moat' : 'not-a-moat';
return { name, type, durability, verdict, rationale };
}
const candidates = [
{ name: 'sellerNetwork', type: 'networkEffect', sides: 2, localDecay: false },
{ name: 'purchaseData', type: 'dataMoat', feedbackLoop: true, uniqueToUs: true },
{ name: 'logisticsNetwork', type: 'scaleEconomies', fixedCostShare: 0.8 },
{ name: 'sellerToolsWorkflow', type: 'switchingCost', depth: 'dataAndWorkflow' },
{ name: 'localSellerTrust', type: 'brand', pricingPower: true },
{ name: 'curatedDiscovery', type: 'feature', timeToCopyWeekends: 3 },
{ name: 'fasterCheckout', type: 'feature', timeToCopyWeekends: 1 },
{ name: 'mercadoBrand', type: 'brand', pricingPower: false },
];
console.log('=== moats: la auditoría completa de Mercado ===\n');
const audit = candidates.map(moatScore);
console.table(audit);
const realMoats = audit.filter((a) => a.verdict === 'moat');
const weakMoats = audit.filter((a) => a.verdict === 'weak-moat');
const notMoats = audit.filter((a) => a.verdict === 'not-a-moat');
console.log(`\nMoats reales (${realMoats.length}/${candidates.length}): ${realMoats.map((a) => a.name).join(', ')}`);
console.log(`Weak moats (${weakMoats.length}/${candidates.length}): ${weakMoats.map((a) => a.name).join(', ')}`);
console.log(`No son moat (${notMoats.length}/${candidates.length}): ${notMoats.map((a) => a.name).join(', ')}`);
Qué esperar. Al correr el archivo con Node, la salida es exactamente esta:
=== moats: la auditoría completa de Mercado ===
┌─────────┬───────────────────────┬──────────────────┬────────────┬──────────────┬──────────────────────────────────────────────────────────────────────────┐
│ (index) │ name │ type │ durability │ verdict │ rationale │
├─────────┼───────────────────────┼──────────────────┼────────────┼──────────────┼──────────────────────────────────────────────────────────────────────────┤
│ 0 │ 'sellerNetwork' │ 'networkEffect' │ 8 │ 'moat' │ 'network effect 2-sided, sin decay' │
│ 1 │ 'purchaseData' │ 'dataMoat' │ 9 │ 'moat' │ 'los datos alimentan un loop que mejora el producto y son exclusivos' │
│ 2 │ 'logisticsNetwork' │ 'scaleEconomies' │ 8 │ 'moat' │ 'economias de escala con 80% de costo fijo' │
│ 3 │ 'sellerToolsWorkflow' │ 'switchingCost' │ 8 │ 'moat' │ "switching cost de profundidad 'dataAndWorkflow'" │
│ 4 │ 'localSellerTrust' │ 'brand' │ 6 │ 'weak-moat' │ 'la marca cambia el comportamiento de compra (tolera precio o fricción)' │
│ 5 │ 'curatedDiscovery' │ 'feature' │ 3 │ 'not-a-moat' │ 'feature copiable en ~3 fin(es) de semana' │
│ 6 │ 'fasterCheckout' │ 'feature' │ 1 │ 'not-a-moat' │ 'feature copiable en ~1 fin(es) de semana' │
│ 7 │ 'mercadoBrand' │ 'brand' │ 2 │ 'not-a-moat' │ 'la marca es reconocida pero no cambia comportamiento de compra' │
└─────────┴───────────────────────┴──────────────────┴────────────┴──────────────┴──────────────────────────────────────────────────────────────────────────┘
Moats reales (4/8): sellerNetwork, purchaseData, logisticsNetwork, sellerToolsWorkflow
Weak moats (1/8): localSellerTrust
No son moat (3/8): curatedDiscovery, fasterCheckout, mercadoBrand
Esta capa produce el hallazgo más incómodo, y más importante, de todo el one-pager: curatedDiscovery — la diferenciación real que la lección 4 acaba de confirmar con evidencia sólida, el corazón mismo de la propuesta de valor de Mercado — sale durability: 3, 'not-a-moat'. Esto no contradice la lección anterior: la diferenciación sigue siendo real, sigue sirviendo al segmento mejor que las alternativas, y sigue siendo la razón exacta por la que Mercado gana el segmento explorers hoy. Lo que este resultado dice, con precisión, es que esa ventaja todavía no está protegida: vive hoy como un algoritmo que cualquier competidor con buen equipo de ingeniería podría replicar en unas semanas, no como un mecanismo estructural. Cuatro moats reales sí cruzan el umbral — sellerNetwork, purchaseData, logisticsNetwork, sellerToolsWorkflow — cada uno por un mecanismo independiente, y ninguno de ellos es la diferenciación que el segmento realmente percibe hoy.
Profundización: la diferenciación y el moat son capas distintas, a propósito
Esta es la tensión central que las lecciones 4 y 5 juntas exponen, y que ninguna de las dos, por sí sola, podría mostrarte: diferenciación real (lección 4) responde "¿ganamos hoy, frente a los rivales de hoy?" — y la respuesta, para curatedDiscovery, es un sí rotundo. Moat (esta lección) responde una pregunta completamente distinta: "¿seguirá siendo nuestra si alguien la ataca en serio?" — y la respuesta, para ese mismo curatedDiscovery, es todavía no. Un equipo que solo mira differentiationMap se sentiría completamente seguro; un equipo que solo mira moatScore podría concluir, erróneamente, que Mercado "no tiene nada real". Ambas lecturas están incompletas. La verdad completa —diferenciación real, hoy sin protección estructural— solo aparece cuando corres las dos capas y las lees juntas, exactamente como acabas de hacer.
Errores comunes
Auditar solo los dos moats "famosos" del módulo 6 y saltarse la diferenciación de la lección 4. Qué pasa: el equipo repite el análisis de sellerNetwork y purchaseData —los ejemplos que más se repitieron en el módulo 6— y nunca somete curatedDiscovery (la diferenciación central de la propia lección anterior de este módulo) al mismo criterio. Por qué pasa: los ejemplos repetidos se sienten "ya resueltos", y la diferenciación recién confirmada se siente "ya probada" por la lección 4 — sometrla otra vez a un criterio distinto se siente redundante. Cómo detectarlo: si tu inventario de moats no incluye explícitamente cada dimensión que differentiationMap marcó como diferenciación real, tienes un punto ciego exactamente donde más importa. Cómo corregirlo: el inventario de esta lección siempre debe incluir, como mínimo, cada pilar que la capa howToWin acaba de confirmar — es la conexión más importante entre las dos capas.
Colapsar weak-moat en la misma categoría que moat o que not-a-moat. Qué pasa: al presentar el resultado, alguien simplifica a "tenemos cinco moats" (sumando localSellerTrust a los cuatro reales) o, en la dirección contraria, "solo tenemos cuatro cosas que valen algo" (descartando localSellerTrust junto con las features), perdiendo la información específica del veredicto intermedio. Por qué pasa: comunicar tres categorías es más incómodo que comunicar dos, y la tentación de simplificar borra justo el matiz que el modelo se esforzó en capturar. Cómo detectarlo: si tu resumen de la capa moats usa solo dos categorías donde el modelo produjo tres, perdiste información real en la traducción. Cómo corregirlo: comunica siempre los tres grupos por separado, con weak-moat marcado explícitamente como "real pero frágil, candidato a profundizar".
Cerrar la capa sin nombrar qué haría falta para que curatedDiscovery se convierta en moat. Qué pasa: el equipo acepta el resultado curatedDiscovery: not-a-moat como un hecho fijo, sin preguntarse qué cambiaría ese veredicto, y sigue tratando esa diferenciación como si ya estuviera protegida. Por qué pasa: el modelo entrega un veredicto binario por candidato (moat / weak-moat / not-a-moat), y es fácil leerlo como un estado permanente en vez de como una fotografía del diseño actual. Cómo detectarlo: si nadie en el equipo puede nombrar, después de ver esta auditoría, un cambio de arquitectura concreto que movería curatedDiscovery de 'feature' a otro tipo, la auditoría se quedó en diagnóstico puro. Cómo corregirlo: conectar curatedDiscovery al mismo ciclo de datos que ya demostró funcionar en purchaseData (feedbackLoop: true, durability: 9) movería esa diferenciación de tipo 'feature' a 'dataMoat' — el mismo camino que el módulo 6 ya señaló, y que la lección 8 de este módulo va a marcar explícitamente como la brecha más urgente del roadmap final.
Ejercicios
Ejercicio 1 — Agrega un noveno candidato. Mercado evalúa lanzar un sistema de recomendaciones que aprende del historial de compra de cada usuario específico (no solo tendencias generales), alimentando directamente el ranking de búsqueda. ¿Qué type le asignarías, con qué parámetros, y qué verdict esperarías?
Ver solución
Una versión razonable: { name: 'personalizedRanking', type: 'dataMoat', feedbackLoop: true, uniqueToUs: true } — describe exactamente el patrón que hace que purchaseData sea un moat real: los datos retroalimentan el producto (el ranking mejora con cada compra) y son exclusivos de Mercado (nadie más tiene ese historial específico). Con esos parámetros, durability sería 7 + 2 = 9, verdict: 'moat' — el mismo resultado que purchaseData, porque es, en esencia, una extensión del mismo mecanismo.
Ejercicio 2 — El escenario de erosión de sellerToolsWorkflow. Si Mercado migrara sus herramientas de vendedores a una plataforma más simple, más fácil de abandonar (depth: 'habit' en vez de 'dataAndWorkflow'), ¿qué le pasaría al verdict?
Ver solución
depthScore['habit'] es 5, comparado con depthScore['dataAndWorkflow'] que es 8. El durability caería de 8 a 5, y el verdict bajaría de 'moat' a 'weak-moat'. Es una ilustración directa de una decisión de arquitectura —qué tan profundo integras los datos y el flujo de trabajo de un usuario— que cambia, con la misma fórmula, si algo cruza o no el umbral de moat real. La decisión de "simplificar" una herramienta puede, sin que nadie lo note en el momento, debilitar un moat real.
Ejercicio 3 — Presenta el hallazgo incómodo al equipo fundador. Escribe, en un párrafo, cómo explicarías a el equipo fundador de Mercado que su diferenciación central (curatedDiscovery) todavía no es un moat, sin que suene como que la lección 4 (donde la celebraron como ventaja real) estaba equivocada.
Ver solución
Un ejemplo de respuesta: "La diferenciación que confirmamos en la capa anterior sigue siendo completamente real — ganamos el segmento hoy, con margen claro, gracias a curatedDiscovery. Lo que esta auditoría agrega no es una corrección, es una capa de información distinta: esa ventaja, hoy, vive como un buen algoritmo, no como algo que un competidor con recursos no pueda replicar en unas semanas. No es que estemos perdiendo — es que todavía no construimos la parte que hace que ganar hoy se convierta en seguir ganando dentro de un año. La buena noticia es que ya sabemos exactamente qué haría falta: conectar la curaduría al mismo ciclo de datos de compra que ya demostramos que funciona en otra parte del producto."
Resumen y siguiente paso
En esta lección llenaste la cuarta capa del one-pager: moats, auditada sobre el inventario completo de ocho candidatos, sin excepciones por lo repetido o lo célebre. El resultado: cuatro moats reales por cuatro mecanismos distintos, un weak-moat real pero frágil, y el hallazgo que conecta directamente con la lección anterior — la diferenciación central de Mercado, curatedDiscovery, todavía no está protegida por ningún mecanismo estructural.
Antes de avanzar deberías poder: explicar por qué diferenciación real y moat son preguntas distintas, y nombrar el camino concreto que movería curatedDiscovery de 'feature' a 'dataMoat'.
La lección 6 llena la quinta capa: el filtro estratégico, aplicado al backlog completo de Mercado — la pregunta de qué apuestas pertenecen al juego que las cuatro capas anteriores acaban de definir.
Recursos
- Hamilton Helmer, 7 Powers — 7powers.com. El vocabulario técnico completo detrás de los cuatro moats reales de esta auditoría — network effects, switching costs, economías de escala, datos. En inglés.
- Investopedia, "Economic Moat" — investopedia.com/terms/e/economicmoat.asp. La metáfora completa del foso, para releer con el inventario de ocho candidatos de Mercado ya clasificado. En inglés.
- Ben Thompson, "Aggregation Theory" — stratechery.com/aggregation-theory. El argumento de fondo sobre datos y efectos de red como moats digitales — el mismo mecanismo que separó
purchaseData(moat real) decuratedDiscovery(todavía no) en esta auditoría. En inglés.