Módulo 5: Competition And Market

Directos, indirectos y sustitutos: tres formas de perder al mismo comprador

Descripción

La lección 2 amplió el radar dentro de un solo tipo de competencia: los directos, los que venden exactamente lo mismo. Esta lección abre las otras dos categorías que, juntas, completan el panorama: los indirectos (resuelven el mismo job de otra forma) y los sustitutos (el comprador ni siquiera necesita "comprar" para dejar de necesitarte). Las tres categorías le compiten a Mercado por el mismo presupuesto y la misma atención — la diferencia entre ellas no es cuánto duelen, es cómo se ven cuando aparecen, y por eso un equipo que solo sabe reconocer competidores directos se queda ciego frente a las otras dos formas, mucho más comunes, de perder a un comprador.

Conexión con el módulo. Ya tienes el roster de competidores directos completo (lección 2). Esta lección no descarta ese trabajo — lo etiqueta con una segunda dimensión (type) y lo completa con los dos tipos de jugador que faltaban. La lección 4 va a tomar uno de esos tipos —el sustituto más extremo, "no hacer nada"— y dedicarle una lección entera, porque es el que más equipos ignoran por completo.

Una analogía cotidiana: tres formas de perder una venta de café

Imagina una cafetería de barrio y piensa en las distintas formas en que, un martes cualquiera, pierde una venta. La forma más fácil de reconocer: la cafetería de la esquina de enfrente, que vende el mismo espresso, al mismo tipo de cliente que busca sentarse veinte minutos con su laptop. Ese es el competidor directo — mismo producto, mismo comprador, y cualquier dueño de cafetería lo reconoce sin pensarlo dos veces.

La segunda forma es más sutil: la máquina de café de la oficina del cliente. No vende "café de cafetería" — no hay mesero, no hay ambiente, no hay wifi curado —, pero resuelve el mismo job básico ("necesito cafeína, ahora") de una forma completamente distinta, y cada vez que alguien usa esa máquina en vez de bajar a la calle, la cafetería pierde una venta sin que ningún rival directo haya hecho nada. Ese es el competidor indirecto: distinto producto, mismo job, mismo comprador.

Y la tercera forma es la que casi ningún dueño de cafetería nombra cuando le preguntas "¿quién es tu competencia?": el cliente que, simplemente, decide no tomar café hoy — se queda en casa, toma agua, o decide que puede aguantar sin cafeína hasta el almuerzo. No hay ningún rival ahí, ningún letrero, ninguna otra marca — y sin embargo, esa decisión le costó a la cafetería exactamente la misma venta que le habría costado el rival de enfrente. Ese es el sustituto, en su forma más pura: "no comprar nada" también es una opción que el comprador elige activamente, y le compite a todos los demás por igual.

Ejemplo trabajado: el roster completo de Mercado, categorizado

Tomamos el roster de competidores directos de la lección 2 y lo completamos con los dos tipos que faltaban: dos indirectos (TiendasLocalesOnline, tiendas de barrio con presencia digital básica, y NicheHandmadeMarketplace, un marketplace especializado en artesanía) y un sustituto (JustSearchOnGoogle, buscar directamente en un buscador genérico en vez de abrir cualquier marketplace). Cada jugador lleva ahora un campo type explícito, y agrupamos el roster para confirmar que las tres categorías están representadas antes de correr el mapa:

// Modelo pedagogico: ubica cada jugador en un mapa 2x2 segun dos ejes
// ESTRATEGICOS (no metricas de mercado objetivas) y senala si el
// cuadrante de "nosotros" queda despejado -- el espacio donde Mercado
// puede ganar sin chocar de frente contra otro jugador.
function competitiveMap(us, players, axes) {
  const [xAxis, yAxis] = axes;
  const place = (player) => {
    const xSide = player.scores[xAxis.key] >= xAxis.midpoint ? xAxis.high : xAxis.low;
    const ySide = player.scores[yAxis.key] >= yAxis.midpoint ? yAxis.high : yAxis.low;
    return `${ySide} / ${xSide}`;
  };
  const usQuadrant = place(us);
  const placed = players.map((p) => ({
    name: p.name,
    type: p.type,
    quadrant: place(p),
    sharesQuadrantWithUs: place(p) === usQuadrant,
  }));
  const openSpace = !placed.some((p) => p.sharesQuadrantWithUs);
  return { us: { name: us.name, quadrant: usQuadrant }, players: placed, openSpace };
}

const axesDiscovery = [
  { key: 'breadth', label: 'catalog breadth', low: 'niche', high: 'broad', midpoint: 5 },
  { key: 'curation', label: 'curation depth', low: 'raw-search', high: 'curated', midpoint: 5 },
];
const us = { name: 'Mercado', scores: { breadth: 8, curation: 8 } };

const roster = [
  { name: 'MegaStoreGenerico', type: 'direct', scores: { breadth: 9, curation: 2 } },
  { name: 'SuperTiendaExpress', type: 'direct', scores: { breadth: 6, curation: 3 } },
  { name: 'TiendasLocalesOnline', type: 'indirect', scores: { breadth: 3, curation: 4 } },
  { name: 'NicheHandmadeMarketplace', type: 'indirect', scores: { breadth: 3, curation: 8 } },
  { name: 'JustSearchOnGoogle', type: 'substitute', scores: { breadth: 10, curation: 1 } },
];

const byType = roster.reduce((groups, p) => {
  groups[p.type] = groups[p.type] || [];
  groups[p.type].push(p.name);
  return groups;
}, {});
console.log('=== Roster agrupado por type ===\n');
console.log(JSON.stringify(byType, null, 2));

const result = competitiveMap(us, roster, axesDiscovery);
console.log('\n=== competitiveMap: el roster completo, categorizado ===\n');
console.table(result.players);
console.log(`openSpace: ${result.openSpace}`);

Qué esperar. Al correr el archivo con Node, la salida es exactamente esta:

=== Roster agrupado por type ===

{
  "direct": [
    "MegaStoreGenerico",
    "SuperTiendaExpress"
  ],
  "indirect": [
    "TiendasLocalesOnline",
    "NicheHandmadeMarketplace"
  ],
  "substitute": [
    "JustSearchOnGoogle"
  ]
}

=== competitiveMap: el roster completo, categorizado ===

┌─────────┬────────────────────────────┬──────────────┬──────────────────────┬──────────────────────┐
│ (index) │            name            │     type     │       quadrant       │ sharesQuadrantWithUs │
├─────────┼────────────────────────────┼──────────────┼──────────────────────┼──────────────────────┤
│    0    │    'MegaStoreGenerico'     │   'direct'   │ 'raw-search / broad' │        false         │
│    1    │    'SuperTiendaExpress'    │   'direct'   │ 'raw-search / broad' │        false         │
│    2    │   'TiendasLocalesOnline'   │  'indirect'  │ 'raw-search / niche' │        false         │
│    3    │ 'NicheHandmadeMarketplace' │  'indirect'  │  'curated / niche'   │        false         │
│    4    │    'JustSearchOnGoogle'    │ 'substitute' │ 'raw-search / broad' │        false         │
└─────────┴────────────────────────────┴──────────────┴──────────────────────┴──────────────────────┘
openSpace: true

Fíjate en un detalle importante, que es el punto central de esta lección: competitiveMap no usa el campo type para nada en el cálculo del cuadrante. Los ejes (breadth, curation) son los mismos sin importar si el jugador es directo, indirecto o sustituto — el mapa mide comportamiento estratégico, no la etiqueta que le pusiste. type es información para ti, la persona que lee el mapa, no un insumo del algoritmo. Y sin embargo, mira lo que revela leer la tabla con esa etiqueta puesta al lado: el jugador que cae en el cuadrante más parecido al de Mercado en amplitud —JustSearchOnGoogle, con breadth: 10— es un sustituto, no un competidor directo. Si tu radar solo supiera reconocer competidores directos (el error de la lección 2, ya corregido, pero imagina que no lo hubieras corregido), este jugador ni siquiera aparecería en el roster — y sería, literalmente, el más cercano a la amplitud de catálogo de Mercado de todo el mapa.

Profundización: por qué la categoría no cambia el cálculo, pero sí cambia la respuesta

Es tentador pensar que un competidor indirecto o un sustituto "importan menos" que uno directo, porque suenan más lejanos. La categoría no mide cuánto duele — mide qué tan fácil es de reconocer, y esas dos cosas no están correlacionadas. Un sustituto puede robarte más presupuesto que cualquier competidor directo (la lección 4 lo cuantifica), simplemente porque es más difícil de ver a simple vista.

Lo que sí cambia con la categoría es la respuesta estratégica correcta, no la urgencia:

  • Contra un directo, la respuesta suele ser diferenciación (módulo 4): hacer algo que él no hace, o hacerlo mejor en el terreno donde el segmento decide.
  • Contra un indirecto, la respuesta suele ser expandir el job que resuelves: si TiendasLocalesOnline te gana en confianza personal cara a cara, la pregunta no es "¿cómo bajamos precio?" — es "¿cómo replicamos esa confianza a escala, sin perder la escala?"
  • Contra un sustituto, la respuesta casi nunca es competir de frente — es hacer que la alternativa de "no usar Mercado" se sienta más cara, más lenta o más incómoda que usarlo. Contra JustSearchOnGoogle, eso significa que la curaduría tiene que ahorrarle al comprador un esfuerzo real, no solo verse bonita.

Confundir estas tres respuestas —por ejemplo, tratar de "ganarle en precio" a un sustituto que ni siquiera cobra— es uno de los desperdicios de esfuerzo más comunes en estrategia de producto, y empieza, casi siempre, en un mapeo que nunca distinguió el tipo con cuidado.

Errores comunes

Categorizar por instinto, sin un criterio explícito. Qué pasa: alguien en el equipo decide, sin explicar por qué, que tal jugador "es indirecto" y tal otro "es directo" — y dos personas distintas categorizarían al mismo jugador de forma diferente si se les preguntara por separado. Por qué pasa: sin una definición clara, "directo" e "indirecto" se sienten como una cuestión de tamaño o de familiaridad, no de si vende lo mismo al mismo comprador. Cómo detectarlo: pídele a otra persona del equipo que categorice el mismo roster sin ver tus etiquetas — si discrepan en más de un jugador, el criterio no está claro. Cómo corregirlo: usa la prueba de esta lección: directo = mismo producto + mismo comprador; indirecto = distinto producto + mismo job + mismo comprador; sustituto = el comprador satisface el job sin comprarte a ti ni a nadie parecido, incluyendo "no hacer nada".

Tratar "indirecto" o "sustituto" como sinónimo de "menos importante". Qué pasa: el equipo dedica el 90% del tiempo de análisis a los competidores directos, y despacha a los indirectos y sustitutos con una sola línea en la presentación, como si categorizarlos fuera suficiente y no hiciera falta pensar más. Por qué pasa: la palabra "directo" suena a "el peligro real", y las otras dos categorías suenan, por el nombre, a una amenaza de segunda categoría — un error de vocabulario, no de sustancia. Cómo detectarlo: compara cuánto tiempo de discusión recibió cada categoría en tu última reunión de estrategia contra cuánta atención real del comprador cada una se está llevando (la lección 4 da una forma concreta de medir esto). Cómo corregirlo: aplica el mismo nivel de análisis —cuadrante, tendencia, respuesta estratégica— a las tres categorías, no solo a la más fácil de nombrar.

Usar el type como si fuera un insumo del mapa, no una etiqueta de lectura. Qué pasa: alguien intenta ajustar el cálculo del cuadrante según el tipo de competidor —por ejemplo, "démosle menos peso a los sustitutos porque no son una empresa real"— torciendo el modelo para que confirme la intuición de que los sustitutos importan menos. Por qué pasa: se olvida que competitiveMap mide comportamiento estratégico (dónde compite cada jugador en los ejes), no legitimidad corporativa — un sustituto ocupa el mismo espacio del mapa que cualquier otro jugador, con las mismas reglas. Cómo detectarlo: si estás modificando la lógica del modelo según el type en vez de solo usar type para leer la tabla después, estás mezclando dos cosas distintas. Cómo corregirlo: deja que competitiveMap calcule el cuadrante igual para todos, y usa type solo como columna de lectura, exactamente como en el ejemplo de esta lección.

Ejercicios

Ejercicio 1 — Clasifica sin correr el código. Para cada jugador, decide si es direct, indirect o substitute frente a Mercado, y justifica en una frase: (a) una plataforma que vende exactamente el mismo tipo de catálogo amplio y curado que Mercado, pero en otro país; (b) un grupo de WhatsApp de vecinos donde la gente recomienda productos y vendedores locales de boca en boca; (c) el comprador que decide posponer la compra un mes porque "total, no es urgente".

Ver solución
  • (a) direct. Mismo producto (catálogo amplio y curado), mismo tipo de comprador (el que explora) — el hecho de que sea otro país no cambia la categoría, aunque sí puede cambiar si hoy compite de verdad por el mismo comprador.
  • (b) indirect. Distinto producto —no es una plataforma, es una recomendación entre vecinos—, pero resuelve el mismo job: descubrir algo confiable y local que no sabías que necesitabas. Es, de hecho, muy parecido en espíritu a lo que Mercado quiere ser digitalmente.
  • (c) substitute. No hay ningún producto ni plataforma involucrada — el comprador simplemente eligió no actuar todavía. Es la forma más pura del sustituto: "no hacer nada, por ahora".

Ejercicio 2 — Agrega un competidor indirecto nuevo. Un vecindario de Mercado tiene una feria de productores locales presencial, los fines de semana, donde la gente descubre productos artesanales cara a cara. Escribe su objeto de datos (name, type, scores.breadth, scores.curation) siguiendo el patrón del roster de esta lección, y predice en qué cuadrante caería.

Ver solución

Una versión razonable:

{ name: 'WeekendLocalMarket', type: 'indirect', scores: { breadth: 2, curation: 7 } }

breadth: 2 porque una feria presencial de un fin de semana tiene un catálogo mucho más chico que cualquier plataforma digital (< 5 → 'niche'), y curation: 7 porque el descubrimiento cara a cara, con el productor presente para contar la historia del producto, es una forma muy alta de curaduría, aunque no sea algorítmica (≥ 5 → 'curated'). Quedaría en el cuadrante 'curated / niche' — el mismo cuadrante que NicheHandmadeMarketplace en el roster de esta lección, confirmando que ambos compiten por la misma promesa (curaduría profunda, catálogo chico), aunque uno sea digital y el otro presencial.

Ejercicio 3 — Explica la diferencia de respuesta estratégica. Un colega propone la misma solución —"bajemos precios"— tanto para responderle a MegaStoreGenerico (directo) como para responderle a JustSearchOnGoogle (sustituto). Explica, en un párrafo, por qué esa misma solución tiene sentido para uno de los dos casos y no para el otro, usando el vocabulario de "profundización" de esta lección.

Ver solución

Bajar precios podría tener algún sentido —aunque no sea la apuesta estratégica de Mercado, según la visión del módulo 2— frente a MegaStoreGenerico, porque ambos son vendedores reales compitiendo por la misma transacción: es al menos una palanca del mismo juego. Pero frente a JustSearchOnGoogle no tiene ningún sentido, porque un buscador genérico no cobra nada por mostrar resultados de búsqueda — no hay ningún precio contra el cual competir. El comprador que "solo busca en Google" no está comparando el precio de Mercado contra el precio de otro vendedor; está comparando el esfuerzo de abrir Mercado y confiar en su curaduría contra el esfuerzo de escribir una búsqueda genérica y filtrar los resultados él mismo. La respuesta correcta frente al sustituto no es de precio, es de fricción y confianza — exactamente el terreno donde Mercado ya eligió jugar desde el módulo 2.

Resumen y siguiente paso

Esta lección completó el roster de Mercado con las tres categorías de competencia —directa, indirecta y sustituta— y mostró que competitiveMap calcula el cuadrante de la misma forma para las tres, porque mide comportamiento estratégico (los ejes), no la etiqueta. La categoría no cambia el cálculo, pero sí cambia la respuesta correcta: diferenciación frente a directos, expandir el job frente a indirectos, y reducir la fricción frente a sustitutos.

Antes de avanzar deberías poder: categorizar cualquier competidor nuevo en menos de un minuto usando la prueba de esta lección, y explicar por qué la respuesta estratégica correcta cambia según la categoría, aunque el mapa las trate por igual.

La lección 4 toma el jugador más subestimado del roster —JustSearchOnGoogle, y con él todo el fenómeno de "no hacer nada"— y le dedica una lección completa, porque es, casi siempre, el competidor que se lleva más atención del comprador de todos, sin que nadie lo mencione en la reunión de estrategia.

Recursos

  • Michael Porter, "The Five Competitive Forces That Shape Strategy" — hbr.org/2008/01/the-five-competitive-forces-that-shape-strategy. Porter nombra explícitamente la "amenaza de sustitutos" como una de las cinco fuerzas, al mismo nivel que la rivalidad directa — el origen conceptual de la distinción que hiciste en esta lección. En inglés.
  • Clayton Christensen, Scott Cook y Taddy Hall, "Marketing Malpractice: The Cause and the Cure" — hbr.org/2005/12/marketing-malpractice-the-cause-and-the-cure. El estudio del milkshake muestra un competidor indirecto (donas) y un sustituto (no comprar nada) compitiendo, literalmente, por el mismo job que un producto que a simple vista no se les parece en nada. En inglés.