How to Allocate Your Ad Budget Using Data (Not Gut Feel)
By MCP Analytics Team | Published , updated
Budget allocation comes down to one concept (diminishing returns), one metric (marginal ROAS), and a step-by-step reallocation process. A worked example with simulated data comes first, then the method.
Worked Example (Simulated): Where Does Added Spend Reach Break-Even?
Question: At what weekly spend does added ad spend fall to the break-even line in this made-up example?
Inputs: Simulated data, seed 37. The script builds weekly spend and revenue for one channel, in thousands of dollars. The revenue curve (90 x (1 - exp(-spend / 6))) and the 40% gross margin are set in the script, not measured. The seed sets the random noise (standard deviation 0.7) so the run can be repeated.
Method: Average ROAS is revenue divided by spend. Marginal ROAS is the change in revenue divided by the change in spend. Break-even ROAS is one divided by gross margin.
import numpy as np
# Simulated weekly data, in thousands of dollars. The seed makes the noise
# repeatable. The revenue curve and the 40% margin are set here, not measured.
seed = 37
rng = np.random.default_rng(seed)
spend = np.array([4, 6, 8, 10, 12, 14], dtype=float)
base_revenue = 90 * (1 - np.exp(-spend / 6))
noise = rng.normal(0, 0.7, size=spend.size)
revenue = base_revenue + noise
roas = revenue / spend
marginal_roas = np.diff(revenue) / np.diff(spend)
break_even_roas = 1 / 0.40
# Where the built-in curve's slope, 15 * exp(-spend / 6), equals break-even.
cross = 6 * np.log(15 / break_even_roas)
print(f"Seed: {seed}")
print("Spend ($000): " + ", ".join(f"{x:.0f}" for x in spend))
print("Revenue ($000): " + ", ".join(f"{x:.2f}" for x in revenue))
print("Average ROAS: " + ", ".join(f"{x:.2f}" for x in roas))
print("Marginal ROAS between spend points: "
+ ", ".join(f"{x:.2f}" for x in marginal_roas))
print("Assumed gross margin: 40%")
print(f"Break-even ROAS: {break_even_roas:.2f}")
for i, value in enumerate(marginal_roas):
low, high = spend[i], spend[i + 1]
status = "above" if value >= break_even_roas else "below"
print(f"${low:.0f}k to ${high:.0f}k spend: marginal ROAS {value:.2f}, "
f"{status} break-even")
print(f"Built-in curve crosses break-even at about ${cross:.2f}k spend")
Printed output:
Seed: 37
Spend ($000): 4, 6, 8, 10, 12, 14
Revenue ($000): 44.42, 56.57, 65.36, 73.46, 78.49, 81.64
Average ROAS: 11.11, 9.43, 8.17, 7.35, 6.54, 5.83
Marginal ROAS between spend points: 6.07, 4.39, 4.05, 2.51, 1.58
Assumed gross margin: 40%
Break-even ROAS: 2.50
$4k to $6k spend: marginal ROAS 6.07, above break-even
$6k to $8k spend: marginal ROAS 4.39, above break-even
$8k to $10k spend: marginal ROAS 4.05, above break-even
$10k to $12k spend: marginal ROAS 2.51, above break-even
$12k to $14k spend: marginal ROAS 1.58, below break-even
Built-in curve crosses break-even at about $10.75k spend
Result: Break-even ROAS is 2.50. The $10k to $12k step (2.51) sits on the break-even line. Noise in the weekly revenue can move each step by about half a point, so the crossing point is not firm. The script's built-in curve crosses at about $10.75k. The $12k to $14k step (1.58) is below the line.
Limit: The data are simulated and this is one run. A real spend and revenue pattern can reflect season, offers, or other changes, so a curve like this alone does not show that spend caused the revenue change.
The Problem With Even-Split and Last-Year-Plus Budgets
Most ad budget allocation follows one of two patterns:
To see which of your own marketing channels drive sales, try the free media mix model tool.
- Even split: Divide total budget equally across channels. "We have $100K and five channels, so $20K each."
- Last year plus: Take last year's allocation, add 10-15%, maybe shift a few thousand dollars around based on gut feel.
To see which of your own marketing channels drive sales, try the free media mix model tool.
Both approaches ignore the fundamental reality of advertising: every channel has a point of diminishing returns. The first $5,000 you spend on Google Ads can target your highest-intent keywords and generate strong returns. The next $5,000 may target slightly less valuable keywords. At higher spend you may be bidding on broad-match terms with weaker purchase intent, and your cost per acquisition can climb.
Equal budget allocation assumes every channel has equal capacity to generate returns at the same spend level. In practice, a small email list might saturate at a low spend while paid search can absorb much more before diminishing returns bite. Treating them equally wastes money on the small channel and starves the large one.
Consider a made-up example. A DTC brand allocates $60,000/month evenly across three channels. The figures in the next two tables are invented to show the arithmetic:
| Channel | Monthly Budget | Average ROAS | Marginal ROAS (Last $5K) |
|---|---|---|---|
| Google Ads | $20,000 | 4.2x | 1.1x |
| Meta Ads | $20,000 | 3.8x | 2.9x |
| TikTok Ads | $20,000 | 2.1x | 0.6x |
Google Ads looks like the best channel on average ROAS (4.2x). But its marginal ROAS is 1.1x: the last $5,000 brings back about $5,500 in revenue, which may not cover costs after margin. TikTok's marginal ROAS is 0.6x: the last $5,000 spent there brings back about $3,000 in revenue, which is $2,000 less revenue than was spent, before any margin is counted. Meta, despite a lower average ROAS, returns 2.9x on marginal spend in this made-up example. In this example, that is where the next dollar would go.
Diminishing Returns: The Concept That Changes Everything
Returns from a channel often flatten as spend grows, and the curve may be S-shaped or simply concave. At low spend levels, returns increase rapidly as you reach the most receptive audience. As spend grows, you exhaust the best opportunities and start reaching less qualified prospects. Eventually, more spend produces almost no incremental return.
If you have spent different amounts on a channel over recent months (due to seasonal budgets, testing, or gradual scaling), you may already have the data points to plot a response curve.
Pull weekly spend and revenue (or conversions) for each channel over as many weeks as you can. Plot spend on the X-axis and revenue on the Y-axis. Treat the plot as a rough check only. Spend can change along with season, offers, or other factors, so the plot alone cannot show that spend caused the change in revenue. A curve that flattens may be a sign of diminishing returns, but compare spend levels while accounting for other factors, or use a test, before linking the change to spend.
A Worked Example: Google Ads Response Curve
A made-up e-commerce retailer tracked weekly Google Ads spend vs. revenue over 16 weeks. Spend varied from $8,000 to $22,000/week due to seasonal adjustments. These figures are invented to show the arithmetic. Here is the pattern:
| Weekly Spend | Weekly Revenue | ROAS | Marginal ROAS (per $2K increment) |
|---|---|---|---|
| $8,000 | $48,000 | 6.0x | -- |
| $10,000 | $56,000 | 5.6x | 4.0x |
| $12,000 | $62,000 | 5.2x | 3.0x |
| $14,000 | $66,000 | 4.7x | 2.0x |
| $16,000 | $68,500 | 4.3x | 1.25x |
| $18,000 | $70,000 | 3.9x | 0.75x |
| $20,000 | $70,800 | 3.5x | 0.4x |
| $22,000 | $71,200 | 3.2x | 0.2x |
Average ROAS at $22,000/week is still 3.2x, which looks healthy. But marginal ROAS on the last $2,000 is 0.2x. That $2,000 generates only $400 in revenue. Assuming the 50% gross margin used in the break-even example in Step 3 below, break-even ROAS is 2.0x. The table shows marginal ROAS of 2.0x from $12,000 to $14,000 (at break-even), then 1.25x from $14,000 to $16,000. The table supports spending up to about $14,000/week before other costs.
A channel with 3.5x average ROAS can still have marginal returns below break-even on its last dollars. If your break-even ROAS is 2x, the average looks great while the marginal dollars are losing money. Always evaluate the last dollar, not the average dollar.
How to Identify Channel Saturation
You need three things to identify saturation: spend variation, outcome data, and a simple analysis framework.
Step 1: Gather Historical Spend and Outcome Data
For each channel, pull as many weeks of data as you can, with these columns:
- Week: The time period (weekly granularity works best)
- Channel spend: Total ad spend for that channel that week
- Revenue (or conversions): Attributed revenue or conversion count
- External factors: Note any promotions, holidays, or anomalies
The critical requirement is spend variation. If you spent exactly $15,000 on Google Ads every week, you have one data point, not one per week. You need weeks where spend was meaningfully higher and lower.
Step 2: Calculate Marginal Returns at Each Spend Level
Sort your data by spend level (low to high). For each incremental spend band, calculate the additional revenue generated:
Marginal ROAS = (Revenue at Spend Level N) - (Revenue at Spend Level N-1)
------------------------------------------------
(Spend at Level N) - (Spend at Level N-1)
When marginal ROAS drops below your break-even threshold, you have found the saturation point.
Step 3: Determine Your Break-Even ROAS
Your break-even ROAS depends on your gross margin. The worked example at the top used a 40% margin (break-even 2.50). Here, as an example, if your gross margin is 50%, you need at least 2x ROAS to cover cost of goods. If your margin is 33%, you need 3x. Add a buffer for overhead and target margin:
Break-even ROAS = 1 / Gross Margin %
Target ROAS = Break-even ROAS + Margin Buffer
Example (50% gross margin):
Break-even = 1 / 0.50 = 2.0x
Target = 2.0x + 0.5x buffer = 2.5x
Any channel spend where marginal ROAS falls below your target ROAS threshold should be reallocated.
Compare your ROAS this month vs. three months ago at the same spend level. If ROAS dropped while spend stayed flat, the channel's audience is fatiguing. If you increased spend and ROAS dropped proportionally more, you have hit diminishing returns. If ROAS held steady as you scaled, the channel has room to grow.
Step-by-Step Data-Driven Budget Reallocation
Once you have response curves (or at least directional saturation estimates) for each channel, reallocation follows a clear process.
Step 1: Rank Channels by Marginal ROAS
At current spend levels, which channels still have the highest marginal returns? Order them from highest to lowest marginal ROAS.
Step 2: Identify Surplus and Deficit Channels
Surplus channels have marginal ROAS below your target threshold. They are over-funded. Deficit channels have marginal ROAS well above your threshold. They are underfunded and can absorb more spend productively.
Step 3: Shift Budget from Surplus to Deficit
Move budget in increments (10-20% shifts, not wholesale changes) from surplus channels to deficit channels. The goal: equalize marginal ROAS across all channels at a level above your break-even threshold.
Budget is optimally allocated when marginal ROAS is equal across all channels. If Google Ads has a marginal ROAS of 1.2x and Meta has 3.5x, you should shift budget from Google to Meta until their marginal returns converge. This is the economic principle of equimarginal returns applied to marketing.
Example: Reallocation in Practice
Using our made-up DTC brand example with $60,000/month total budget. The new budgets and marginal ROAS values are invented for illustration:
| Channel | Old Budget | Marginal ROAS (Old) | New Budget | Marginal ROAS (New) |
|---|---|---|---|---|
| Google Ads | $20,000 | 1.1x | $14,000 | 2.4x |
| Meta Ads | $20,000 | 2.9x | $30,000 | 2.3x |
| TikTok Ads | $20,000 | 0.6x | $16,000 | 1.4x |
Same $60,000 total budget. In this example, $6,000 moves from Google Ads and $4,000 from TikTok to Meta, and the three channels end with marginal ROAS values closer together. These are not results from any account.
Step 4: Monitor and Iterate
Reallocation is not a one-time event. Response curves shift as audiences change, creative fatigues, and competitors adjust. Recalculate marginal ROAS monthly and make incremental adjustments quarterly.
Large one-step shifts make it hard to see which change moved results, and season or offers can move results at the same time. Make changes in steps and compare results after each one.
Common Budget Allocation Mistakes
Beyond even-split budgeting, three patterns can hurt ad budget efficiency:
Mistake 1: Chasing Average ROAS Instead of Marginal ROAS
In a made-up case, a channel with 5x average ROAS gets more budget. The marginal ROAS on the increase is 0.8x. Total average ROAS drops to 4.2x but still looks "good." The team celebrates while losing money on the incremental spend. Average ROAS is a lagging indicator that hides marginal waste.
Mistake 2: Cutting Channels Based on Last-Click Attribution
Display advertising can show weak last-click ROAS. Teams cut it entirely. Later, search ROAS may fall if display was feeding the top of the funnel. Before cutting a channel, run an incrementality test to separate direct and assist value.
Mistake 3: Ignoring Saturation Thresholds When Scaling
For example, a channel works at $10K/month. The team scales to $40K/month expecting 4x the results and gets less because of diminishing returns. The response curve is concave, not linear. Always model expected marginal returns before committing to a scale-up.
Working on this for your business? See the marketing analytics tools.
Building Your Own Response Curves
If you want to build response curves in-house, here is the practical approach that works without a data science team.
The Spreadsheet Method (Good Enough for Most Businesses)
- Export weekly data: Pull as many weeks as you can of channel_name, spend, and revenue from your ad platforms
- Create scatter plots: One per channel, spend on X-axis, revenue on Y-axis
- Add a trendline: Use a logarithmic or polynomial trendline (not linear) in Excel/Sheets
- Read the curve: Where the trendline flattens is your saturation zone
- Calculate marginal ROAS: Use the slope of the trendline at your current spend level
This method is not perfect: it does not control for seasonality or cross-channel effects. It is still a step up from gut feel. For more sophisticated modeling that accounts for cross-channel interactions, media mix modeling is the next step up.
What Data You Need
At minimum, a useful budget allocation analysis requires:
- Enough weeks of data (more weeks give a steadier picture)
- Meaningful spend variation (a clear range between the lowest and highest weeks)
- More than two channels (with only two, reallocation options are limited)
- Consistent attribution (same attribution window throughout the period)
If you lack spend variation, create it intentionally. Run a test where you increase one channel and decrease another for a few weeks. The change in performance gives you additional spend levels to compare.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
Calculate marginal ROAS: the return on the last dollar spent, not the average return across all spend. If your overall ROAS on Google Ads is 4x but your marginal ROAS on the last $2,000/month is 1.2x, you have hit diminishing returns. Track weekly ROAS at different spend levels and plot the curve. When marginal ROAS drops below your break-even threshold (set by your margins), added spend at that level loses money.
How often to reallocate depends on how much you spend and how noisy your results are. Avoid reallocating on very short windows of data, because short windows amplify noise from seasonality, promotions, and random variance. A new channel may need an early review to catch obvious failures.
Average ROAS divides total revenue by total spend across the entire budget for a channel. Marginal ROAS measures the return on the next (or last) dollar spent. A channel can have a strong average ROAS of 5x while its marginal ROAS is below 1x, meaning you are losing money on every additional dollar. Budget allocation decisions should be based on marginal ROAS, not average ROAS, because you are deciding where to put the next dollar, not evaluating the first dollar.
You need some variation in spend to estimate diminishing returns. If you have always spent the same amount on each channel, you have one data point per channel, which is not enough. Start with controlled experiments: increase spend on one channel for a few weeks while holding others constant. Then decrease it for a few weeks. This gives you three spend levels per channel (low, baseline, high), a rough start on a response curve.
Not necessarily. Check the channel's role in the full customer journey before cutting it. A channel with low direct ROAS might be an awareness driver that assists conversions on other channels. Run an incrementality test: pause the channel for a few weeks and measure the impact on overall conversions across all channels. If total conversions drop more than the channel's direct attribution suggests, it has assist value. Cut only if the incrementality test confirms low total impact.
The Bottom Line: Marginal Returns Drive Optimal Budgets
Ad budget allocation is not about finding the "best" channel and pouring money into it. It is about finding the optimal spend level for each channel: the point where the next dollar still generates a return above your break-even threshold. Beyond that point, every additional dollar is waste, regardless of how good the channel's average ROAS looks.
Three habits help:
- Track marginal ROAS, not just average ROAS. Average ROAS tells you how good the first dollar was. Marginal ROAS tells you how good the next dollar will be.
- Build response curves from real data. Even rough curves from your own spend variation can be a better guide than equal splits or gut feel.
- Reallocate incrementally. Shift budget in steps from saturated channels to underfunded ones. Monitor the impact. Repeat.
The math is simple. If Google Ads returns $1.10 on your last dollar and Meta returns $3.50, move budget from Google to Meta until those marginal returns converge. That convergence point is your optimal allocation. The single insight is to spend to equalize marginal returns, not to reward past average performance.