
Marginal ROAS by Media Channel
This paired visualization explores how ROAS responds to small, incremental changes in media spend across a set of paid channels. For each channel, the chart shows projected ROAS at stepped adjustments ranging from –25% to +25% in spend, answering a deceptively simple question: what actually happens if we spend a little more… or a little less?
The goal was to make marginal ROAS (mROAS) - a concept that’s notoriously hard to explain - feel intuitive enough that stakeholders could use it confidently when making budget decisions.
Project considerations & specs
Core question: Which channels benefit most from increased spend, and which remain relatively stable if budget is pulled back?
Audience: Internal teams and client stakeholders (many of whom understand ROAS, but not mROAS).
Data reality:
15+ channels
1 baseline and 50 modeled, marginal ROAS values per channel
Three dimensions to encode simultaneously: channel, % change in spend, and ROAS
Design goals: Immediate pattern recognition, minimal clutter, and a clear sense of opportunity rather than just precision.
Design & process
With three dimensions to represent, traditional 2D chart types quickly hit their limits. Instead of forcing ROAS into another axis, color became the primary encoding. Each channel is shown as a horizontal bar segmented into stepped sections, with color representing ROAS at each incremental spend change. The faster a channel moves from cool to warm tones, the more sensitive (and potentially valuable) it is to budget adjustments.
Scale turned out to be a major challenge. Some channels operate in a tight ROAS range, while others are true outliers. To avoid flattening most of the data into a single color band, outlier channels were given their own gradient legend, preserving contrast and ensuring meaningful variation remained visible for the rest of the chart.
The chart is ordered so that channels with the largest ROAS lift from baseline to maximum appear first. To reinforce this ranking, a companion bubble plot sits alongside the gradient bars, explicitly showing the difference between baseline ROAS (0% spend change) and the maximum marginal ROAS per channel. Strategic labeling is limited to just these two points, keeping the focus on signal rather than annotation.
Outcome & insight
The finished visualization allows viewers to scan for opportunity rather than hunt for numbers. Channels with rapid color progression immediately stand out as candidates for investment adjustments, while channels with slower or flatter gradients suggest stability or diminishing returns.
Perhaps most importantly, this chart made marginal ROAS feel concrete. Instead of abstract curves or dense tables, stakeholders could see that the analysis was grounded in small, realistic budget changes (1% at a time) and understand how ROAS behaved at each step. In practice, teams began referencing this chart directly when discussing reallocations which was exactly the behavior it was designed to encourage.
From a personal learning standpoint, this project shifted how I think about encoding quantitative data. Using color as an insight driver, rather than a purely decorative layer, opened up a new way to handle dense, multi-dimensional problems without overwhelming the viewer.
Limitations & opportunities
The visualization generally requires some explanation and is less effective as a completely standalone chart.
The accompanying bubble plot is essential - color alone communicates magnitude, but not difference as intuitively as size.
While outliers are handled intentionally, maintaining dual legends can still introduce some cognitive overhead.
The dataset used here only included channels where ROAS increased with higher spend; a next step would be validating whether the same visual logic holds when ROAS improves with decreased spend.
Quick Stats
Chart type
Stepped gradient bars
Data points
<1,000
Primary tools
pandas, plotly, seaborn
Project Gallery


