Module 5: Competition And Market
Not fighting the last war
Description
Lesson 6 gave you the criterion for telling axes that discriminate apart from axes that don't. This lesson warns about a different, harder-to-spot danger: axes that did discriminate perfectly well — but in a battle that no longer decides the game. A map built on yesterday's axes can look just as rigorous as one built on today's, pass lesson 6's test without a hitch, and still lead you to the wrong conclusion, because it measures something that stopped being what separates winners from losers.
Connection to the module. This is the close of the module's "axes" half, and it connects directly to module 4 (differentiation): there, Mercado already decided, with differentiationMap, that it doesn't compete on price or on the biggest possible catalog — it competes on curation and trust. This lesson shows, with numbers, what would happen if Mercado —or any team reading this map carelessly— measured its position against the axes of the war it already decided not to fight.
An everyday analogy: generals preparing for the last war
There's a much-repeated observation in military history: generals, trained in the previous war, tend to prepare their armies to fight that same war again —the same tactics, the same defensive lines, the same type of battle— right when the enemy has already completely changed how it attacks. An army perfectly prepared to repel an infantry invasion can collapse against an air force, not because it was poorly trained, but because it was trained to measure the wrong terrain: it kept watching where the infantry comes in, instead of looking at the sky.
What's insidious about this mistake is that, on its own terms, the poorly prepared army can look like it's winning: if you measure the trench lines, they're perfectly organized; if you count infantry soldiers per kilometer of border, the number is excellent. The map they're using to evaluate themselves tells them things are going well — the problem is that map measures the wrong war. This lesson teaches you to recognize when a team's competitive map, even if technically correct, is measuring yesterday's battle.
Worked example: Mercado, measured on the axes of the war it no longer fights
We run competitiveMap on the same roster as always, but with two axes that were, for years, the classic battlefield of generic retail: price (how cheap) and assortment (how big the catalog is). These are the axes of the war a megastore wins almost by definition, thanks to its scale — and they're precisely the axes Mercado decided not to fight as of its module 2 strategy.
// 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 axesOldWar = [
{ key: 'price', label: 'cheapness', low: 'expensive', high: 'cheap', midpoint: 5 },
{ key: 'assortment', label: 'assortment size', low: 'narrow', high: 'huge', midpoint: 5 },
];
const usOld = { name: 'Mercado', scores: { price: 5, assortment: 7 } };
const playersOld = [
{ name: 'MegaStoreGenerico', type: 'direct', scores: { price: 9, assortment: 9 } },
{ name: 'TiendasLocalesOnline', type: 'indirect', scores: { price: 4, assortment: 3 } },
{ name: 'NicheHandmadeMarketplace', type: 'indirect', scores: { price: 3, assortment: 2 } },
];
const oldWarMap = competitiveMap(usOld, playersOld, axesOldWar);
console.log('=== competitiveMap with the axes of yesterday\'s war (price x assortment) ===\n');
console.log(`[us] ${oldWarMap.us.name} -> quadrant: "${oldWarMap.us.quadrant}"`);
console.table(oldWarMap.players);
console.log(`openSpace: ${oldWarMap.openSpace}`);
const axesToday = [
{ key: 'breadth', label: 'catalog breadth', low: 'niche', high: 'broad', midpoint: 5 },
{ key: 'curation', label: 'curation depth', low: 'raw-search', high: 'curated', midpoint: 5 },
];
const usToday = { name: 'Mercado', scores: { breadth: 8, curation: 8 } };
const playersToday = [
{ name: 'MegaStoreGenerico', type: 'direct', scores: { breadth: 9, curation: 2 } },
{ name: 'TiendasLocalesOnline', type: 'indirect', scores: { breadth: 3, curation: 4 } },
{ name: 'NicheHandmadeMarketplace', type: 'indirect', scores: { breadth: 3, curation: 8 } },
];
const newMap = competitiveMap(usToday, playersToday, axesToday);
console.log('\n=== the same players, with the correct axes for TODAY (breadth x curation) ===\n');
console.log(`[us] ${newMap.us.name} -> quadrant: "${newMap.us.quadrant}"`);
console.table(newMap.players);
console.log(`openSpace: ${newMap.openSpace}`);
What to expect. Running the file with Node produces exactly this output:
=== competitiveMap with the axes of yesterday's war (price x assortment) ===
[us] Mercado -> quadrant: "huge / cheap"
┌─────────┬────────────────────────────┬────────────┬──────────────────────┬──────────────────────┐
│ (index) │ name │ type │ quadrant │ sharesQuadrantWithUs │
├─────────┼────────────────────────────┼────────────┼──────────────────────┼──────────────────────┤
│ 0 │ 'MegaStoreGenerico' │ 'direct' │ 'huge / cheap' │ true │
│ 1 │ 'TiendasLocalesOnline' │ 'indirect' │ 'narrow / expensive' │ false │
│ 2 │ 'NicheHandmadeMarketplace' │ 'indirect' │ 'narrow / expensive' │ false │
└─────────┴────────────────────────────┴────────────┴──────────────────────┴──────────────────────┘
openSpace: false
=== the same players, with the correct axes for TODAY (breadth x curation) ===
[us] Mercado -> quadrant: "curated / broad"
┌─────────┬────────────────────────────┬────────────┬──────────────────────┬──────────────────────┐
│ (index) │ name │ type │ quadrant │ sharesQuadrantWithUs │
├─────────┼────────────────────────────┼────────────┼──────────────────────┼──────────────────────┤
│ 0 │ 'MegaStoreGenerico' │ 'direct' │ 'raw-search / broad' │ false │
│ 1 │ 'TiendasLocalesOnline' │ 'indirect' │ 'raw-search / niche' │ false │
│ 2 │ 'NicheHandmadeMarketplace' │ 'indirect' │ 'curated / niche' │ false │
└─────────┴────────────────────────────┴────────────┴──────────────────────┴──────────────────────┘
openSpace: true
There's the mistake, in exact numbers. With yesterday's war axes, Mercado lands in 'huge / cheap' —the exact same quadrant as MegaStoreGenerico—, and openSpace is false: according to this map, Mercado has no ground of its own, it's just competing head-on against a giant that wins almost any price-and-scale fight through sheer size advantage. It's a technically valid conclusion —the axes discriminate well between MegaStoreGenerico and the smaller shops, so it would pass lesson 6's test— and yet it's the wrong conclusion, because it measures a battle Mercado, per its module 2 strategy, decided not to fight. With today's correct axes —the same ones from the whole module—, the same Mercado, without changing anything about itself, shows up with a clearly open space of its own. Also notice a detail the generals' analogy predicts exactly: JustSearchOnGoogle, the substitute that dominates lesson 4, doesn't even appear on the old war's map — a generic search engine has no "price" or "assortment" in a traditional seller's sense, so the old axes literally don't know where to place it. The last war's axes don't just give the wrong conclusion about the players they do include — they leave the map completely blind to the player that matters most.
Deep dive: how to recognize you're using yesterday's axes
Three signs that a map, even if technically rigorous, is measuring the wrong battle:
- The axes come from "how this industry has always been measured," not from the current strategy. Price and assortment have been retail's classic axes for decades — they're easy to find in any industry report, precisely because they were the right axes for a long time. An axis having history doesn't make it current.
- The result tells you you're losing exactly on the ground your own strategy said you weren't going to compete on. If
openSpacecomes backfalseexactly on the axes your strategy (module 2) explicitly declared weren't your bet —low price, instead of curated discovery—, the map isn't uncovering a real weakness; it's measuring ground you gave up on purpose. - An important player on the roster doesn't fit the map's axes. When
JustSearchOnGooglehas neither a "price" nor an "assortment" to assign it, that discomfort is a signal, not a minor technicality — it means the map was designed for a world where every competitor was a traditional seller, a world that has already changed.
The fix isn't "ignore the old axes entirely" — a price change from MegaStoreGenerico is still real information. The fix is not letting the old map be the one that decides where Mercado competes. Yesterday's axes are useful for understanding yesterday's war; today's war is read with today's axes, the ones from lesson 6.
Common mistakes
Positioning against the axes of yesterday's war. What happens: the team measures its competitive position using the industry's classic axes —price, assortment, physical store reach— without first checking whether those are the axes the current strategy chose to compete on, and ends up with the false conclusion that "there's no space of our own," as in this lesson's example. Why it happens: an industry's classic axes are the most documented, the easiest to find in a market report, and feel "objective" because they're what everyone uses — but "everyone uses them" doesn't mean they still define who wins. How to spot it: if your map's result tells you you're losing exactly on the ground your own strategy declared it wasn't going to fight on, be suspicious of the axes before you're suspicious of the strategy. How to fix it: always go back to the exact words of "where we play and how we win" (modules 1 and 2) before accepting any axis — if the axis doesn't appear, even in spirit, in that declaration, it probably belongs to a different war.
Letting the old map replace the new one, instead of coexisting with it. What happens: after building the map for yesterday's war and finding an alarming result, the team reacts by investing effort into improving price and assortment —ground where it never had a possible advantage against a scale player—, abandoning investment in the curation that actually built a real advantage. Why it happens: a "bad" numerical result triggers an urgency reaction, and the most obvious response —competing directly on the axis where you look bad— is rarely correct when that axis was never part of the strategy. How to spot it: if a roadmap decision was born from "the price-and-assortment map looked bad," ask whether that map actually reflects the current strategy, or whether it's an automatic reflex from the last known industry. How to fix it: use today's axes map (lesson 6) as the decision map — yesterday's axes map only serves as historical context, never as guidance for where to invest.
Ignoring the player who doesn't fit the old axes, instead of reading it as a signal. What happens: when a player like JustSearchOnGoogle has no sensible "price" or "assortment" values to place it on the classic map, the team simply excludes it from the analysis as "not applicable," without asking why it doesn't apply. Why it happens: it's easier to discard a data point that doesn't fit the existing template than to ask whether the template itself has become obsolete. How to spot it: if your competitive map systematically excludes newer or less traditional players because "they don't have the data the map needs," the problem is with the map, not the player. How to fix it: treat the impossibility of placing a new player on old axes as evidence that those axes no longer capture the full terrain — exactly the signal you saw with JustSearchOnGoogle in this lesson's example.
Exercises
Exercise 1 — Identify "yesterday's war" axes in your own industry. Think of a product or industry you know well (it doesn't have to be e-commerce). Name two axes that used to define who won, and explain in one sentence why they might no longer be the right axes today.
See solution
There's no single correct answer — the exercise evaluates the reasoning. A valid example: in the video streaming industry, the classic axes used to be "catalog size" and "picture quality" — for years, those axes did separate the winners. Today, with almost every player offering huge catalogs and high definition as a given, those axes no longer discriminate (they'd fail lesson 6's test) — the axes that separate winners today are more like "exclusive original content" and "recommendation algorithm," actually much closer, in fact, to Mercado's curation axes than to the classic catalog axes.
Exercise 2 — Recalculate with SuperTiendaExpress included in yesterday's war. Add SuperTiendaExpress to the axesOldWar roster with price: 7, assortment: 6 and run the model. Does it change the conclusion that Mercado has no space of its own on these axes?
See solution
With price: 7 (≥ 5 → 'cheap') and assortment: 6 (≥ 5 → 'huge'), SuperTiendaExpress would land in the same 'huge / cheap' quadrant as MegaStoreGenerico and as Mercado. The conclusion doesn't change — in fact it strengthens: now it's two direct competitors, not one, sharing the price-and-scale ground with Mercado on this map. This confirms the problem isn't an isolated data point — it's structural: any player competing on price and massive assortment is going to land in that same zone, and Mercado, with price: 5, assortment: 7, is always going to stay close to it while measured on these axes, no matter how many competitors you add to the roster.
Exercise 3 — Explain both maps to an investor. An investor, after seeing only the first map (price × assortment), asks worriedly: "Does Mercado have no real advantage? It looks like you're exactly where the megastore is." Write, in a paragraph, the full response, showing both maps and explaining which one is correct for evaluating Mercado's strategy.
See solution
A sample answer: "That map measures price and catalog size — the classic retail war, the one a player at MegaStoreGenerico's scale wins almost by definition thanks to its purchasing volume. And you're right: on that ground, we have no structural advantage, because we never chose to fight there. Our strategy, from day one, was explicitly the opposite: not competing on the lowest price, but on curated discovery and trust in local sellers. When we measure the same landscape with the axes that actually reflect that strategy —catalog breadth and curation depth—, we show up with a clearly open space of our own, one neither the megastore nor the neighborhood shops occupy today. The first map isn't miscalculated — it's measuring the wrong fight. The second one is the one that actually answers whether our strategy has a place to win."
Summary and next step
This lesson showed that a 2×2 map can be technically rigorous —pass lesson 6's discrimination test— and still lead you to the wrong conclusion, if its axes measure a battle your strategy already decided not to fight. With the price and assortment axes, Mercado shows up trapped in the same quadrant as a megastore that's always going to beat it on scale; with today's correct axes, the same Mercado has a clear, open space of its own. The clearest sign of using yesterday's axes: an important player —JustSearchOnGoogle— doesn't even fit them.
Before moving on you should be able to: recognize when a "bad" competitive map result comes from measuring the wrong battle, and explain why the solution isn't to compete on those axes, but to check whether they're the right axes.
With today's landscape, tomorrow's, and the criterion for choosing axes that discriminate and stay current, you now have every piece of the module. Lesson 8 —the project— brings them together into a single, complete competitive map of Mercado, with the final recommendation.
Resources
- Jeff Jordan (a16z), "So You Want to Compete Against Amazon?" — a16z.com/so-you-want-to-compete-against-amazon. The article's central argument is, word for word, this lesson's: competing against a giant on price and scale is a war lost before it starts; curation and specialization are the axes where you can actually win. In English.
- Michael Porter, "The Five Competitive Forces That Shape Strategy" — hbr.org/2008/01/the-five-competitive-forces-that-shape-strategy. Porter warns that the forces defining an industry change over time — a competitive analysis done once, with the same old axes, ages badly precisely for this reason. In English.