Módulo 6: Moats And Defensibility
Por qué una feature no es un moat
Descripción
Las cinco lecciones anteriores recorrieron los cinco caminos que sí pueden llegar a 'moat'. Esta lección hace lo contrario: se detiene en el sexto tipo que moatScore reconoce, 'feature', y explica con precisión por qué su fórmula lo condena, por diseño, a nunca cruzar ni siquiera el umbral de 'weak-moat'. No es un descuido del modelo — es la tesis completa del módulo, aislada en un solo tipo: una feature, sin importar cuánto tiempo tardó en construirse, no es lo mismo que una ventaja difícil de erosionar.
Esta es, probablemente, la lección más incómoda del módulo para cualquier equipo de ingeniería, porque pone bajo la lupa exactamente el tipo de trabajo del que un equipo suele estar más orgulloso: la feature bien construida, bien pulida, celebrada en la última demo. La lección no dice que esas features sean malas — dice, con precisión, qué tipo de valor entregan, y qué tipo de valor no.
Conexión con el módulo. Las lecciones 3, 4 y 5 recorrieron networkEffect, switchingCost, dataMoat y scaleEconomies — los cuatro caminos, junto con brand de la lección 2, que sí llegan a moat. Esta lección cierra el recorrido de tipos con el que nunca llega, y conecta directamente con la diferenciación del módulo 4: una diferenciación real de hoy —algo que de verdad te distingue del competidor— puede, sin ninguna contradicción, no ser un moat, si cualquiera la copia el próximo trimestre. La lección 7 toma esta misma pregunta y la convierte en una decisión de arquitectura: la misma iniciativa, construida de una forma, se queda en 'feature'; construida de otra, cruza a un tipo real.
Una analogía cotidiana: el escudo pintado, otra vez, con la prueba exacta
El módulo abrió con dos castillos: uno con foso, otro con un portón de madera tallada y un escudo pintado a mano. Esta lección instala la prueba exacta que separa uno del otro, la misma que ya viste aplicada al final de la lección 2 con la pregunta del charco pintado: ¿cuánto tarda un ejército decidido en cruzarlo? Un foso de verdad no tiene una respuesta corta a esa pregunta — no importa cuántos soldados manden, el agua sigue ahí. Un portón, por más tallado que esté, tiene una respuesta muy concreta: un ariete, un fin de semana, quizás dos. La belleza del tallado no cambia esa cifra ni un poco — un portón mediocre y un portón espectacular caen exactamente igual de rápido frente al mismo ariete, porque lo que determina cuánto resiste no es qué tan bonito se ve, es de qué material está hecho.
Ejemplo trabajado: tres features, tres tiempos de construcción, el mismo techo
Reutilizamos moatScore sin cambios y lo corremos sobre tres features de Mercado, elegidas a propósito para que varíe mucho el tiempo que tardaron en construirse — de un fin de semana a casi un trimestre completo. fasterCheckout es el ítem del backlog que ya conoces desde el módulo 1: un checkout de un clic, copiable en un fin de semana. curatedDiscoveryAlgorithm es el algoritmo de curaduría detrás de curatedDiscovery —la diferenciación que el módulo 4 celebró como la propuesta de valor central de Mercado—, evaluado aquí puramente como el código que ordena y filtra el catálogo, sin ningún dato de compra retroalimentándolo todavía: un competidor con un buen equipo de ingeniería podría replicar la lógica de ranking en unas tres semanas. personalizedOnboardingFlow es un flujo de bienvenida personalizado, con ilustraciones a medida y varias iteraciones de research con usuarios — el equipo que lo construyó le dedicó doce fines de semana completos, casi un trimestre.
// Modelo pedagogico: puntua la DURABILIDAD (0-10) de una ventaja competitiva.
// Reutilizado sin cambios desde la leccion 2 -- esta leccion se detiene en
// el tipo 'feature', el grupo de control que nunca cruza el umbral.
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: 'fasterCheckout', type: 'feature', timeToCopyWeekends: 1 },
{ name: 'curatedDiscoveryAlgorithm', type: 'feature', timeToCopyWeekends: 3 },
{ name: 'personalizedOnboardingFlow', type: 'feature', timeToCopyWeekends: 12 },
];
console.log('=== Tres features, tres tiempos de construcción, el mismo techo ===\n');
console.table(candidates.map(moatScore));
Qué esperar. Al correr el archivo con Node, la salida es exactamente esta:
=== Tres features, tres tiempos de construcción, el mismo techo ===
┌─────────┬──────────────────────────────┬───────────┬────────────┬──────────────┬─────────────────────────────────────────────┐
│ (index) │ name │ type │ durability │ verdict │ rationale │
├─────────┼──────────────────────────────┼───────────┼────────────┼──────────────┼─────────────────────────────────────────────┤
│ 0 │ 'fasterCheckout' │ 'feature' │ 1 │ 'not-a-moat' │ 'feature copiable en ~1 fin(es) de semana' │
│ 1 │ 'curatedDiscoveryAlgorithm' │ 'feature' │ 3 │ 'not-a-moat' │ 'feature copiable en ~3 fin(es) de semana' │
│ 2 │ 'personalizedOnboardingFlow' │ 'feature' │ 3 │ 'not-a-moat' │ 'feature copiable en ~12 fin(es) de semana' │
└─────────┴──────────────────────────────┴───────────┴────────────┴──────────────┴─────────────────────────────────────────────┘
Dos resultados merecen atención completa. El primero es curatedDiscoveryAlgorithm: la diferenciación que el módulo 4 celebró como el corazón de la propuesta de valor de Mercado —"descubres lo que no sabías que querías"— saca durability: 3 y 'not-a-moat' cuando se evalúa como algoritmo puro, sin el dato de compra retroalimentándolo. Esto no contradice al módulo 4: una diferenciación real, que sirve al segmento mejor que las alternativas, sigue siendo una diferenciación real — pero "diferenciado hoy" y "difícil de copiar mañana" son dos preguntas distintas, y moatScore solo contesta la segunda. Un competidor con un buen equipo de ranking y búsqueda podría, en unas semanas, construir una lógica de curaduría parecida — la ventaja de Mercado en ese frente, sola, no sobrevive a un ataque en serio (el módulo 7, con strategicFilter, retoma esta distinción para decidir qué construir).
El segundo resultado, más contraintuitivo todavía: personalizedOnboardingFlow, que le costó al equipo doce fines de semana completos —casi un trimestre de trabajo real, con research de usuarios de por medio—, saca exactamente el mismo durability: 3 que una feature de tres fines de semana. La fórmula, Math.max(0, Math.min(3, timeToCopyWeekends)), tiene un techo duro en 3: no importa si timeToCopyWeekends es 3, 12 o 50 — el resultado nunca sube de ahí. Eso no es un error del modelo, es exactamente su punto: el tiempo que algo tarda en construirse no es lo mismo que el tiempo que tarda en defenderse. Un competidor no necesita reproducir tu proceso completo de doce fines de semana con research de usuarios incluido — solo necesita replicar el resultado final, la pantalla que el usuario ve, y eso, para casi cualquier feature de interfaz, se hace mucho más rápido de lo que tomó construirla la primera vez.
Profundización: por qué "tenemos la feature X" nunca es, por sí solo, una respuesta completa
El error de vocabulario que la lección 2 nombró —confundir "bueno" con "durable"— tiene, en el tipo feature, su forma más común y más costosa en la práctica. Cuando un equipo de producto presenta el roadmap del trimestre con una lista de features nuevas y las llama, sin más, "nuestra ventaja competitiva", está mezclando dos preguntas que el módulo entero se esfuerza en separar: ¿esto mejora el producto hoy? —casi siempre sí, y eso está bien, las features buenas mejoran el producto—, y ¿esto sigue siendo una ventaja después de que un competidor decida copiarla? —la pregunta que moatScore contesta, y que para el tipo feature la respuesta es, por diseño, siempre no.
Esto no significa que las features no importen. Significa que cumplen un rol distinto en la estrategia del que cumple un moat. Una feature buena resuelve un problema real del usuario hoy, atrae y retiene mientras nadie la copie, y puede ser la puerta de entrada a un moat real si, con el tiempo, se conecta a uno de los cinco mecanismos —si curatedDiscoveryAlgorithm empieza a retroalimentarse con purchaseData, deja de ser una feature copiable y se convierte en parte de un data moat (la lección 7 muestra exactamente esta transformación). Pero mientras siga siendo solo el algoritmo, sin el ciclo de datos detrás, sigue siendo decoración de puerta: bien hecha, útil, y sin ningún foso debajo.
Vale la pena notar también por qué el techo del modelo es exactamente 3, y no 0: una feature copiable en un fin de semana (durability: 1) y una copiable en tres (durability: 3) sí tienen una diferencia real —la primera se pierde casi de inmediato, la segunda da un poco más de ventana—, pero ninguna de las dos, ni siquiera la de tres fines de semana, alcanza el umbral de 4 que define 'weak-moat'. El modelo permite que el tipo feature tenga algo de gradación interna —para que el alumno pueda comparar features entre sí—, mientras garantiza que ninguna, por bien construida que esté, se confunda con una ventaja estructural.
Errores comunes
Presentar una lista de features del roadmap como "nuestro moat". Qué pasa: en una revisión trimestral, el equipo de producto muestra el roadmap de features del próximo semestre bajo el título "cómo nos vamos a defender de la competencia", sin distinguir cuáles de esas features conectan con un mecanismo real y cuáles son, simplemente, buenas mejoras copiables. Por qué pasa: un roadmap lleno de features se siente como progreso concreto y visible, mientras que nombrar el mecanismo de moat detrás de cada una exige un nivel de análisis que rara vez se hace en la reunión de planeación. Cómo detectarlo: por cada feature del roadmap presentada como "ventaja competitiva", pregunta a qué tipo de moatScore pertenece — si la respuesta es "ninguno, es solo una buena mejora", la etiqueta de "moat" está mal puesta. Cómo corregirlo: separa el roadmap en dos columnas honestas — features que mejoran el producto hoy, y las (probablemente muy pocas) que además profundizan uno de los cinco mecanismos reales — y comunica cada una con el nombre correcto.
Medir el esfuerzo de construcción como si fuera el esfuerzo de defensa. Qué pasa: alguien defiende una feature como "difícil de copiar" citando cuánto tiempo, cuántas personas o cuánto research costó construirla, sin notar que el tiempo de copiar no tiene ninguna relación necesaria con el tiempo que tomó construir el original. Por qué pasa: es intuitivo pensar que algo que costó mucho esfuerzo debe ser difícil de replicar — pero construir algo por primera vez, sin un ejemplo que copiar, casi siempre toma mucho más tiempo que reproducir un resultado ya visible y probado. Cómo detectarlo: si el argumento a favor de la durabilidad de una ventaja es "nos tomó X meses construirla", en vez de nombrar un mecanismo de red, switching cost, datos, escala o marca, el argumento está midiendo la cosa equivocada. Cómo corregirlo: usa siempre timeToCopyWeekends —cuánto tardaría un competidor bien financiado en replicar el resultado visible, no el proceso— como la pregunta correcta, exactamente como en el ejemplo de esta lección.
Abandonar una diferenciación real solo porque no es un moat. Qué pasa: al descubrir que curatedDiscoveryAlgorithm puntúa 'not-a-moat' en moatScore, el equipo concluye que la diferenciación entera de Mercado —la curaduría— "no sirve" y merece menos inversión, confundiendo "no es un moat todavía" con "no vale la pena". Por qué pasa: ver un 'not-a-moat' en la salida de un modelo se siente como un veredicto final, cuando en realidad es una fotografía del estado actual de un mecanismo que puede evolucionar. Cómo detectarlo: si la conversación pasa directamente de "esto no es un moat" a "dejemos de invertir en esto", sin preguntar "¿qué haría falta para que sí lo fuera?", se está perdiendo la mitad del análisis. Cómo corregirlo: para cualquier diferenciación real que puntúe 'not-a-moat', pregunta explícitamente qué mecanismo —casi siempre dataMoat, conectando el algoritmo a un ciclo de datos real— podría convertirla en una ventaja durable, y trata eso como la verdadera prioridad de ingeniería, no el abandono de la iniciativa.
Ejercicios
Ejercicio 1 — Clasifica la afirmación. Un colega dice: "nuestro filtro de búsqueda avanzada nos tomó un equipo completo, seis meses, y todavía nadie más en el mercado lo tiene — ese es nuestro moat." Usando el criterio de esta lección, ¿el tiempo y la exclusividad temporal que describe alcanzan para llamarlo moat? ¿Qué pregunta adicional harías?
Ver solución
No alcanzan. El argumento describe cuánto costó construir el filtro y cuánto tiempo lleva siendo el único en el mercado en tenerlo — ninguna de las dos cosas es lo que moatScore mide. La pregunta correcta de seguimiento es "si MegaStoreGenerico decidiera copiar exactamente esta función el próximo trimestre, con su propio equipo de ingeniería mirando el resultado final ya construido, ¿cuántos fines de semana le tomaría?" — probablemente mucho menos que los seis meses originales, porque copiar un resultado visible es estructuralmente más rápido que inventarlo desde cero. Que nadie más lo tenga todavía es una ventana temporal, no un moat — el mismo error que la lección 2 nombró con "fuimos los primeros".
Ejercicio 2 — Predice antes de ejecutar. Sin correr código, con la fórmula de feature de esta lección (durability = Math.max(0, Math.min(3, timeToCopyWeekends))), predice la durability y el verdict de estas dos ventajas: { name: 'quickWin', type: 'feature', timeToCopyWeekends: 0 } y { name: 'megaProject', type: 'feature', timeToCopyWeekends: 40 }. Luego verifica corriendo moatScore sobre ambos objetos.
Ver solución
quickWin con timeToCopyWeekends: 0: Math.min(3, 0) = 0, luego Math.max(0, 0) = 0 — durability: 0, verdict: 'not-a-moat' (una feature tan simple que un competidor la copia el mismo día). megaProject con timeToCopyWeekends: 40: Math.min(3, 40) = 3, luego Math.max(0, 3) = 3 — durability: 3, verdict: 'not-a-moat', exactamente el mismo resultado que curatedDiscoveryAlgorithm con solo 3 fines de semana. El punto del ejercicio, confirmado con números extremos en ambas direcciones: el rango completo de timeToCopyWeekends —de 0 a 40, de un día a casi un año— colapsa a solo cuatro valores posibles de durability (0, 1, 2 o 3), y ninguno de los cuatro sale nunca del territorio de 'not-a-moat'.
Ejercicio 3 — De feature a moat. Elige fasterCheckout (durability: 1 como feature). Propón, en dos o tres frases, cómo esa misma iniciativa podría rediseñarse para conectar con uno de los cinco tipos reales de moat —no como una feature más pulida, sino como una decisión de arquitectura distinta— y qué tipo de moatScore resultaría.
Ver solución
No hay una única respuesta correcta — el ejercicio anticipa el tema completo de la lección 7. Una propuesta razonable: en vez de limitarse a guardar el método de pago para un clic (lo que hoy la hace copiable en un fin de semana), el checkout podría aprender del historial de compra de cada comprador —dirección de envío más probable según lo que está comprando, método de pago preferido según el monto, sugerencias de productos relacionados en el último paso— conectándose al mismo ciclo de datos que purchaseData. Eso movería fasterCheckout del tipo feature al tipo dataMoat, con feedbackLoop: true — no porque el botón de un clic en sí mismo cambie, sino porque la decisión de qué mostrar en ese clic ahora depende de un ciclo de datos que un competidor no puede copiar solo mirando la pantalla.
Resumen y siguiente paso
En esta lección cerraste el recorrido tipo por tipo con el grupo de control: 'feature', cuya fórmula tiene un techo duro de 3 —muy por debajo del umbral de 'weak-moat'— sin importar cuánto haya tardado en construirse. Viste que una diferenciación real, la de curatedDiscoveryAlgorithm, puede coexistir con "no es un moat" sin ninguna contradicción, y que confundir tiempo de construcción con tiempo de defensa es, quizás, el error más común y más caro de toda la conversación sobre moats.
Antes de avanzar deberías poder: explicar por qué el tipo feature nunca cruza el umbral de moat sin importar el timeToCopyWeekends, distinguir "diferenciación real" de "moat real" con un ejemplo propio, y proponer, para cualquier feature dada, qué mecanismo de los otros cinco tipos podría convertirla en una ventaja durable.
La lección 7 toma exactamente esa última pregunta y la convierte en el tema central: el rol del ingeniero en construir moats — la misma iniciativa, construida con una decisión de arquitectura o con otra, cruzando o no ese umbral.
Recursos
- Jeff Jordan (a16z), "So You Want to Compete Against Amazon?" — a16z.com/so-you-want-to-compete-against-amazon. El mismo artículo citado en la introducción del módulo, ahora relevante en un punto específico: por qué copiar features visibles de un gigante es, casi siempre, más rápido y más barato de lo que el gigante tardó en construirlas la primera vez. En inglés.
- Investopedia, "Economic Moat" — investopedia.com/terms/e/economicmoat.asp. La definición de moat económico de Morningstar excluye explícitamente las ventajas de producto que un competidor puede replicar en un plazo corto — el mismo criterio, con otras palabras, que el tipo
featurede esta lección modela con un techo duro. En inglés.