The Anatomy of a Working Marketing Plan
Why interactive calculators beat PDFs in founder decision-making — and what shipping one for a Bulgarian wellness operator taught me about strategy documents that survive contact with reality.
This is a draft. The first 30% is shippable; the rest is a working-out sketch I will refine before launch. Comments welcome by email.
Most marketing plans are dead on arrival. Not because the strategy is wrong — the strategy is usually fine — but because the document is the wrong shape for how the decision will actually get made. A PDF is read once, skimmed, and filed. An interactive calculator is opened repeatedly, dragged, argued with in real time. The difference between the two is the difference between a plan that ships and a plan that ages.
I had to learn this the hard way on a recent engagement for a Bulgarian longevity-and-spa operator running a 2.5-month summer campaign. The story is useful because it exposes a class of mistakes I see in almost every B2B and premium-SMB marketing document I read.
The problem the document has to solve
The owner had to commit to a campaign budget for 15 June through 30 August, covering 35 line items across 9 channels — social, search, display, out-of-home, influencer, email, PR, blog, and a few specialist segments. The total was somewhere between €16,000 and €38,000 of media spend, depending which case the agency was making that morning. The agency fee on top hovered around 10% with a €1,000/month floor.
You could write that as a deck. Many do. Here is what happens when you write it as a deck:
- The owner reads it. The numbers are big. The numbers are campaign-totals across four months, not per-month, because the agency inherited a four-month calibration from an earlier scope.
- The owner asks: “What if I want to spend less?”
- The account manager says: “We can rework the deck. Two days.”
- Two days later: a new deck. Different totals. The owner can no longer tell which line items shifted vs. which got proportionally compressed.
- Three iterations in, the owner makes a call by gut, not by spreadsheet, because the spreadsheet behind the deck is opaque to her and the deck itself is not the spreadsheet.
This is the failure mode. The artifact the owner is asked to commit against is not the same artifact the agency is reasoning from. The deck is a photograph of the spreadsheet at one moment. The owner is being asked to decide based on the photograph.
What a working artifact looks like
The version we shipped instead is a single-page interactive plan, hosted at a private URL on the consultancy’s own site, gated by HTTP Basic auth for confidentiality. It looks like a long marketing document — sections for audience, messaging, channels, calendar, creative, risks — except that every budget number is a slider.
Drag the Instagram slider from €450/month to €1,100/month and three things happen, simultaneously and instantly:
- The Instagram line’s value text updates from
€450/месto€1,100/мес. - The Instagram section’s total updates.
- The right-hand-side tally at the top of the page recalculates the monthly total, the campaign total (× 2.5 months), and the per-section breakdown — including the agency fee, computed as the larger of (10% of media) or (€1,000/month floor).
The owner can experiment. The owner can answer, in 30 seconds, the question “what if we cut OOH and double Instagram?” without anyone rebuilding a deck.
Three months ago I would have shipped this as a PDF. Today I think shipping it as a PDF for any client whose decision is multi-variable would be a form of malpractice.
The five design moves that make the interactive plan work
Most marketing-strategy documents I see have a version of “the budget table.” Few of them work. The ones that do share these properties.
1. Monthly, never campaign-total, on any user-facing surface
The single biggest source of confusion in the original four-month brief was that some line items were quoted as campaign totals (“Instagram: €4,500 across the campaign”) and others as monthly rates. The owner had to do mental arithmetic just to compare two channels.
The fix is brutal: every slider on the page is monthly. The campaign
total is computed exactly once, in one place, on the right-hand tally,
as monthlyTotal × CAMPAIGN_MONTHS where CAMPAIGN_MONTHS is a single
constant declared in two places that must stay in sync (the Astro
frontmatter and the runtime <script> — see notes below).
When the campaign length changed from 4 months to 2.5, exactly one constant moved. Every slider kept its monthly default. Every total recomputed. Nothing else had to change in the data file.
Confidence: high. Across every multi-variable-budget tool I’ve shipped, “monthly only” is the single change that produces the largest reduction in owner confusion.
2. Three presets, anchored on round numbers the owner uses out loud
The page has three preset buttons: Lean €16K, База €28K, Premium €38K.
The number on the button is the campaign-total media spend over the 2.5
months — because that is the number the owner mentions when speaking with
investors, partners, or her own internal board.
The preset doesn’t snap each slider to a fixed value. It scales every
slider by factor = (target / 2.5) / baseMonthlyMedia, then rounds to
the slider’s step (€25 increments for visual consistency). The agency fee
recomputes naturally on top.
The “База” preset is calibrated such that the default monthly media spend × 2.5 months lands at exactly €28,000. This is not coincidental — “Lean / База / Premium” labels are the prices the owner will quote to investors, and the middle one needs to match the page’s default state so that the first thing the owner sees on landing matches what she has been telling her board.
A Нулирай (Reset) button re-applies the База preset. It is momentary
— pressing it does not put the page in a “Reset state” — it just
re-runs the База preset and clears any value toggles.
Confidence: high. Anchoring presets on round numbers the principal uses verbally is the highest-leverage decision in any interactive plan. If you can predict what the principal will say to her board on the next call, label your presets with those numbers.
3. Per-line include/exclude toggles, with section folds
Every line item in the plan has a checkbox to its left. Default: on.
When a line is unchecked:
- The slider remains interactive — the owner can drag it to set a value she is considering for next campaign — but the value does not contribute to the total.
- The row fades to ~50% opacity and the value text gets a strikethrough.
- The right-hand tally’s per-section breakdown filters out the section if all of its lines sum to 0.
The presets, importantly, re-enable every line. They represent a clean composition restart, not a value-only nudge.
This solves a class of UX failure I see constantly: the owner says “what if we just cut DOOH for this campaign,” gets a new deck two days later, and cannot quickly answer “OK now what if we put DOOH back at half.” With per-line toggles, both questions are 8 clicks apart on the same page.
4. Section order follows reading order, never value order
The right-hand-side tally lists each section with its current spend and its percentage of the monthly total. Early in the build, I made the mistake of sorting sections by value descending — biggest spend at the top, smallest at the bottom — because that’s what every financial report does.
The owner reviewed a screenshot. The sections were out of order with the main page. Social, listed third on the page, was now top of the sidebar; Production, listed sixth on the page, was now fourth. She told me, accurately, that this looked disorganised.
The fix: render the sidebar in the same order as the main content,
filtering only the zero-effective-total sections. The data structure
that backs it is a Map built fresh on each recalc by iterating sliders
in DOM order, so its insertion order is the page-reading order. The
agency-fee row is always appended last.
Confidence: high. Decision artifacts should preserve reading order. The slight ergonomic loss (the biggest line item is not at the top) is dwarfed by the gain (the document is internally consistent with itself).
5. The deliverable is the document, the document is the deliverable
The interactive plan lives at /clients/<client-slug> on
stratolattice.com. HTTP Basic auth gates it. The middleware is a
single Pages Function (functions/clients/_middleware.ts) that runs
before the static asset is served. The site itself is output: 'static'; only this one route runs as a Pages Function.
The owner shares the URL with her one trusted advisor by giving him
the password. He opens it on his iPad on a train. The plan loads in
under a second on 4G because the page itself ships zero client-side
JavaScript except for the slider-recalculation logic, which is inline
on the page in is:inline block-scoped JS.
The plan is not “the strategy in PDF form.” The plan is the strategy.
The two ugly bits the writeup usually leaves out
Every “we shipped a nice thing” essay rounds off the rough edges. The following two were real, and worth being explicit about, because they predict the failure modes of anyone copying this pattern.
Two sources of truth for the agency fee model
The agency-fee model — max(10% of media, €1,000) per month — is
computed in two places. Once in the Astro frontmatter for the initial
server-side render, and once in the runtime <script> for live recalc
on slider drag.
They must stay in sync. They almost didn’t, twice.
The right architecture is a single TypeScript module imported by both the page frontmatter and the runtime script. The architecture we actually shipped has the constants duplicated and an inline comment warning future-me. This is technical debt. It’s also the kind of technical debt that is fine to ship for a one-off client artifact and catastrophic to ship for a productised offering. I am building the shared module before the next client.
The “precisely 10%” detour
Mid-build, the owner asked for “precisely 10%” because the breakdown
table showed the agency fee as 9% at the default state (€1,125 / €12,375
monthly total = 9.1%). I implemented a gross-up — fee = media / 9 —
which makes the displayed share land at exactly 10%.
She reverted it within a day. The original interpretation — 10% of media,
floored at €1,000/month — was what she meant, and the displayed-share
arithmetic of fee / monthlyTotal was simply a different number than
“10% of media.” Both are true; both are different; one of them is the
contract and the other is a derived statistic.
This is the kind of friction that only surfaces when the document is interactive. If we had shipped the deck, the gross-up would still be in there, the owner would not have noticed because there is no live breakdown table on a deck, and the consultancy would have been quietly wrong for the entire campaign.
Confidence: high. Interactive documents surface bugs that static documents conceal. This is a feature.
Why this matters beyond marketing plans
The case study is a marketing plan. The pattern generalises to any artifact where:
- The principal needs to commit against a multi-variable budget, plan, or roadmap.
- The principal has to defend that commitment to a second party (board, investor, partner, regulator).
- The variables interact non-trivially (changing one shifts others’ relative weights or absolute floors).
That class of artifact is most of what strategic consultancies produce. McKinsey and BCG ship it as decks because decks are how their delivery model is priced — each iteration is billable. A solo consultant has no incentive to multiply iterations. A solo consultant has an incentive to ship the generator of iterations and let the client run iterations herself.
Three places this pattern applies that I’m currently working on:
- AI-strategy roadmaps. Pillar I deliverables benefit enormously from an interactive surface where the client can drag a “team capacity” slider and watch the 90-day plan re-sequence in real time.
- Patent-portfolio prioritisation. For an IP firm: each patent family is a line item with a defensibility score, a maintenance cost, and a strategic-value rating. The principal needs to decide which to abandon. An interactive sortable table is a better artifact than any deck.
- R&D project gating. A pharma R&D director deciding which programmes to advance to the next stage benefits from a sliders-and- tally artifact more than from a quarterly review deck. The deck communicates a single snapshot; the artifact lets her stress-test the snapshot.
How to ship this for your own client
The technical stack that makes this cheap:
- Astro 5 with
output: 'static'andprefetch: false - A single TypeScript data file per client (
src/data/<client>.ts) declaring the line items, defaults, and step sizes - One
<input type="range">per line, one inline<script is:inline>for recalculation, no client framework - One Cloudflare Pages Function for HTTP Basic auth on
/clients/* - Geist + Geist Mono self-hosted, metrics-matched fallbacks for zero CLS
- A real touch hit area on mobile (
pointer: coarsemedia query bumps slider height to 48px while keeping the visible track at 4px)
End-to-end build time for the next plan, with the template in place: maybe 8 hours. The first one took 40, because the template didn’t exist yet. The third will take 4.
The interactive plan is not the future of marketing-strategy consulting. It’s the present of any consulting where the principal has to commit, defend, and revise — and the document is currently a deck because the consultancy hasn’t bothered to ship anything else.
That is most of the consulting industry.
If you’d like an interactive plan for your next decision — marketing,
roadmap, portfolio, R&D — the engagement form lives at
/engagements. The email list (one piece every two weeks, on craft
and on strategy) is the form below.