You are spending money on Facebook Ads, Google Ads, influencer deals, and maybe a few experiments on TikTok or LinkedIn. Some of those campaigns are printing money. Others are quietly burning through budget with nothing to show for it. The problem is figuring out which is which, and by how much. This analysis calculates ROAS, CPA, CTR, and conversion rates across every campaign and channel, then shows budget tips for each campaign: what to scale, what to watch, and what to stop. Upload a CSV of your campaign data to view the report.
Worked Example: Three Made-Up Campaigns
Made-up data, seed 23. Question: which campaign should get a small test, need review, or pause?
Inputs: the script sets spend, views, click and order rates, and a value per order of $60. NumPy draws the clicks and orders. The script then finds ROAS (sales per ad dollar), CPA (cost per order), CTR (click rate), and order rate. The action rule is the example's own, not a standard.
import numpy as np
SEED = 23
rng = np.random.default_rng(SEED)
plans = [
("Search A", 600.0, 10000, 0.08, 0.04, 60.0),
("Social B", 800.0, 20000, 0.03, 0.02, 60.0),
("Video C", 500.0, 15000, 0.02, 0.01, 60.0),
]
print(f"Simulated data, seed {SEED}")
print("Campaign | Spend | Impressions | Input click rate | "
"Input order rate | Value per order")
for name, spend, imps, click_rate, order_rate, order_value in plans:
print(f"{name} | ${spend:.0f} | {imps} | {click_rate:.0%} | "
f"{order_rate:.0%} | ${order_value:.0f}")
print("Campaign | Clicks | Orders | Revenue | ROAS | CPA | CTR | "
"Order rate | Recommendation")
rows = []
for name, spend, imps, click_rate, order_rate, order_value in plans:
clicks = int(rng.binomial(imps, click_rate))
orders = int(rng.binomial(clicks, order_rate))
revenue = orders * order_value
roas = revenue / spend
cpa = spend / orders if orders else float("inf")
ctr = clicks / imps
order_rate_observed = orders / clicks if clicks else 0.0
if roas >= 3 and orders >= 10:
action = "Scale for a small test"
elif roas >= 1.5:
action = "Monitor"
else:
action = "Pause and review"
rows.append((spend, revenue))
print(f"{name} | {clicks} | {orders} | ${revenue:.0f} | {roas:.2f}x | "
f"${cpa:.2f} | {ctr:.2%} | {order_rate_observed:.2%} | {action}")
total_spend = sum(spend for spend, _ in rows)
total_revenue = sum(revenue for _, revenue in rows)
print(f"Total | ${total_spend:.0f} spend | ${total_revenue:.0f} revenue | "
f"{total_revenue / total_spend:.2f}x blended ROAS")
print("Method: ROAS = revenue / spend; CPA = spend / orders; "
"CTR = clicks / impressions; order rate = orders / clicks.")
print("Illustrative rule: scale test at ROAS >= 3.00x and at least 10 "
"orders; monitor at ROAS >= 1.50x; otherwise pause and review.")
Printed output:
Simulated data, seed 23
Campaign | Spend | Impressions | Input click rate | Input order rate | Value per order
Search A | $600 | 10000 | 8% | 4% | $60
Social B | $800 | 20000 | 3% | 2% | $60
Video C | $500 | 15000 | 2% | 1% | $60
Campaign | Clicks | Orders | Revenue | ROAS | CPA | CTR | Order rate | Recommendation
Search A | 818 | 34 | $2040 | 3.40x | $17.65 | 8.18% | 4.16% | Scale for a small test
Social B | 604 | 9 | $540 | 0.68x | $88.89 | 3.02% | 1.49% | Pause and review
Video C | 287 | 3 | $180 | 0.36x | $166.67 | 1.91% | 1.05% | Pause and review
Total | $1900 spend | $2760 revenue | 1.45x blended ROAS
Method: ROAS = revenue / spend; CPA = spend / orders; CTR = clicks / impressions; order rate = orders / clicks.
Illustrative rule: scale test at ROAS >= 3.00x and at least 10 orders; monitor at ROAS >= 1.50x; otherwise pause and review.
Result. Search A meets the example's rule for a small test. Social B and Video C fall below the review line, so the rule says to pause and review them. The ordering is set by the rates in the script: each channel has its own click rate and order rate, and every order is worth $60. From those settings the expected ROAS is 3.20x for Search A, 0.90x for Social B and 0.36x for Video C. This draw gave 3.40x, 0.68x and 0.36x. Social B drew 9 orders where its setting gives about 12, so its 0.68x is a noisy read of a built-in 0.90x. With single-digit orders, a small swing moves ROAS a lot. The rule of 3.00x and at least 10 orders is the example's, not a standard.
Limit. This is a small made-up set. It does not show profit after other costs. It cannot show that a budget change will work or that these results will last.
What Is ROAS?
ROAS, Return on Ad Spend, is the simplest question in marketing: for every dollar I spent on advertising, how many dollars did I get back? If you spent $1,000 on Google Ads last month and those ads generated $4,200 in revenue, your ROAS is 4.2x. For every $1 spent on Google Ads, you got $4.20 back. That is the entire concept.
A ROAS above 1.0 means the campaign generated more revenue than it cost. A ROAS below 1.0 means you lost money. But the threshold that actually matters depends on your margins. If your product has a 60% gross margin, you need a ROAS of at least 1.67x just to break even (1 / 0.60). If your margin is 30%, you need a ROAS of 3.33x before you see any profit from your ad spend. This is why a blanket "ROAS of 3x is good" benchmark is misleading. It depends entirely on what you sell.
This analysis goes well beyond a single ROAS number. It calculates ROAS, CPA (cost per acquisition), CTR (click-through rate), CPL (cost per lead), and conversion rates for every campaign and every channel in your data. Then it compares them side by side so you can see exactly which campaigns are efficient, which are mediocre, and which are actively destroying value.
Why This Matters More Than You Think
Most marketing teams know their overall ROAS. Fewer can tell you the ROAS for each individual campaign. Almost none can tell you whether increasing spend on Campaign A by 20% would maintain the same efficiency or whether they have already hit diminishing returns. This analysis answers the first two directly and, if your data covers several spend levels over time, gives a pattern to investigate for the third. It cannot by itself show what a budget increase would do.
Consider a hypothetical scenario. You run 15 campaigns across Facebook, Google Search, and influencer partnerships. Your blended ROAS across all channels is 3.8x, which looks healthy. But when you break it down, Google Search brand campaigns are running at 12x (people searching your brand name were going to buy anyway), Facebook retargeting is at 6x, two Facebook prospecting campaigns are at 1.2x and barely breaking even, and one influencer campaign is at 0.4x, losing money on every dollar spent. Your "healthy" 3.8x average is masking a campaign that is literally burning cash and two others that need serious attention.
This report can help spot waste by showing each campaign's results and budget tips.
What Data Do You Need?
You need a CSV export of your campaign performance data. At minimum, you need four columns: a channel column (like "Facebook," "Google Search," "Influencer"), a campaign name column, a spend column (the amount you spent), and a sales or revenue column (the revenue generated). These four fields are required.
For richer analysis, include additional funnel metrics: impressions or reach (how many people saw the ad), clicks (how many clicked through), leads or form fills (how many took a pre-purchase action), and conversions or orders (how many bought). The more funnel stages you provide, the more the analysis can diagnose where your funnel is leaking, whether the problem is awareness (low impressions), engagement (low CTR), lead quality (low lead-to-sale conversion), or something else entirely.
A date column is optional but enables trend analysis so you can see whether a campaign's efficiency is improving or degrading over time. Each row in your CSV should represent one campaign's performance for a time period: daily, weekly, or monthly granularity all work.
You can export this data from Facebook Ads Manager, Google Ads, your analytics platform, or even a spreadsheet where you track spend manually. The tool maps your columns to the required fields when you upload, so your headers do not need to match any specific format.
How to Read the Report
The example above shows campaign data, the math, and sample budget steps. The report cards below each answer a specific question about your marketing performance.
Overview
The overview card summarizes your dataset: how many campaigns, channels, total spend, total revenue, and the overall blended ROAS. This is your baseline. If your overall ROAS looks bad, everything below will explain why. If it looks good, the cards below will show you whether that average is hiding underperformers.
ROAS by Campaign
A bar chart showing ROAS for every campaign in your data, sorted from highest to lowest. This is the money chart. You will immediately see which campaigns are delivering outsized returns and which are underwater. A horizontal reference line shows your ROAS target (if you set one), making it easy to see which campaigns clear the bar and which fall short. Campaigns at 0.8x ROAS jump off the page when they are sitting next to campaigns at 5x.
ROAS by Channel
The same ROAS comparison, but aggregated to the channel level: Facebook, Google, influencer, email, and so on. This answers the strategic question: which channels deserve more budget overall? Channel-level ROAS drives your macro budget allocation; campaign-level ROAS drives your micro optimization within each channel.
Funnel Efficiency
This chart breaks the marketing funnel into stages: CTR (impressions to clicks), lead rate (clicks to leads), and conversion rate (leads to sales), and shows each metric by channel. This is how you diagnose why a campaign has low ROAS. A campaign with great CTR but terrible conversion rate is attracting the wrong audience: lots of curiosity clicks but no purchase intent. A campaign with low CTR but high conversion rate has targeting dialed in perfectly but needs better creative to get more people to click. The funnel chart helps you see where to investigate first; which fix will work still needs testing.
Spend vs. Revenue
A scatter chart plotting spend on the x-axis and revenue on the y-axis for each campaign. The diagonal line marks where revenue equals ad spend (1x ROAS). Points above it return more revenue than spend; points below return less. That is not the same as profit, because margins and other costs matter (a 60% gross margin needs 1.67x ROAS to break even). The distance from the line shows how far each campaign is from 1x. If your high-spend campaigns cluster closer to the line while low-spend campaigns sit well above it, that is a possible sign of diminishing returns as you scale, a pattern to investigate rather than proof, since campaigns differ in audience and creative. A spend-level test would be needed to confirm it.
Campaign Scorecard
A full table with every metric for every campaign: spend, revenue, ROAS, CPA, CTR, conversion rate, and more. This is the reference table you export and bring to your budget meeting. Sort by any column to find your top performers, worst performers, most expensive acquisitions, or highest conversion rates. Every number in the charts above comes from this table.
Budget Recommendations
The actionable output. Each campaign gets a budget tip that names the action: raise the budget in a small step, keep watching it, cut spend and review it, or stop spend. The tips factor in ROAS relative to your target, absolute revenue contribution, and spend efficiency. A campaign with modest ROAS but massive revenue contribution will get a watch tip rather than a stop-spend tip, because pausing it would cut your total revenue.
Executive Summary (TL;DR)
AI-generated key findings that synthesize everything above into three to five bullet points. This card is designed to be copied directly into a Slack message or email to your CMO. It highlights the biggest opportunity (which campaign to scale), the biggest risk (which campaign to kill), and the estimated revenue impact of the recommended changes.
A Hypothetical Example: E-Commerce Q4 Budget Planning
Imagine an e-commerce brand that has $500,000 to allocate across four channels for Q4: Facebook, Google Search, Google Shopping, and influencer partnerships. They export six months of daily campaign data, 180 rows across 14 active campaigns, and uploads the CSV. All numbers in this section are made up.
The report shows: Google Search brand campaigns run at 12x ROAS but only absorb $30k/month (limited by search volume). Google Shopping runs at 5.2x. Facebook retargeting runs at 6.1x but only reaches people who already visited the site. Facebook prospecting runs at 2.1x: low efficiency but high absolute revenue because it reaches new customers. Two influencer campaigns show wildly different results: one at 7x (micro-influencer with a niche audience) and one at 0.6x (macro-influencer with broad but disengaged followers).
The budget tips would point to: raising the micro-influencer deal and Facebook retargeting in small steps, keeping Google Search and Shopping at current levels (search volume is the constraint, not budget), watching Facebook prospecting (it is the only new-customer channel), and stopping spend on the underperforming influencer campaign. These numbers only show the kind of choice the report supports. They are not a forecast of gain.
Diminishing Returns Detection
One of the most valuable features is diminishing returns analysis. When you increase ad spend on a campaign, ROAS often decreases at some point. As a hypothetical, the first $1,000 on Facebook might generate $5,000 in revenue (5x ROAS). The next $1,000 might only generate $3,000 (3x marginal ROAS). The next $1,000 might generate $1,500 (1.5x marginal ROAS). In this hypothetical each added $1,000 brings in less than the one before. Whether the next dollar is still worth spending depends on your margin and other costs, not on ROAS alone.
The spend vs. revenue chart can show this pattern visually. If your data includes multiple time periods with varying spend levels for the same campaign, the analysis can look for an inflection point: the spend level beyond which additional budget seems to yield less. This can help you avoid the common mistake of "this campaign has great ROAS, let's 5x the budget" only to watch the ROAS collapse as the audience saturates.
Common Pitfalls
The most dangerous mistake is optimizing purely for ROAS without considering absolute revenue. Campaign A might have 8x ROAS on $5,000 in spend, generating $40,000 in revenue. Campaign B has 3x ROAS on $100,000 in spend, generating $300,000 in revenue. Killing Campaign B because its ROAS is "only" 3x would cost you $300,000 in revenue. The report's budget recommendations account for this by looking at both efficiency and scale.
Another pitfall: treating all campaigns as equivalent regardless of their funnel position. Brand search campaigns will always show high ROAS because those customers were already looking for you. Upper-funnel campaigns like display or video awareness will always show low ROAS on a last-click basis because they introduce new customers who then convert through a different channel. The funnel efficiency chart helps you see this by showing where each channel sits in the customer journey.
Finally, beware of campaigns with very low volume. A campaign with only two orders might show ROAS of 10x or 0.3x purely due to random variation. The worked example above shows this: Social B and Video C each have single-digit orders, so their ROAS can swing a lot.
When to Use Something Else
Media mix modeling (MMM) uses past spend and sales to estimate how much each channel adds. ROAS analysis treats each campaign on its own.
If your question is specifically about attribution (which touchpoint in a multi-step customer journey should get credit for the sale) you need multi-touch attribution analysis. ROAS analysis uses whatever attribution your data already reflects (usually last-click). It does not re-attribute conversions.
If you want to predict how revenue would change if you shifted $50,000 from Facebook to Google, a linear regression on spend vs. revenue can model that relationship, especially with enough historical variation in spend levels. The ROAS analysis tells you what happened; regression modeling tells you what would happen under different scenarios.
If you need to compare just two campaigns head-to-head with statistical significance (did Campaign A genuinely outperform Campaign B, or was it random variation?) an A/B test analysis gives you a proper hypothesis test with confidence intervals.
How the Numbers Are Calculated
The analysis calculates ROAS as revenue / spend for each campaign, CPA as spend / conversions, CTR as clicks / impressions, and conversion rate as conversions / clicks. Diminishing returns detection fits a log-linear model to the spend-revenue relationship. Budget recommendations use a threshold-based scoring system that weighs ROAS against your target, absolute revenue contribution, and spend volume.
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