Module 2: Vision And Mission
Mini-project: Mercado's vision and mission one-pager
Description
It's time to bring the whole module together into a single artifact: Mercado's vision and mission one-pager. You learned to recognize a real vision (L2), separate it from mission (L3), place all four layers (L4), use the vision to rule out initiatives (L5), tell the aspirational apart from the empty (L6), and defend it even against short-term temptation (L7). In this project you use the two models you built — classifyLayer and visionFilter — on the complete case, not on isolated fragments like in each lesson.
Your deliverable has three parts, and all three are verified with code, not just written out: (1) Mercado's vision and mission, with their explicit includes and excludes; (2) the four layers mapped with a concrete example of each, verified with classifyLayer; and (3) Mercado's complete backlog — six real initiatives — filtered with visionFilter, showing which ones belong to this direction and which don't, even when some are good ideas.
Connection to the module. This project introduces no new concept — it gathers, in a single verified document, everything you built lesson by lesson. It's also the first link in an arc that continues through the rest of the guide: the vision you write here is the one module 3 will use to define Mercado's target segment and positioning, and the same one module 7 will use, once complete with strategy and moats, to filter the real roadmap.
An analogy: the garden's master plan
A landscape gardener who has tended the same garden for years doesn't improvise season after season — they have, somewhere, a master plan: a document that fixes where the oak tree is (the vision, at the center, almost unmovable), why the family goes out to tend this garden today (the mission — "we want a space where our children can play safely this spring"), which quadrant gets attention this season and why (the strategy), and a simple rule for evaluating any new plant someone proposes adding: does it feed the oak, or does it compete with it for light and water? Without that plan, every gardening decision gets made in isolation, disconnected from the ones before it, and the garden ends up with no recognizable direction.
This mini-project is exactly that master plan, applied to Mercado. It isn't an exercise in pretty writing — it's a working document anyone on the team should be able to use, the next time someone proposes a new initiative, to answer in minutes: does this belong in our garden, or is it a plant competing with the oak?
The reference solution, verified
Part 1 — Mercado's vision and mission, with their include/exclude
This is the vision and mission you've been using since lesson 1, now gathered into a single document with their explicit includes and excludes — the detail that, per lesson 5, is what turns a pretty vision into a real decision-making tool:
const mercadosOnePager = {
vision: {
statement: 'The world where anyone discovers, on Mercado, what they didn\'t know they wanted.',
horizon: '10+ years, no deadline',
includes: ['curatedDiscovery', 'localSellerTrust', 'serendipity'],
excludes: ['exactSkuSearchEngine', 'lowestPriceRace', 'genericMegastore'],
},
mission: {
statement: 'We exist to connect curious buyers with trusted local sellers, today.',
horizon: 'today, with what already exists',
},
};
Verify each piece against the module's criteria before continuing: the vision describes a state of the world, not a company action (lesson 2); it has a subject other than Mercado and a horizon with no date (lesson 3); its excludes name legitimate, profitable businesses Mercado says no to, not just obviously bad ones (lesson 5); and it can be "drawn" as a concrete scene, with a recognizable way to fail (lesson 6).
Part 2 — The verification, run in Node
Now we run the entire module against the complete case: classifyLayer maps the four layers with a concrete example of each, and visionFilter filters the complete six-initiative backlog.
// PROJECT: Mercado's vision and mission one-pager, verified with the
// module's two models -- classifyLayer (L2-L4, L6) and visionFilter
// (L5, L7) -- applied to the complete case, not isolated fragments.
function classifyLayer(statement) {
const text = statement.toLowerCase();
const signals = {
tactic: ['launch', 'implement', 'add', 'sprint', 'this quarter', ' q1', ' q2', ' q3', ' q4'],
strategy: ['we choose', 'instead of', 'we focus on', 'we will invest', 'the next', 'we bet on', 'we win'],
mission: ['we exist to', 'our mission', 'we help', ' today'],
vision: ['the world where', 'the place where', 'someday', 'our vision', 'we imagine a'],
};
const order = ['tactic', 'strategy', 'mission', 'vision'];
for (const layer of order) {
if (signals[layer].some((kw) => text.includes(kw))) {
return layer;
}
}
return 'unclear';
}
function visionFilter(vision, initiatives) {
return initiatives.map((initiative) => {
const brokenExclude = vision.excludes.find((rule) => initiative.conflictsWith.includes(rule));
const matchedInclude = vision.includes.find((rule) => initiative.supports.includes(rule));
let fitsVision;
let reason;
if (brokenExclude) {
fitsVision = false;
reason = `conflicts with something the vision rules out: "${brokenExclude}"`;
} else if (matchedInclude) {
fitsVision = true;
reason = `serves something the vision includes: "${matchedInclude}"`;
} else {
fitsVision = false;
reason = 'does not connect with any "yes" in the vision';
}
return { initiative: initiative.name, fitsVision, reason };
});
}
// PART 1: Mercado's one-pager, mapped across the 4 layers.
const mercadosLayers = [
{ label: 'Vision', text: 'The world where anyone discovers, on Mercado, what they didn\'t know they wanted.' },
{ label: 'Mission', text: 'We exist to connect curious buyers with trusted local sellers, today.' },
{ label: 'Strategy', text: 'We choose to focus on buyers who browse, not those searching for an exact SKU, and we win by investing in curated discovery instead of the lowest price.' },
{ label: 'Tactic', text: 'This quarter we launch the redesigned recommendations feed in checkout.' },
];
console.log('=== PART 1: Mercado\'s one-pager, across the 4 layers ===\n');
for (const l of mercadosLayers) {
console.log(`[${l.label}] -> classifyLayer(): ${classifyLayer(l.text)}`);
}
// PART 2: the vision filter over the complete backlog (6 initiatives).
const mercadosVision = {
statement: 'The world where anyone discovers, on Mercado, what they didn\'t know they wanted.',
includes: ['curatedDiscovery', 'localSellerTrust', 'serendipity'],
excludes: ['exactSkuSearchEngine', 'lowestPriceRace', 'genericMegastore'],
};
const backlog = [
{ name: 'recommendationsEngine', supports: ['curatedDiscovery', 'serendipity'], conflictsWith: [] },
{ name: 'sellerTrustBadges', supports: ['localSellerTrust'], conflictsWith: [] },
{ name: 'localArtisanSpotlight', supports: ['localSellerTrust', 'serendipity'], conflictsWith: [] },
{ name: 'lowestPriceGuarantee', supports: [], conflictsWith: ['lowestPriceRace'] },
{ name: 'oneClickReorder', supports: [], conflictsWith: [] },
{ name: 'bulkWholesaleCatalog', supports: [], conflictsWith: ['genericMegastore'] },
];
console.log('\n=== PART 2: the vision filter over Mercado\'s backlog ===\n');
const results = visionFilter(mercadosVision, backlog);
console.table(
results.map((r) => ({
initiative: r.initiative,
fitsVision: r.fitsVision,
reason: r.reason,
}))
);
const inCount = results.filter((r) => r.fitsVision).length;
console.log(`${inCount}/${backlog.length} backlog initiatives fit Mercado's vision.`);
What to expect. Running the file with Node, the output is exactly this:
=== PART 1: Mercado's one-pager, across the 4 layers ===
[Vision] -> classifyLayer(): vision
[Mission] -> classifyLayer(): mission
[Strategy] -> classifyLayer(): strategy
[Tactic] -> classifyLayer(): tactic
=== PART 2: the vision filter over Mercado's backlog ===
┌─────────┬─────────────────────────┬────────────┬─────────────────────────────────────────────────────────────────────┐
│ (index) │ initiative │ fitsVision │ reason │
├─────────┼─────────────────────────┼────────────┼─────────────────────────────────────────────────────────────────────┤
│ 0 │ 'recommendationsEngine' │ true │ 'serves something the vision includes: "curatedDiscovery"' │
│ 1 │ 'sellerTrustBadges' │ true │ 'serves something the vision includes: "localSellerTrust"' │
│ 2 │ 'localArtisanSpotlight' │ true │ 'serves something the vision includes: "localSellerTrust"' │
│ 3 │ 'lowestPriceGuarantee' │ false │ 'conflicts with something the vision rules out: "lowestPriceRace"' │
│ 4 │ 'oneClickReorder' │ false │ 'does not connect with any "yes" in the vision' │
│ 5 │ 'bulkWholesaleCatalog' │ false │ 'conflicts with something the vision rules out: "genericMegastore"' │
└─────────┴─────────────────────────┴────────────┴─────────────────────────────────────────────────────────────────────┘
3/6 backlog initiatives fit Mercado's vision.
The result: 3 of 6 backlog initiatives fit Mercado's vision — exactly half and half. This isn't a planning failure or a sign the team proposes badly — it's exactly what the master plan is designed to find. Look at the three left out, one by one, with the module's exact vocabulary:
lowestPriceGuaranteeclashes with an explicitexclude(lowestPriceRace). It's a legitimate business idea, at another company; at Mercado, it's the vine competing for the same light as the oak.oneClickReorderclashes with nothing, but also serves nothing — "not being harmful" isn't enough (lesson 5). It's a reasonable convenience improvement that, with no connection tocuratedDiscovery,localSellerTrust, orserendipity, has no place in this specific master plan — it could, however, live comfortably in another company's backlog, under another vision.bulkWholesaleCatalogclashes withgenericMegastore— the destination exactly opposite to the one Mercado chose. It's the initiative that most resembles "growth for growth's sake," the kind of bet module 7 (strategy-to-roadmap) will name in more detail once the full strategy comes into play.
And the three that do fit — recommendationsEngine, sellerTrustBadges, localArtisanSpotlight — don't just "not violate" anything: each one actively connects with at least one of the three includes. That's the real standard for a master plan that works: it isn't enough to avoid what's forbidden, you have to build what serves the direction.
Common mistakes
Delivering vision and mission with no excludes, because "it already feels complete". What happens: the team writes a vision and mission that sound good, presents them as the finished one-pager, and never gets around to explicitly writing what gets excluded — the part that, per lesson 5, is what makes the document useful for anything. Why it happens: the includes feel like "the real work" (they're the inspiring part), and the excludes feel like an optional appendix. How to spot it: if your one-pager has no explicit excludes list as concrete as its includes, it isn't finished — it just looks finished. How to fix it: don't close the document until you can name, for each include, its direct opposite as an exclude, with the same specificity — exactly lesson 5's exercise.
Writing a different vision and mission every time someone needs them. What happens: in an investor pitch the vision sounds one way, in the internal README it sounds another way, and in the last team meeting someone improvised a third version — all similar, none identical. Why it happens: without a single reference document (this project's one-pager), each person writes from memory, and memory varies. How to spot it: ask three people on the team to write the vision from memory, without looking at any document — if all three versions say substantially different things, there's no real master plan, there are three competing drafts. How to fix it: this project's one-pager should be the single source of truth, quoted verbatim (not paraphrased from memory) every time someone needs the vision or mission in a document, a presentation, or a decision.
Treating the filter's result as the final decision on what to build. What happens: "3/6 fit the vision" gets interpreted as "let's build exactly those 3, in that order, and drop the other 3 forever." Why it happens: a binary result (fitsVision: true/false) feels like a complete verdict, when it actually answers a single, prior question: does this belong to this direction or not. How to spot it: if your build plan uses the order of the visionFilter table as priority, with no regard for impact or effort, you're missing a step — that's RICE's job, from product-thinking-for-engineers-guide, which applies after this filter, not instead of it. How to fix it: remember module 1's boundary — this filter decides what can compete for priority; it doesn't decide the order. The 3 initiatives that fit the vision still need real prioritization before showing up on a roadmap.
Exercises
Exercise 1 — Add a seventh initiative. Mercado's team proposes a seventh initiative: "an ambassador program where people invite friends to discover new sellers." Write its object (name, supports, conflictsWith) following the project's backlog pattern, add it, and predict whether visionFilter would mark it fitsVision: true or false.
See solution
A reasonable version:
{ name: 'friendReferralDiscoveryProgram', supports: ['serendipity', 'curatedDiscovery'], conflictsWith: [] }
With these supports, visionFilter would find matchedInclude: 'serendipity' (the first include that matches, per vision.includes's order) and mark fitsVision: true. An ambassador program focused on discovering new sellers — not on referral discounts, which would be a different story — connects directly to the heart of Mercado's vision.
Exercise 2 — Trace a new tactic through the 4 layers. Choose one of the three initiatives that did fit the vision (recommendationsEngine, sellerTrustBadges, or localArtisanSpotlight). Write, in one sentence each, the strategy and mission that connect it upward — like you did in lesson 4's exercise 2 — and verify with classifyLayer that each sentence falls into its correct layer.
See solution
For sellerTrustBadges (trust badges for sellers):
- Tactic: "This quarter we launch trust badges on local sellers' profiles." →
classifyLayer():tactic(contains "launch" and "this quarter"). - Strategy: "We choose to focus on buyers who browse, not those searching for an exact SKU, and we win by investing in curated discovery instead of the lowest price." →
classifyLayer():strategy(the same strategy from the whole module — badges are a concrete way of investing in trust, part of that bet). - Mission: "We exist to connect curious buyers with trusted local sellers, today." →
classifyLayer():mission(the badges serve, right now, exactly that purpose: helping trust become visible).
The full chain confirms what you saw in lesson 4: each layer justifies the one below it, and none can be skipped without weakening the justification.
Exercise 3 — Present the result to a skeptical stakeholder. A growth manager, who didn't take this module, sees the results table and asks: "why are we leaving lowestPriceGuarantee and bulkWholesaleCatalog on the table — two ideas that would clearly move the number this quarter?" Write, in one paragraph, how you'd explain the project's full result to them, using the module's vocabulary (vision, excludes, horizon, oak tree) without sounding like you're against growing.
See solution
An example answer: "We're not against moving the number — in fact, 3 of the backlog's 6 initiatives do that, and we prioritize those with RICE as usual. The two you mention directly clash with what our vision explicitly rules out: we don't compete on price and we don't become a generic catalog — we compete on helping people discover something they didn't know they wanted, with trusted local sellers. They're ideas that would work at another company, under another vision. Here, accepting them 'just this quarter' is exactly the kind of decision that, looked at over ten years, turns us into a generic discount store instead of the discovery destination we're building. And that reputation, once lost, is far more expensive to recover than any number from this quarter."
Notice the structure: it acknowledges the merit of both ideas (avoids sounding anti-growth), cites the specific excludes precisely, connects the decision to the long-term horizon in concrete terms (reputation, not just "the vision" as an abstraction), and makes clear the filter didn't block everything — 3 of 6 initiatives continue through normal prioritization.
Summary and next step
In this mini-project you brought the whole module together into a single master plan: Mercado's vision and mission, with their explicit includes and excludes; the four layers mapped and verified with classifyLayer; and the complete backlog filtered with visionFilter — with 3 of 6 initiatives falling out, not for being bad ideas, but for not belonging to this ten-year direction. With this you close module 2.
You now have, for any initiative that shows up in your own work, two precise questions you didn't have before: "which layer does this statement live in?" and "does this serve our vision, or does it just not harm it?" — and you know the second question demands more than the first.
Where you go next. You now know where Mercado is headed and why. The question that follows, now that the general direction is fixed, is much more concrete: out of everyone who could shop on a marketplace, who exactly is this for — and who is it NOT for? That's exactly the question for module 3 (module-03-target-and-positioning): the target segment and positioning, the next layer of precision after the vision you just defined.
Resources
- Roger Martin, "Decoding the Strategy Choice Cascade" — rogermartin.medium.com/decoding-the-strategy-choice-cascade-475d40555eb1. The full Playing to Win framework — now that you have your own version of the cascade's first choice, the winning aspiration, it's worth rereading it with the exercise fresh. In English.
- Richard Rumelt, Good Strategy Bad Strategy — goodbadstrategy.com. The book that names, at the full-strategy level, the same pattern you practiced at the vision level: a statement that only works if it genuinely constrains action. In English.
- Jim Collins, "BHAG (Big Hairy Audacious Goal)" — jimcollins.com/concepts/bhag.html. To compare the one-pager you just built against real BHAGs from companies that sustained their vision for decades. In English.
- Marty Cagan (SVPG), "Product Vision vs. Mission" — svpg.com/product-vision-vs-mission. The module's reference article, worth rereading now that you have Mercado's complete case as your own example. In English.
- Gibson Biddle, "Intro to Product Strategy" — gibsonbiddle.medium.com/intro-to-product-strategy-60bdf72b17e3. The natural bridge into module 3: how an already-defined product vision turns into concrete decisions about who to serve first. In English.