How to Reallocate Marketing Budget Using Attribution
Reallocate budget using attribution in 5 steps: (1) Calculate current spend and attributed revenue per channel, (2) Compute marginal ROAS for each channel, (3) Identify over/under-invested channels, (4) Propose reallocation with sensitivity analysis, (5) Implement gradually and measure. Key principle: shift budget from channels with declining marginal returns to channels with higher marginal efficiency. Validate changes with incrementality tests before making large shifts.
The 5-Step Reallocation Process
- Current spend per channel
- Attributed revenue per channel
- Calculate average ROAS
- Estimate marginal ROAS curves
- Identify saturation points
- Find highest-opportunity channels
- Calculate optimal allocation
- Define max shift limits (20%)
- Build conservative/aggressive scenarios
- Model revenue impact of shifts
- Identify interdependency risks
- Set success/failure thresholds
- Execute in phases (2–4 weeks)
- Monitor leading indicators
- Validate with holdout tests
Step 1: Baseline Analysis
Gather Current Data
Pull the following for each channel over the last 90 days:
-- Baseline metrics by channel
SELECT
channel,
SUM(spend) AS total_spend,
SUM(attributed_revenue) AS total_revenue,
SUM(attributed_revenue) / NULLIF(SUM(spend), 0) AS average_roas,
COUNT(DISTINCT conversion_id) AS conversions,
SUM(spend) / NULLIF(COUNT(DISTINCT conversion_id), 0) AS cpa
FROM channel_performance
WHERE date >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY channel
ORDER BY total_spend DESC;
Example Baseline
BASELINE ANALYSIS (LAST 90 DAYS)
| Channel | Spend | Revenue | Avg ROAS | Conv | CPA |
|---|---|---|---|---|---|
| Paid Search | $150,000 | $525,000 | 3.5× | 1,050 | $143 |
| Paid Social | $100,000 | $280,000 | 2.8× | 700 | $143 |
| $20,000 | $240,000 | 12.0× | 600 | $33 | |
| Display | $50,000 | $75,000 | 1.5× | 250 | $200 |
| Retargeting | $30,000 | $120,000 | 4.0× | 300 | $100 |
| Total | $350,000 | $1,240,000 | 3.5× | 2,900 | $121 |
Step 2: Marginal Analysis
Why Marginal ROAS Matters
Average ROAS = Total revenue / Total spend
Marginal ROAS = Additional revenue from additional spend
These are very different:
PAID SOCIAL
Current spend: $100,000
Current revenue: $280,000
Average ROAS: 2.8×
If we add $20,000:
Estimated additional revenue: $40,000
Marginal ROAS: 2.0× (lower than average)
Why? Diminishing returns. We've already captured high-intent audiences.
Current spend: $20,000
Current revenue: $240,000
Average ROAS: 12.0×
If we add $20,000:
We can't "buy more email". The audience is fixed.
More spend = more frequency = fatigue = worse performance
Marginal ROAS: 0.5× or worse
Why? Email doesn't scale with spend the way paid does.
Estimating Marginal ROAS
Methods to estimate marginal returns:
| Method | How It Works | Best For |
|---|---|---|
| Historical spend variation | Compare ROAS at different spend levels | Channels with spend variance |
| Geo experiments | Increase spend in test markets | Paid channels |
| Time-series analysis | Regress ROAS against spend over time | Stable channels |
| Platform curves | Use platform's marginal cost projections | Google, Meta |
# Estimate marginal ROAS from historical data
def estimate_marginal_roas(channel, spend_increase_pct: 0.20)
historical = get_historical_performance(channel, months: 12)
# Fit diminishing returns curve: Revenue = a * Spend^b (b < 1)
model = fit_power_curve(historical[:spend], historical[:revenue])
current_spend = historical[:spend].last
proposed_spend = current_spend * (1 + spend_increase_pct)
current_revenue = model.predict(current_spend)
proposed_revenue = model.predict(proposed_spend)
marginal_revenue = proposed_revenue - current_revenue
marginal_spend = proposed_spend - current_spend
{
current_roas: current_revenue / current_spend,
marginal_roas: marginal_revenue / marginal_spend,
saturation_point: model.find_inflection_point
}
end
Marginal ROAS by Channel
MARGINAL ROAS ANALYSIS
| Channel | Avg ROAS | Marginal ROAS (at +20%) | Status |
|---|---|---|---|
| Paid Search | 3.5× | 2.5× | Room to grow |
| Paid Social | 2.8× | 2.0× | Room to grow |
| 12.0× | 0.5× | Can't scale with $ | |
| Display | 1.5× | 1.8× | Underinvested |
| Retargeting | 4.0× | 1.2× | Near saturation |
INSIGHT
Display has a higher marginal ROAS (1.8×) than its average (1.5×). We're underinvesting in display relative to the opportunity.
📌 PLACEHOLDER: Marginal ROAS Curve Visualization
Add chart showing diminishing returns curves for each channel. X-axis = spend, Y-axis = revenue. Show current position on each curve and the marginal slope at that point. Visual makes the concept immediately clear.
Step 3: Reallocation Proposal
Calculate Optimal Allocation
In theory, optimal allocation equals marginal ROAS across all channels:
OPTIMAL ALLOCATION PRINCIPLE
Move budget until: Marginal ROAS (Channel A) = Marginal ROAS (Channel B)
Paid Social marginal (2.0×) > Display marginal (1.8×)
→ Status quo is approximately optimal for these two
Display marginal (1.8×) > Retargeting marginal (1.2×)
→ Shift budget from Retargeting → Display
Build Reallocation Scenarios
PROPOSED REALLOCATION (CONSERVATIVE)
| Channel | Current | Proposed | Change | Rationale |
|---|---|---|---|---|
| Paid Search | $150,000 | $157,500 | +$7,500 | High marginal ROAS |
| Paid Social | $100,000 | $110,000 | +$10,000 | Good marginal, more room |
| $20,000 | $18,000 | −$2,000 | Can't scale with spend | |
| Display | $50,000 | $62,000 | +$12,000 | Underinvested (high marginal) |
| Retargeting | $30,000 | $2,500 | −$27,500 | Near saturation |
| Total | $350,000 | $350,000 | $0 | Budget neutral |
Maximum shift: 20% of any channel's budget. The Retargeting reduction is larger because its marginal ROAS is below the acceptable threshold.
Set Shift Limits
Account for Interdependence
Before finalizing, check for channel dependencies:
| If You Cut... | Watch For... |
|---|---|
| Paid Social | Email list growth slowing |
| Display | Branded search volume dropping |
| Retargeting | Longer conversion windows |
| Content/SEO | Fewer MQLs entering pipeline |
def check_interdependence(proposed_cuts)
risks = []
proposed_cuts.each do |channel, cut_amount|
dependent_channels = get_dependent_channels(channel)
dependent_channels.each do |dep|
impact = estimate_downstream_impact(channel, dep, cut_amount)
if impact[:revenue_loss] > cut_amount * 0.3
risks << {
cut_channel: channel,
affected_channel: dep,
estimated_loss: impact[:revenue_loss],
recommendation: "Reduce cut amount or test with holdout"
}
end
end
end
risks
end
Step 4: Sensitivity Analysis
Model Revenue Impact
Calculate expected revenue change from reallocation:
def calculate_reallocation_impact(current, proposed)
total_impact = 0
proposed.each do |channel, new_spend|
old_spend = current[channel]
spend_change = new_spend - old_spend
if spend_change > 0
# Increasing spend: use marginal ROAS
revenue_change = spend_change * marginal_roas(channel, direction: :increase)
else
# Decreasing spend: revenue loss at marginal rate
revenue_change = spend_change * marginal_roas(channel, direction: :decrease)
end
total_impact += revenue_change
end
total_impact
end
Scenario Table
SENSITIVITY ANALYSIS
| Scenario | Budget Shift | Expected Revenue | Expected ROAS | Risk Level |
|---|---|---|---|---|
| Status Quo | $0 | $1.24M | 3.5× | — |
| Conservative (+5%) | $7,500 | $1.27M | 3.6× | Low |
| Moderate (+10%) | $15,000 | $1.29M | 3.7× | Medium |
| Aggressive (+15%) | $22,500 | $1.31M | 3.7× | High |
Note: the aggressive scenario has diminishing returns. The extra $7,500 shift only adds $20K revenue versus $30K in the moderate scenario.
Set Success/Failure Thresholds
Define in advance what would trigger reversal:
| Metric | Success | Acceptable | Failure (Reverse) |
|---|---|---|---|
| Overall ROAS | +5% | ±3% | -5% |
| Increased channels | +10% ROAS | Flat | -10% ROAS |
| Decreased channels | N/A | ROAS stable | Other channels drop |
| Leading indicators | On trend | Slightly down | Significant decline |
📌 PLACEHOLDER: Sensitivity Analysis Calculator
Embed interactive calculator where users can: (1) Input current channel spend and ROAS, (2) Adjust proposed allocation, (3) See projected revenue impact with confidence ranges, (4) Download scenario comparison.
Step 5: Implementation
Phase the Rollout
Don't make all changes at once:
IMPLEMENTATION TIMELINE (8-WEEK EXAMPLE)
- Paid Search: +$3,750
- Paid Social: +$5,000
- Display: +$6,000
- Retargeting: −$13,750
- Monitor: daily spend, weekly performance
- Compare ROAS vs baseline
- Check leading indicators (CTR, CPM, CVR)
- Assess interdependence effects
- Decision: proceed / pause / reverse
- Complete remaining shifts
- Adjust based on Phase 1 learnings
- Begin holdout test in one geo
- Full performance comparison
- Holdout test results
- Document learnings
- Plan next reallocation cycle
Monitor Leading Indicators
Don't wait for conversions—watch early signals:
| Indicator | Healthy | Warning | Action If Warning |
|---|---|---|---|
| CPM | Stable or down | Up >20% | Audience saturation—slow increase |
| CTR | Stable or up | Down >15% | Creative fatigue—test new creative |
| CPC | Stable | Up >25% | Competition or quality—review targeting |
| CVR | Stable or up | Down >10% | Traffic quality issue—check sources |
Validate with Holdouts
Run a geo-holdout or randomized experiment to validate:
def design_reallocation_validation_test
{
test_type: :geo_holdout,
duration: "4 weeks",
treatment_geos: ["California", "New York", "Texas"], # 40% of traffic
control_geos: ["All other states"], # 60% of traffic
treatment: "New allocation (proposed)",
control: "Old allocation (status quo)",
success_metric: :attributed_revenue,
minimum_detectable_effect: 0.05, # 5% lift
analysis_plan: {
primary: "Compare ROAS between test and control geos",
secondary: "Compare by channel within test geos",
validation: "Check for geo selection bias"
}
}
end
📌 PLACEHOLDER: Reallocation Case Study
Add mbuzz customer example: "Company X identified Display as underinvested (1.8x marginal vs 1.2x Retargeting). They shifted $15K/month from Retargeting to Display. After 8 weeks, overall ROAS improved 8% with no decline in Retargeting-attributed conversions—they had hit saturation."
Common Reallocation Mistakes
Mistake 1: Chasing Average ROAS
Email might show 10x ROAS, but you can't "buy more email subscribers" by increasing spend. Always use marginal ROAS for allocation decisions.
Mistake 2: Ignoring Interdependence
Cutting paid social by 50% might cause email ROAS to drop 20% a month later—fewer people entering the list. Model dependencies before cutting.
Mistake 3: Moving Too Fast
Large, rapid shifts make it impossible to diagnose what worked. Phase changes over 4-8 weeks.
Mistake 4: Not Setting Failure Criteria
Without pre-defined reversal triggers, teams let bad allocations persist too long. Define "failure" before implementing.
Mistake 5: Reallocating Based on Platform Data
Google says Google is great. Meta says Meta is great. Both are biased. Use your own multi-touch data for allocation decisions.
Summary
Reallocate budget using this 5-step process:
- Baseline Analysis — Current spend, revenue, average ROAS by channel
- Marginal Analysis — Estimate diminishing returns curves, find highest opportunity
- Reallocation Proposal — Build scenarios with 20% max shift limits
- Sensitivity Analysis — Model revenue impact, set success/failure thresholds
- Implementation — Phase over 4-8 weeks, monitor leading indicators, validate with holdouts
Key principles:
- Use marginal ROAS, not average ROAS
- Account for channel interdependence
- Never shift more than 20% at once
- Validate with incrementality tests
- Quarterly cycles, not monthly
Further Reading
On Attribution for Budgeting:
- How to Build a Bottom-Up Revenue Forecast with MTA — Using attribution for planning
- How to Choose the Right Attribution Model — Model selection for budget decisions
📌 PLACEHOLDER: Downloadable Budget Template
Add download link for Excel workbook with: (1) Current allocation input sheet, (2) Marginal ROAS estimator, (3) Reallocation scenario builder, (4) Sensitivity analysis with charts, (5) Implementation timeline template.
Key Takeaways
- ✓Focus on marginal ROAS, not average ROAS, for reallocation decisions
- ✓Never reallocate more than 20% of a channel's budget at once
- ✓Validate with incrementality tests before major shifts
- ✓Account for channel interdependence—cutting introducers affects closers
How often should I reallocate budget based on attribution?▼
Should I use first-touch, last-touch, or multi-touch for budget decisions?▼
What if my attribution data conflicts with platform data?▼
How do I handle channels with no attribution data?▼
What's the difference between reallocating budget and optimizing within a channel?▼
How do I prioritise budget allocation when performance data conflicts across Google, Meta, LinkedIn and programmatic?▼
Which channel should I trust when every platform claims credit for the same conversion?▼
How mature is your marketing measurement?
The free Measurement Maturity Assessment shows where you stand, where you're exposed, and what to fix first. 10 questions, 3 minutes.
Take the AssessmentReady to try server-side attribution?
Set up in 10 minutes. Free up to 30K records/month.