Skip to content
Hoda Rezvanjoo edited this page May 28, 2026 · 8 revisions

Marketing Budget Optimisation and Decision Support Framework

A linear-programming decision-support system for splitting a fixed marketing budget across platforms and objectives — with named constraints, data-driven uncertainty bounds, and a confidence score that refuses to claim certainty the data can't support.

Author: Hoda Rezvanjoo, Independent Researcher · ORCID 0009-0006-3882-2669 Live demo: https://digital-budget-optimisation-engine.streamlit.app/ Source: https://github.com/Hoda834/digital-budget-optimisation-engine License: MIT Cite as: see CITATION.cff

Domain Decision support systems · constrained optimisation · marketing analytics
Method Linear programming (PuLP / CBC), James-Stein shrinkage, piecewise-linear diminishing returns, Monte Carlo robustness
Scale 12 platforms × 4 objectives × 3 yield brackets × 3 scenarios per run, solves in <1s
Codebase ~5,900 lines typed Python 3.11 · Streamlit UI · 141-case pytest suite · CI on every push
Outputs Auditable allocation, per-KPI forecasts with data-driven confidence bands, classified decision report, Plan A / Plan B

What it solves

Marketing-budget decisions rarely fail for lack of data. They fail because budgets are limited and must satisfy competing objectives, platform performance is interdependent, business constraints are applied informally or too late, and scenario uncertainty is ignored or oversimplified. The result is a recommendation no one can defend in a meeting.

This framework treats media-mix planning as a constrained optimisation problem with declared assumptions. Every floor, cap, weight, and multiplier is named, visible on the results page, and editable without walking the wizard from scratch. Every binding constraint surfaces with its shadow price, so "why is Facebook capped?" has a literal answer rather than a hand-wave.

Where the data is thin, the engine says so: short histories are shrunk toward the cross-platform mean, forecast confidence bands scale with the observation window, and a Monte Carlo robustness check flags any platform whose rank is fragile to plausible noise.

Scope (and what's out of scope)

In scope: quarterly media-mix planning under declared business policy — producing a defensible allocation with explicit assumptions and uncertainty bounds.

Out of scope: live-API continuous optimisation, sub-platform allocation at the campaign/ad-set/creative level, causal incrementality estimation, Bayesian recalibration between runs. The engine inherits whatever attribution bias is in the KPIs you supply.

These limits appear in the report's forecast caveat, in the README, and in Decision-Logic — they are part of the artefact, not hidden.

Wiki contents


📷 Screenshots for this page (in order):

  1. Hero image — the full results report, scrolled to show the scenario tabs + allocation chart + confidence score in one frame. Width ~1200px, light theme. Drop it right under the title block. Caption: Results report — Plan A allocation with confidence score and binding constraints.
  2. Optional secondary — a wide screenshot of the wizard's Step 5 "Review and run" panel with the Run button visible. Place it above "Wiki contents" as a visual full-stop. Caption: Review-and-run step before solving.

Clone this wiki locally