Module 5: Competition And Market

Direct, indirect, and substitutes: three ways to lose the same buyer

Description

Lesson 2 widened the radar within a single type of competition: direct ones, the ones selling exactly the same thing. This lesson opens the other two categories that, together, complete the landscape: indirect (they solve the same job a different way) and substitutes (the buyer doesn't even need to "buy" to stop needing you). All three categories compete with Mercado for the same budget and the same attention — the difference between them isn't how much they hurt, it's how they look when they show up, and that's why a team that only knows how to spot direct competitors goes blind to the other two, much more common, ways of losing a buyer.

Connection to the module. You already have the complete direct-competitor roster (lesson 2). This lesson doesn't discard that work — it labels it with a second dimension (type) and completes it with the two player types that were missing. Lesson 4 will take one of those types —the most extreme substitute, "doing nothing"— and dedicate a whole lesson to it, because it's the one almost every team ignores completely.

An everyday analogy: three ways to lose a coffee sale

Picture a neighborhood coffee shop and think about the different ways it loses a sale on any given Tuesday. The easiest to spot: the coffee shop across the street, selling the same espresso, to the same type of customer who wants to sit twenty minutes with their laptop. That's the direct competitor — same product, same buyer, and any coffee shop owner recognizes it without thinking twice.

The second way is subtler: the customer's office coffee machine. It doesn't sell "coffee shop coffee" — no waiter, no atmosphere, no curated wifi —, but it solves the same basic job ("I need caffeine, now") in a completely different way, and every time someone uses that machine instead of going downstairs, the coffee shop loses a sale without any direct rival doing anything. That's the indirect competitor: different product, same job, same buyer.

And the third way is the one almost no coffee shop owner names when you ask "who's your competition?": the customer who simply decides not to have coffee today — stays home, drinks water, or decides they can hold off on caffeine until lunch. There's no rival there, no sign, no other brand — and yet, that decision cost the coffee shop exactly the same sale the rival across the street would have cost it. That's the substitute, in its purest form: "buying nothing" is also an option the buyer actively chooses, and it competes with everyone else on equal footing.

Worked example: Mercado's complete roster, categorized

We take the direct-competitor roster from lesson 2 and complete it with the two missing types: two indirect ones (TiendasLocalesOnline, neighborhood stores with a basic digital presence, and NicheHandmadeMarketplace, a marketplace specialized in handmade goods) and one substitute (JustSearchOnGoogle, searching directly on a generic search engine instead of opening any marketplace). Every player now carries an explicit type field, and we group the roster to confirm all three categories are represented before running the map:

// Pedagogical model: places each player on a 2x2 map along two
// STRATEGIC axes (not objective market metrics) and flags whether
// "our" quadrant is open -- the space where Mercado can win without
// running head-on into another player.
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 grouped by type ===\n');
console.log(JSON.stringify(byType, null, 2));

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

What to expect. Running the file with Node produces exactly this output:

=== Roster grouped by type ===

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

=== competitiveMap: the complete, categorized roster ===

┌─────────┬────────────────────────────┬──────────────┬──────────────────────┬──────────────────────┐
│ (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

Notice one important detail, which is the central point of this lesson: competitiveMap doesn't use the type field at all in the quadrant calculation. The axes (breadth, curation) are the same regardless of whether the player is direct, indirect, or a substitute — the map measures strategic behavior, not the label you put on it. type is information for you, the person reading the map, not an input to the algorithm. And yet, look at what reading the table with that label attached reveals: the player landing in the quadrant closest to Mercado's on breadth —JustSearchOnGoogle, with breadth: 10— is a substitute, not a direct competitor. If your radar only knew how to recognize direct competitors (lesson 2's mistake, already corrected, but imagine you hadn't corrected it), this player wouldn't even appear on the roster — and it's literally the closest to Mercado's catalog breadth on the entire map.

Deep dive: why the category doesn't change the calculation, but it does change the answer

It's tempting to think an indirect competitor or a substitute "matters less" than a direct one, because they sound farther away. The category doesn't measure how much it hurts — it measures how easy it is to recognize, and those two things aren't correlated. A substitute can steal more of your budget than any direct competitor (lesson 4 quantifies this), simply because it's harder to see at a glance.

What does change with the category is the correct strategic response, not the urgency:

  • Against a direct competitor, the response is usually differentiation (module 4): doing something they don't do, or doing it better on the ground where the segment decides.
  • Against an indirect competitor, the response is usually expanding the job you solve: if TiendasLocalesOnline beats you on face-to-face personal trust, the question isn't "how do we lower prices?" — it's "how do we replicate that trust at scale, without losing the scale?"
  • Against a substitute, the response is almost never to compete head-on — it's to make the alternative of "not using Mercado" feel more expensive, slower, or more uncomfortable than using it. Against JustSearchOnGoogle, that means curation has to save the buyer real effort, not just look nice.

Confusing these three responses —for example, trying to "beat on price" a substitute that doesn't even charge anything— is one of the most common wastes of effort in product strategy, and it almost always starts with a mapping that never carefully distinguished the type.

Common mistakes

Categorizing by instinct, with no explicit criterion. What happens: someone on the team decides, without explaining why, that a given player "is indirect" and another "is direct" — and two different people would categorize the same player differently if asked separately. Why it happens: without a clear definition, "direct" and "indirect" feel like a matter of size or familiarity, not whether it sells the same thing to the same buyer. How to spot it: ask another person on the team to categorize the same roster without seeing your labels — if they disagree on more than one player, the criterion isn't clear. How to fix it: use this lesson's test: direct = same product + same buyer; indirect = different product + same job + same buyer; substitute = the buyer satisfies the job without buying from you or anyone similar, including "doing nothing."

Treating "indirect" or "substitute" as a synonym for "less important." What happens: the team spends 90% of its analysis time on direct competitors, and dispatches indirect ones and substitutes with a single line in the presentation, as if categorizing them were enough and no further thought was needed. Why it happens: the word "direct" sounds like "the real danger," and the other two categories sound, by name, like a second-tier threat — a vocabulary mistake, not a substance one. How to spot it: compare how much discussion time each category got in your last strategy meeting against how much real buyer attention each one is actually capturing (lesson 4 gives a concrete way to measure this). How to fix it: apply the same level of analysis —quadrant, trend, strategic response— to all three categories, not just the easiest to name.

Using type as if it were an input to the map, not a reading label. What happens: someone tries to adjust the quadrant calculation based on competitor type —for example, "let's give substitutes less weight because they're not a real company"— bending the model to confirm the intuition that substitutes matter less. Why it happens: it's easy to forget that competitiveMap measures strategic behavior (where each player competes on the axes), not corporate legitimacy — a substitute occupies the same map space as any other player, under the same rules. How to spot it: if you're modifying the model's logic based on type instead of only using type to read the table afterward, you're mixing two different things. How to fix it: let competitiveMap calculate the quadrant the same way for everyone, and use type only as a reading column, exactly as in this lesson's example.

Exercises

Exercise 1 — Classify without running the code. For each player, decide whether it's direct, indirect, or substitute relative to Mercado, and justify it in one sentence: (a) a platform selling exactly the same kind of broad, curated catalog as Mercado, but in a different country; (b) a neighborhood WhatsApp group where people recommend local products and sellers by word of mouth; (c) the buyer who decides to postpone the purchase a month because "it's not urgent anyway."

See solution
  • (a) direct. Same product (broad, curated catalog), same type of buyer (the one who browses) — being in a different country doesn't change the category, though it may change whether it truly competes for the same buyer today.
  • (b) indirect. Different product —it's not a platform, it's a recommendation among neighbors—, but it solves the same job: discovering something reliable and local you didn't know you needed. It's actually very close in spirit to what Mercado wants to be digitally.
  • (c) substitute. No product or platform is involved at all — the buyer simply chose not to act yet. It's the purest form of the substitute: "doing nothing, for now."

Exercise 2 — Add a new indirect competitor. A neighborhood near Mercado has an in-person local-producer market on weekends, where people discover handmade products face to face. Write its data object (name, type, scores.breadth, scores.curation) following this lesson's roster pattern, and predict which quadrant it would fall into.

See solution

A reasonable version:

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

breadth: 2 because a weekend in-person market has a much smaller catalog than any digital platform (< 5 → 'niche'), and curation: 7 because face-to-face discovery, with the producer present to tell the product's story, is a very high form of curation, even if it's not algorithmic (≥ 5 → 'curated'). It would land in the 'curated / niche' quadrant — the same quadrant as NicheHandmadeMarketplace in this lesson's roster, confirming that both compete for the same promise (deep curation, small catalog), even though one is digital and the other in-person.

Exercise 3 — Explain the difference in strategic response. A colleague proposes the same solution —"let's lower prices"— to respond both to MegaStoreGenerico (direct) and to JustSearchOnGoogle (substitute). Explain, in a paragraph, why that same solution makes sense for one of the two cases and not for the other, using this lesson's "deep dive" vocabulary.

See solution

Lowering prices might make some sense —even though it isn't Mercado's strategic bet, per module 2's vision— against MegaStoreGenerico, because both are real sellers competing for the same transaction: it's at least a lever in the same game. But against JustSearchOnGoogle it makes no sense at all, because a generic search engine doesn't charge anything to show search results — there's no price to compete against. The buyer who "just searches on Google" isn't comparing Mercado's price against another seller's price; they're comparing the effort of opening Mercado and trusting its curation against the effort of typing a generic search and filtering the results themselves. The right response to the substitute isn't about price, it's about friction and trust — exactly the ground Mercado already chose to play on since module 2.

Summary and next step

This lesson completed Mercado's roster with the three categories of competition —direct, indirect, and substitute— and showed that competitiveMap calculates the quadrant the same way for all three, because it measures strategic behavior (the axes), not the label. The category doesn't change the calculation, but it does change the correct response: differentiation against direct competitors, expanding the job against indirect ones, and reducing friction against substitutes.

Before moving on you should be able to: categorize any new competitor in under a minute using this lesson's test, and explain why the correct strategic response changes by category, even though the map treats them equally.

Lesson 4 takes the most underrated player on the roster —JustSearchOnGoogle, and with it the whole "doing nothing" phenomenon— and dedicates a full lesson to it, because it's almost always the competitor capturing the most buyer attention of all, without anyone mentioning it in the strategy meeting.

Resources

  • Michael Porter, "The Five Competitive Forces That Shape Strategy" — hbr.org/2008/01/the-five-competitive-forces-that-shape-strategy. Porter explicitly names the "threat of substitutes" as one of the five forces, at the same level as direct rivalry — the conceptual origin of the distinction you made in this lesson. In English.
  • Clayton Christensen, Scott Cook, and Taddy Hall, "Marketing Malpractice: The Cause and the Cure" — hbr.org/2005/12/marketing-malpractice-the-cause-and-the-cure. The milkshake study shows an indirect competitor (donuts) and a substitute (buying nothing) competing, literally, for the same job as a product that looks nothing like them at a glance. In English.