Module 3: Target And Positioning

The beachhead: narrow before wide

Description

The previous lesson showed that Mercado clearly wins for explorers and clearly loses for exactSkuShoppers. A natural reaction to that result is to think: "so let's avoid choosing, and serve both well — the average buyer, without leaning toward either side in particular." This lesson exists to dismantle that idea with a single, run number: not even "the average buyer, unsegmented" is a winning bet. Trying to please everyone a little doesn't leave you tied — it leaves you losing, because while you spread your strengths evenly, a generalist rival is already optimized exactly for that average.

Geoffrey Moore named the right alternative in Crossing the Chasm: the beachhead — a segment big enough to matter, but small enough to win completely, before trying to expand anywhere else. It isn't a decision to "think small out of modesty" — it's the only way to accumulate a real win to expand from, instead of spreading the same effort so thin it isn't enough to win any single place.

Connection to the module. Lesson 2 gave you two segments with opposite verdicts. This lesson adds a third point of comparison — "every buyer, undifferentiated" — and uses the same positionFit to show, with data, why that third path is the worst of the three, not a safe middle ground.

An everyday analogy: the beach before the continent

The term beachhead comes, literally, from a military operation: before trying to take an entire continent, a landing army chooses a single beach, the smallest one still sufficient to establish a solid base — enough space to land troops, secure supplies, and hold the position without the enemy retaking it the first night. Nobody successful in military history has ever tried to invade an entire continent in a single simultaneous landing along the whole coastline — the front would be so wide there wouldn't be enough force at any single point to hold it, and the invading army would lose everywhere at once, without having won anywhere.

Choosing a market is exactly that same decision. You can try to "land" on the entire e-commerce market at once — every buyer, every job, every category — and spread your force (your team, your budget, your product) so thin across that entire front that you don't hold any real position anywhere. Or you can choose a single beach — a specific segment, like explorers — narrow enough that your concentrated force takes it completely, and from there, with a secure base and a first group of customers who love you, expand toward the next segment. The beach was never the invasion's final destination — it was the only point from which a bigger invasion becomes possible.

Worked example: the whole continent loses where the beachhead wins

Let's run positionFit with a segment representing "every buyer, undifferentiated" — each of the six dimensions weighs exactly the same, 1/6, because nobody decided any of them mattered more than the others — and compare it against the already-known result for explorers, the narrow beachhead.

function positionFit(target, product, alternatives) {
  const dims = Object.keys(target.weights).filter((d) => target.weights[d] > 0);
  const weightedScore = (c) => dims.reduce((sum, d) => sum + target.weights[d] * c.scores[d], 0);
  const productScore = weightedScore(product);
  const rivals = alternatives.map((a) => ({ name: a.name, score: weightedScore(a) }));
  const bestRival = rivals.reduce((a, b) => (b.score > a.score ? b : a));
  const byDimension = dims.map((d) => {
    const rivalBest = alternatives.reduce(
      (best, a) => (a.scores[d] > best.score ? { name: a.name, score: a.scores[d] } : best),
      { name: alternatives[0].name, score: -Infinity }
    );
    return { dimension: d, weight: target.weights[d], productScore: product.scores[d], bestRivalScore: rivalBest.score, bestRivalName: rivalBest.name, wins: product.scores[d] > rivalBest.score };
  });
  return { segment: target.name, productWeightedScore: Number(productScore.toFixed(2)), bestRival: bestRival.name, bestRivalWeightedScore: Number(bestRival.score.toFixed(2)), fitsSegment: productScore > bestRival.score, byDimension };
}

const mercado = { name: 'Mercado', scores: { curatedDiscovery: 9, sellerTrust: 8, catalogBreadth: 6, price: 5, deliverySpeed: 5, convenience: 6 } };
const genericMegastore = { name: 'genericMegastore', scores: { curatedDiscovery: 3, sellerTrust: 4, catalogBreadth: 9, price: 8, deliverySpeed: 9, convenience: 8 } };
const localShop = { name: 'localShop', scores: { curatedDiscovery: 6, sellerTrust: 9, catalogBreadth: 2, price: 4, deliverySpeed: 3, convenience: 3 } };
const alternatives = [genericMegastore, localShop];

// The "whole continent": nobody decided any dimension mattered more.
const allShoppersAverage = { name: 'allShoppersAverage', weights: { curatedDiscovery: 1/6, sellerTrust: 1/6, catalogBreadth: 1/6, price: 1/6, deliverySpeed: 1/6, convenience: 1/6 } };
// The beachhead: a narrow beach, chosen on purpose, with concentrated weights.
const explorers = { name: 'explorers', weights: { curatedDiscovery: 0.4, sellerTrust: 0.3, catalogBreadth: 0.1, price: 0.1, deliverySpeed: 0.05, convenience: 0.05 } };

console.log('=== positionFit: allShoppersAverage (the whole continent) ===\n');
const r1 = positionFit(allShoppersAverage, mercado, alternatives);
console.log(`segment: ${r1.segment} | productWeightedScore: ${r1.productWeightedScore} | bestRival: ${r1.bestRival} (${r1.bestRivalWeightedScore}) | fitsSegment: ${r1.fitsSegment}\n`);
console.table(r1.byDimension.map((d) => ({ dimension: d.dimension, weight: Number(d.weight.toFixed(3)), product: d.productScore, bestRival: `${d.bestRivalName}:${d.bestRivalScore}`, wins: d.wins })));

console.log('\n=== positionFit: explorers (the beachhead) ===\n');
const r2 = positionFit(explorers, mercado, alternatives);
console.log(`segment: ${r2.segment} | productWeightedScore: ${r2.productWeightedScore} | bestRival: ${r2.bestRival} (${r2.bestRivalWeightedScore}) | fitsSegment: ${r2.fitsSegment}`);

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

=== positionFit: allShoppersAverage (the whole continent) ===

segment: allShoppersAverage | productWeightedScore: 6.5 | bestRival: genericMegastore (6.83) | fitsSegment: false

┌─────────┬────────────────────┬────────┬─────────┬──────────────────────┬───────┐
│ (index) │     dimension      │ weight │ product │      bestRival       │ wins  │
├─────────┼────────────────────┼────────┼─────────┼──────────────────────┼───────┤
│    0    │ 'curatedDiscovery' │ 0.167  │    9    │    'localShop:6'     │ true  │
│    1    │   'sellerTrust'    │ 0.167  │    8    │    'localShop:9'     │ false │
│    2    │  'catalogBreadth'  │ 0.167  │    6    │ 'genericMegastore:9' │ false │
│    3    │      'price'       │ 0.167  │    5    │ 'genericMegastore:8' │ false │
│    4    │  'deliverySpeed'   │ 0.167  │    5    │ 'genericMegastore:9' │ false │
│    5    │   'convenience'    │ 0.167  │    6    │ 'genericMegastore:8' │ false │
└─────────┴────────────────────┴────────┴─────────┴──────────────────────┴───────┘

=== positionFit: explorers (the beachhead) ===

segment: explorers | productWeightedScore: 7.65 | bestRival: localShop (6) | fitsSegment: true

This is the module's most counterintuitive result so far: against the "average buyer," Mercado loses — 6.5 against the generic megastore's 6.83. It doesn't lose by much, but it loses. The reason is visible in the table: Mercado only wins on one dimension (curatedDiscovery), and with even weights, that single win (9 against 6, a 3-point difference, multiplied by a weight of just 0.167) isn't enough to offset four losses against the megastore, each also multiplied by that same even weight. The generic megastore, on the other hand, was designed exactly to win "on average" — it's strong and even across almost everything, weak only in discovery — so a segment with no declared preference ends up, almost by definition, preferring the generalist.

Now compare with explorers: the same Mercado, without changing a single product number, goes from losing by 0.33 to winning by 1.65 — a swing of two full points, just from concentrating the weight where Mercado is actually strong. That's the beachhead's entire argument: it isn't that Mercado needs to improve the product to beat the average buyer — it's that the average buyer, as a segment, isn't a place where Mercado, as it is, can win. The right beach isn't "everyone, carefully" — it's the specific place where your current strength, concentrated, is already enough to win.

Going deeper: what makes a good beachhead

Moore is specific about the right size for a beachhead, and it's worth keeping in mind because the most common mistake isn't choosing "no" segment (you already saw that in lesson 2) — it's choosing one with the wrong shape:

  • Big enough to matter. A beachhead so small that winning it moves no business needle is useless, even if it's technically "narrow." If explorers were only twelve people, winning that segment with a 1.65 margin would be an academic exercise, not a base to grow from.
  • Small enough to win completely, not just "make a decent entrance." The goal isn't to have a presence in the segment — it's to dominate it, to become the obvious reference when someone in that segment thinks about the job you solve. A "half-won" beachhead doesn't generate the word-of-mouth effect or the credibility Moore identifies as this stage's real prize.
  • With reachable neighbors. Moore chooses the beachhead thinking about the next segment too: one that shares enough with the first that the reputation and product already built serve as a bridge. It isn't an isolated decision — it's the first step of a sequence.

positionFit only measures the first half of this (do we win, and by how much margin?) — the segment's real size and the existence of a reachable "neighbor" remain human judgment, informed by market data that's outside this pedagogical model's scope.

Common mistakes

Choosing a beachhead that's too big — "the average market" disguised as a segment. What happens: the team believes it chose a narrow beachhead ("online buyers interested in discovering products"), but when writing out its importance weights, they end up spread evenly across everything, with no clear priority — exactly what you saw in allShoppersAverage. Why it happens: it's more comfortable, in a meeting, not to discuss which dimension weighs more than the others — discussing that forces you to say out loud what's being sacrificed, and that's precisely the uncomfortable work module 1 already identified as the heart of a real choice. How to spot it: if your segment's weights, written honestly, all end up similar to each other (like the 0.167 on each dimension in the example), you didn't choose a beach — you chose the whole continent under another name. How to fix it: force an explicit hierarchy. Ask "if we could only win on ONE dimension for this buyer, which would it be?" — that answer should, unambiguously, carry the highest weight.

Choosing the biggest available beachhead, instead of the one that can be won first. What happens: between two possible segments, the team chooses the one with the bigger market size, not the one the current product wins by the widest margin — reasoning that "bigger is always a better starting point." Why it happens: market size is easy to measure and easy to defend to investors ("that's 50 million potential buyers"); the real probability of winning it, with today's product, is harder to estimate and more uncomfortable to admit when it's low. How to spot it: compare the winning margin (productWeightedScore minus bestRivalWeightedScore) across the beachhead options you're considering — if the "bigger" segment has a barely positive or negative margin, like allShoppersAverage, choosing it for its size is betting on winning a beach you can't yet take. How to fix it: between a big beachhead that's hard to win today, and a smaller one that's clearly winnable, Moore is explicit: choose the one you can win completely first. The big one can, legitimately, be the second beachhead — the "reachable neighbor" from going deeper — not the first.

Treating the beachhead as the final destination, not the first step of a sequence. What happens: the company wins its beachhead — dominates explorers, say — and stays there indefinitely, with no plan for the next segment, as if "winning the beach" had been the strategy's entire goal. Why it happens: winning a narrow segment produces real, visible results (growth, retention, happy customers), and that success feels sufficient — expanding means risking again, this time from a comfortable position there's no urgency to leave. How to spot it: if your company has spent years serving exactly the same narrow segment without ever once trying to expand into a neighboring segment, you probably confused the beachhead with the entire continent. How to fix it: remember Moore designed the beachhead explicitly as a starting point — the book's full title is Crossing the Chasm, not "staying on the beach." Winning explorers with a solid margin is the base of credibility, capital, and learning from which Mercado can later attempt a second segment — not the end of the journey.

Exercises

Exercise 1 — Calculate a third candidate's margin. A segment curiousGiftBuyers defines its weights as { curatedDiscovery: 0.5, sellerTrust: 0.2, catalogBreadth: 0.1, price: 0.1, deliverySpeed: 0.05, convenience: 0.05 }. Without running the code, calculate by hand Mercado's productWeightedScore for this segment (remember Mercado's scores: curatedDiscovery=9, sellerTrust=8, catalogBreadth=6, price=5, deliverySpeed=5, convenience=6) and compare it with explorers's margin (7.65).

See solution

0.5×9 + 0.2×8 + 0.1×6 + 0.1×5 + 0.05×5 + 0.05×6 = 4.5 + 1.6 + 0.6 + 0.5 + 0.25 + 0.3 = 7.75. It's even a bit higher than explorers (7.65), because it concentrates even more weight (0.5 against 0.4) on curatedDiscovery, the dimension where Mercado has its biggest advantage. It confirms the lesson's pattern: the more concentrated the weight on the highest-margin dimension, the more Mercado wins — and the more even the weight (as in allShoppersAverage), the closer it gets to losing.

Exercise 2 — Diagnose a badly chosen beachhead. A team at another company (not Mercado) describes their beachhead as "busy professionals who value their time" — with no numeric weight given to specific dimensions. Using this lesson's vocabulary, explain in 2-3 sentences why this description, as it stands, wouldn't work as real input for positionFit, and what it's missing.

See solution

It's missing exactly what separated explorers from allShoppersAverage: an explicit hierarchy of which dimension weighs more than the others. "Value their time" sounds specific, but without translating it into concrete weights (is it deliverySpeed? is it convenience? both, and in what proportion?), the description could end up, in practice, spread evenly across everything — the same allShoppersAverage mistake from this lesson, disguised with more specific-sounding language. Before it's a real beachhead, it needs to become weights that add up to a clear story: "this is what matters most, this barely matters."

Exercise 3 — Defend the sequence to an impatient investor. A Mercado investor asks: "why aren't you also going after exactSkuShoppers? It's a bigger market than explorers." Write, in one paragraph, your answer using this lesson's vocabulary (beachhead, winnable margin, reachable neighbor) without sounding like the team is afraid to grow.

See solution

An example answer: "It's not that we don't want to grow — it's that exactSkuShoppers isn't a reachable second beachhead from where we are, it's a completely different beach, defended by a rival that already structurally dominates it: we lose all four dimensions that buyer cares about, with the product as it is today. Going there now would mean splitting our effort across two fronts, winning neither clearly — the same mistake we already saw with 'the average buyer,' where we lose by a negative margin. First we consolidate explorers, with the solid margin we already have there, and then we evaluate a second segment that actually shares something with this one — not the one with the biggest market on a spreadsheet, but the one we can actually win from the base we've already built."

Summary and next step

A beachhead is a segment big enough to matter and small enough to win completely — and you saw, executed, that the seemingly "safe" alternative of not choosing (serving the average buyer, with even weights) actually loses, 6.5 against 6.83, against the same rival a well-chosen beachhead beats by a margin of 1.65. Narrow and concentrated beat wide and even — not by coincidence, but because a generalist rival is already optimized exactly for the average.

Before moving on you should be able to: explain why "serving everyone equally" loses against an established generalist; and apply a good beachhead's three conditions (matters, can be won completely, has a reachable neighbor) to any segment proposed to you.

Lesson 4 shifts the angle of the question: so far you defined segments by their importance weights, almost like a purchase preference. Now you're going to see why the right unit for defining a segment isn't demographics ("women aged 25-40") but the job that person is trying to get done — with Clayton Christensen's framework.

Resources

  • Geoffrey Moore, Crossing the Chasmgeoffreyamoore.com/book/crossing-the-chasm. The original source of the term beachhead and the "big enough to matter, small enough to win" rule that structures this lesson. In English.
  • Geoffrey Moore, "After the Chasm: Scaling Beyond the Beachhead" — geoffreyamoore.com/business_blogs/after-the-chasm-scaling-beyond-the-beachhead. Moore himself, years later, on this lesson's third common mistake: staying on the beachhead instead of expanding. In English.
  • Marty Cagan (SVPG), "Product Market Fit" — svpg.com/product-market-fit. The same "one vertical or persona at a time" principle, applied by Cagan to B2B and consumer product teams. In English.
  • April Dunford, Obviously Awesomeaprildunford.com/books. Dunford explicitly connects choosing the "best segment" to the positioning lesson 5 will build on top of it. In English.