Skip to main content

MMM Optimizer: Single Brand

When to use it​

Use single-brand optimization when one approved model covers one brand and you want to decide how that brand's annual budget should be split across its own vehicles.

Typical questions:

  • "Keep the budget flat. Where should we shift spend?"
  • "We can add 10%. Which vehicles should get it?"
  • "The budget is being cut by 10%. What should go first?"
  • "TV must come down by exactly 10%. What is the best split of the rest?"

What you provide and what the system supplies​

You provideThe system supplies
Objective: volume, revenue or profitOne approved response curve per vehicle
Budget change: none, increase, or decrease by a percentageCurrent annual spend per vehicle (from the model baseline or your merged file)
Optional per-vehicle limits (directional or range)Unit value (profit per unit) and price (revenue per unit) per vehicle
Optional Traditional / Digital group limitsHistorical weekly spend, for the weekly plan
Optional macro assumptions (media-cost and price inflation)Per-week attribution, when available, for the efficiency tilt
Target year for the planLocks for non-paid media and vehicles that failed fit-quality checks

If no approved model exists, the run stops with a clear message. The optimizer never fabricates curves from raw data.


How a request becomes an optimization problem​

Total budget​

The requested change applies to the movable (unlocked) spend; locked spend is added back unchanged:

Formula

Target total budget for a requested change pp.

B=L+R (1+p).B = L + R\,(1 + p).

Terms: LL is the current spend of locked vehicles; RR is the current spend of unlocked vehicles; pp is the requested change as a fraction.

Vehicle limits​

  • No explicit limit (increase 0, decrease 0): the vehicle gets the default guardrail of ±15%, widened only if the budget itself moves further.
  • One-sided limit: a directional target, pinned to exactly xv0(1±p)x_v^{0}(1 \pm p).
  • Two-sided limit: a range, [xv0(1−d), xv0(1+i)]\left[x_v^{0}(1-d),\ x_v^{0}(1+i)\right].

Campaign-level names (such as a TV campaign) roll up to their parent vehicle. If two campaign keys roll up to the same vehicle with different limits, the request is rejected as conflicting rather than silently merged. A directional limit that cannot be matched to any vehicle is rejected, and the message lists the available vehicles.

Traditional and Digital groups​

Every vehicle belongs to Traditional or Digital. Each group's total is held in a band, whether or not you asked for a group limit. The movement cap is 10% by default and widens only if the budget moves further:

Formula

Group share band, with no explicit group request.

max⁡ ⁣(Λg, Xg (1−c−))B  ≤  ωg  ≤  min⁡ ⁣(Ug, Xg (1+c+))B,c−=max⁡(0.10, 1−ρ),c+=max⁡(0.10, ρ−1),\frac{\max\!\left(\Lambda_g,\ X_g\,(1-c^{-})\right)}{B} \;\le\; \omega_g \;\le\; \frac{\min\!\left(U_g,\ X_g\,(1+c^{+})\right)}{B}, \qquad c^{-} = \max(0.10,\ 1-\rho), \quad c^{+} = \max(0.10,\ \rho-1),

Terms: ωg\omega_g is the group's share of the budget; XgX_g is the group's current spend; Λg\Lambda_g and UgU_g are the smallest and largest totals its member vehicles can reach under their own bounds; ρ\rho is the ratio of target to current movable budget.

If you request a group move, it is treated like a vehicle limit (one-sided means a target, two-sided means a range), clamped first into what the vehicles can deliver and then into the movement cap. If the request had to change, the output says so, for example:

digital: channel-level moves are capped at 10% up, so the request was applied as +10.0%.

If the group bands could not jointly sum to the budget, they are widened only as much as needed, starting with groups you did not ask about, and the change is reported.

Locked vehicles​

Vehicles that must not move are pinned at current spend and still count toward the total:

  • non-paid media such as trade marketing and sponsorship,
  • vehicles that failed fit-quality checks at model time,
  • vehicles with no current spend (there is nothing to reallocate from).

Locked non-paid media is excluded from the paid-media rollups in the reports.


Run steps​

  1. Resolve the approved model for the brand (stops with a clear message if none exists).
  2. Load vehicles and current spend.
  3. Build the scenario: total budget, vehicle bounds, group bands, locks.
  4. Solve and validate: the SLSQP solve, then the five validation gates.
  5. Build deliverables: the three-level table, the weekly plan, the summary, and the report.

Worked example​

This is an illustrative example on synthetic numbers, computed with the production solver. It is not client data.

Single-brand reshuffle (illustrative)

Setup. Five vehicles with Weibull-CDF curves, a profit value of 4.0 per unit of response for every vehicle, and a combined budget of 6.5 million.

VehicleGroupCeiling α\alphaScale κ\kappaShape ssCurrent spend
TVTraditional1,300,0002,000,0001.33,000,000
OOHTraditional600,0001,800,0001.21,200,000
RadioTraditional450,000700,0001.5500,000
Digital VideoDigital950,0001,700,0001.11,000,000
SearchDigital450,000500,0001.0800,000

Scenario A: reshuffle (budget unchanged)​

VehicleCurrentOptimizedChangeMarginal ROISaturationZoneAt bound
TV3,000,0002,803,978−6.5%0.7930.79DiminishingNo
OOH1,200,0001,214,400+1.2%0.7930.46OptimalNo
Radio500,000575,000+15.0%1.6600.53OptimalUpper
Digital Video1,000,0001,150,000+15.0%1.2340.48OptimalUpper
Search800,000756,622−5.4%0.7930.78DiminishingNo

The three vehicles free to move share one marginal ROI (0.793). Radio and Digital Video earn more at the margin but are held by the 15% guardrail, which is exactly the signal that a looser guardrail there would help. Total response rises by 38,514 units (+1.67%), worth about 154 thousand in profit at 4.0 per unit, with no extra spend. All five validation gates pass.

Scenarios B and C​

VehicleCurrentB: budget +10%ChangeC: TV −10% and Digital +12%Change
TV3,000,0003,215,000+7.2%2,700,000−10.0%
OOH1,200,0001,380,000+15.0%1,245,000+3.8%
Radio500,000575,000+15.0%575,000+15.0%
Digital Video1,000,0001,150,000+15.0%1,150,000+15.0%
Search800,000830,000+3.7%830,000+3.8%
Total6,500,0007,150,0006,500,000
Response lift+155,430 (+6.74%)+36,790 (+1.60%)
  • B: a 10% budget increase is spread toward the vehicles with the highest marginal return, with three vehicles reaching their upper limit.
  • C: TV is pinned to exactly −10%. The request for Digital +12% exceeds the 10% group cap, so it is applied as +10% and the output reports the adjustment. The cost of the pin is visible: lift is 36,790 against 38,514 for the free reshuffle.

Reading the result​

ItemHow to read it
ZoneWhere the optimized spend sits on the curve: Threshold, Growth, Optimal, Diminishing or Saturation
At boundThe vehicle is held by a limit; compare its marginal ROI with the shared value to see what the limit costs
AdjustmentsAny request that had to be clamped, with the requested and applied values and the reason
Validation gatesAll five should pass; a failure is shown in the summary

What can go wrong​

SituationWhat happens
The budget falls outside what the bounds allowThe run stops with the totals and what to change: reduce a pinned vehicle's change, unlock a vehicle, or change the budget
Heavy locking and a large budget cutThe cut applies only to the movable slice, so the target stays reachable
A group request exceeds the movement capIt is clamped and reported in the adjustments
A directional vehicle key matches nothingThe run is rejected and lists the available vehicles
Two campaign keys with different limits roll up to one vehicleThe run is rejected as conflicting
The PDF report cannot be renderedThe CSV and summary are still delivered

For the formulas behind each step, see mmm-optimizer-methodology.