Budget spectrum
Funnel
| Channel | Budget € | CPC € | %Reg | %Acc | Max regs (cap) | Offline boost % | Confidence | → Regs |
|---|
| Channel | Cost € | Reach | %Reg | %Acc | Multiplier % | Confidence | → Regs |
|---|
| Channel | Cost € | Multiplier % | Confidence |
|---|
| Channel | Spend € | Clicks / reach | Registrations | Accepts | Installs |
|---|
| Use | Campaign | Date | Spend | Regs | CPA reg | Acc % | Install % | Weight |
|---|
A user manual and a look under the hood: what the numbers mean, how the graph works, what sets the sweet spot, and where the starting values come from.
What this tool does
It models a group-purchase campaign end to end: you spend money across channels, that produces registrations, a share of those accept the offer, a share of those install, and installs earn revenue. The tool answers three questions: how many installs/€ will this plan produce, what is the best split of the budget across channels, and where does adding more budget stop paying for itself (the sweet spot). Everything runs in your browser — no data leaves the page.
Quick start
The three channel groups
| Group | Examples | Own registrations? | Offline boost? |
|---|---|---|---|
| Online (paid) | Google, Bing, Facebook/Instagram | Yes — budget-driven, saturating | Receives it |
| Online (direct) | "Online other" | Yes — fixed, not budget-driven | Receives it |
| Community | DM, Mailing list, DTD | Yes — reach × %reg | Adds a small multiplier |
| ATL | Radio, Addressable TV, DOOH, Print, Programmatic… | No | Adds a multiplier |
ATL and community channels don't (or barely) register people directly — they lift the online channels. That lift is the "offline boost", explained below.
The funnel — how spend becomes result
Every channel's registrations flow through the same waterfall. Accept rate and install rate are the two conversion steps after registration:
The KPI strip and the Funnel card on the planner show exactly these five steps for your current mix.
Diminishing returns — the saturation curve
An online channel does not return registrations forever in a straight line. Search volume and audience size cap it. Each channel has a Max regs (cap) — the most it can ever produce. Registrations follow a saturating curve:
At spend = half you get half the cap; as spend climbs, you approach the cap but never pass it. This is what bends the green curve. Set the cap to 0 for a channel with no ceiling (registrations then grow linearly — useful only when you're nowhere near saturation).
Example (DE Google preset): CPC €1.56, %reg 7.5%, cap 1400. efficiency = 0.075/1.56 ≈ 0.048 regs/€; half ≈ 1400/0.048 ≈ €29,000. So ~€29k of Google spend gets you ~700 regs, and doubling to €58k gets ~930, not 1,400.
The budget-spectrum graph
The chart sweeps online budget from €0 to the slider maximum and, at each level, computes the best achievable result. Four things to read:
- Green curve Result if the budget at that level were split optimally across channels (the efficient frontier).
- Band The pessimistic-to-optimistic range, driven by channel confidence (see below).
- Dark dot + line Your current plan: your online budget and its result. Below the curve = your split is not optimal yet.
- Gold dots Past campaigns (from Actuals), plotted at their online spend vs real result — a reality check against the model.
What decides the sweet spot
The labelled peak on the green curve is the sweet spot: the online-budget level where result (revenue − cost) is highest. It exists because of the tension between the two curves:
Before the peak, an extra euro of well-placed budget returns more than a euro of result — keep spending. After the peak, saturation means the same euro returns less than a euro — you're buying registrations that cost more than they earn. The peak is the profit-maximising budget, not the maximum-registrations budget.
The optimizer — best split at any budget
"Optimize mix" (and the green curve itself) use a greedy allocation. It hands out the budget in ~300 small steps; each step goes to whichever channel currently returns the most registrations for the next euro (its marginal return):
As a channel fills up, its marginal return drops, so the next euros move to a channel that's still cheap. The result equalises marginal returns across channels — the classic "water-filling" split. The direct channel ("Online other") has no budget lever, so the optimizer never funds it. The slider is different: it keeps your ratios and just scales them, so your manual choices survive until you explicitly click Optimize.
Offline boost (multipliers)
ATL and community channels lift every online channel's registrations while they run. The total boost is simply the sum of all their multipliers:
It's applied to each online channel as × (1 + boost/100). Each online row auto-fills with this total; type your own number in a row to override just that channel (the cell turns yellow and stops auto-updating). "Reset multipliers to average" flattens ATL to their average and clears overrides. This model is additive and uniform across online channels — a deliberate simplification; when actuals show real lift, the priors tighten.
Confidence & the uncertainty band
Every channel carries a confidence level that sets how wide its band is. The band on the graph and the KPI ranges come from flexing each channel up and down by its confidence:
| Confidence | ± width | Meaning |
|---|---|---|
| HIGH | ±10% | measured, stable |
| MED | ±25% | some evidence |
| LOW | ±40% | prior / guess |
Thin evidence → wide band. When you log real campaign data, matched channels are bumped up a level (low→med→high), so the band narrows as the tool learns.
How the starting numbers are loaded
On open, the tool loads a market and builds a fresh scenario in three layers:
The derivation from a logged campaign is direct arithmetic:
Recency × volume weighting
When several campaigns feed the benchmark, newer and bigger ones count more. Each campaign's weight is its registration volume decayed by age on a one-year half-life:
A campaign from today counts full; one from a year ago counts half. The Weight column in the Actuals tab shows each campaign's share; untick a campaign to exclude it from the prefill.
Where your data lives
Markets, saved scenarios and logged campaigns are stored in this browser only (localStorage) — nothing is uploaded. That's why the data is per-device for now. The save/load points are isolated so a hosted version can swap them for a shared database (Supabase/Cloudflare) without changing anything you see here.