Marketing ROI is gross profit produced by a marketing investment, minus the cost of that investment, divided by the cost. Most reports that claim to show ROI are actually showing return on ad spend against revenue, which is a different and far more flattering number. Getting this right is mostly a matter of using margin instead of revenue, being honest about what attribution can and cannot tell you, and testing incrementality on the channels where the stakes are high enough to justify it.
Below are the formulas with their failure modes, a comparison of attribution models including the ones Google removed from Analytics, a step by step method for running a geo holdout, a full worked example across three channels with the arithmetic shown, and a spreadsheet structure that will still make sense to you next quarter.
The formulas, and which question each one answers
Four numbers cover almost every conversation you will have with a finance team. The trouble starts when people use them interchangeably.
| Metric | Formula | Question it answers | Common mistake |
|---|---|---|---|
| ROI | (Gross profit minus cost) divided by cost | Did this spend make the company money? | Using revenue in place of gross profit |
| ROAS | Attributed revenue divided by ad spend | Is this campaign efficient against others? | Reporting it to executives as if it were profit |
| CAC | Total sales and marketing cost divided by new customers | What does one new customer cost? | Leaving out salaries, tools and agency fees |
| LTV | Average order value times purchase frequency times lifespan times gross margin | How much can we afford to pay for one? | Assuming a lifespan longer than your data supports |
Notice that two of the four depend on gross margin. A store selling hardware at a 22 percent margin and a software company at an 85 percent margin can post identical ROAS and be in completely different financial positions.
Margin, not revenue, or every number lies upward
Take $10,000 of spend that produces $40,000 of attributed revenue. The ROAS is 4.0, which sounds excellent. At a 25 percent gross margin, that revenue carries $10,000 of gross profit, so the ROI is exactly zero. At a 70 percent margin it carries $28,000 of gross profit and the ROI is 180 percent. Same campaign, same ROAS, two completely different answers to whether you should spend more.
Get the real gross margin from finance, after discounts, returns, payment processing and shipping or hosting costs. The margin marketers use is almost always the list price margin, which is optimistic by several points.
CAC, lifetime value and the ratio that decides your budget
CAC is only meaningful when the cost side is complete. Include ad spend, agency retainers, the software stack, content production and the fully loaded cost of the people doing the work. A CAC calculated on media spend alone is typically 40 to 60 percent below the real figure, and it is the number that makes teams overspend for two quarters before anyone notices.
Lifetime value should be calculated on gross profit and on a lifespan your data can actually support. If your business is two years old, do not model a five year customer lifespan. Use the observed retention curve, truncate it at the horizon you have measured, and note the assumption in the sheet.
The working rule most operators use is that lifetime value should exceed CAC by at least three times, and that CAC should be recovered within about 12 months for a subscription business. Below 3 to 1 you are buying revenue rather than building a business. Far above it, you are probably underinvesting in growth.
Attribution models and where each one misleads
Attribution assigns credit for a conversion across the touchpoints that preceded it. Every model is a guess about human behavior encoded as arithmetic, and each guess fails in a predictable direction.
| Model | How it assigns credit | Direction it misleads |
|---|---|---|
| Last click | All credit to the final click before conversion | Overvalues branded search and retargeting, undervalues discovery |
| First click | All credit to the first known touch | Overvalues top of funnel, ignores what closed the sale |
| Linear | Equal credit to every touch | Flatters cheap high volume touchpoints |
| Time decay | More credit to touches nearer the conversion | Similar bias to last click, slightly softened |
| Data driven | Modeled from converting and non converting paths | Opaque, and still blind to anything it cannot observe |
Google Analytics 4 no longer offers most of these. According to Google’s own documentation on attribution models in Analytics, the first click, linear, time decay and position based models were removed in November 2023, leaving data driven attribution and two last click variants. The practical consequence is that comparing models to sanity check a channel is no longer possible inside the free tool, so the cross checking has to happen elsewhere.
Every click based model shares a deeper limitation: it can only see what it can track. Podcast listens, word of mouth, a conversation at a conference and any device the user did not log in on are invisible. If you are still setting up the measurement layer, start with setting up events in Google Analytics and tracking a custom event.
Incrementality: the only way to settle an argument
Incrementality asks a different question. Not “which touchpoint gets credit” but “what would have happened if we had not spent this money at all”. The cheapest practical version is a geo holdout.
Split your markets into two matched groups on baseline revenue and seasonality, ideally 20 or more in each so a single outlier city cannot dominate. Keep spending normally in the test group, pause the channel entirely in the control group, and run for at least four to six weeks so the buying cycle has time to complete. Then compare total revenue between groups, not attributed revenue, because the whole point is to escape attribution.
Worked example: three channels, one quarter
Assume a 60 percent gross margin and a quarter of spend across paid search, paid social and email. The table shows the arithmetic that a ROAS only report would hide.
| Channel | Cost | Attributed revenue | ROAS | Gross profit | ROI |
|---|---|---|---|---|---|
| Paid search | $60,000 | $240,000 | 4.0 | $144,000 | 140% |
| Paid social | $40,000 | $80,000 | 2.0 | $48,000 | 20% |
| $8,000 | $120,000 | 15.0 | $72,000 | 800% | |
| Total | $108,000 | $440,000 | 4.1 | $264,000 | 144% |
Now add customers. Paid search brought 300 new customers, so CAC is $200. Paid social brought 100, so CAC is $400. Email brought 60, so CAC is $133. With an average order of $400, two purchases a year, a two year observed lifespan and a 60 percent margin, lifetime value on gross profit is $960. That gives ratios of 4.8 to 1 for paid search, 2.4 to 1 for paid social and 7.2 to 1 for email. Paid social is already the weak channel before any testing.
Then run the geo holdout on paid social. Forty matched metro areas, split evenly, six weeks, spending $20,000 in the 20 test markets and nothing in the 20 control markets. Test markets produce $58,000 in total revenue and control markets produce $44,000, so the incremental revenue is $14,000. At a 60 percent margin that is $8,400 of gross profit against $20,000 of spend, which is a loss. Over the same six weeks the platform attributed $38,000 in the test markets, roughly 2.7 times the measured incremental revenue.
The decision changes completely. The attributed view says paid social is marginally profitable and worth optimizing. The tested view says it is destroying gross profit and the budget should move to email capacity and paid search, at least until the creative or targeting changes materially.
A spreadsheet structure that survives the quarter
Keep it boring and keep the assumptions visible. Four tabs are enough for most teams.
| Tab | Columns | Purpose |
|---|---|---|
| Assumptions | Gross margin, lifespan, salary loading, attribution window | One place to change a number and see everything move |
| Spend | Month, channel, campaign, media cost, agency, tools, people | The complete cost side, reconciled to the invoices |
| Results | Month, channel, attributed revenue, new customers, orders | Pulled from the CRM, not from the ad platforms |
| Tests | Test name, dates, markets, incremental revenue, multiplier | The correction factor you apply to attributed numbers |
The last tab is the one most teams skip and the one that makes the model honest. Once you have a measured multiplier for a channel, apply it to that channel’s attributed revenue until the next test replaces it.
Common mistakes and how to fix them
Counting revenue instead of gross profit is the big one, and the fix is a single cell in the assumptions tab. Reporting platform reported conversions as company results is the second, because every platform counts conversions it can plausibly claim and the totals across platforms will exceed your actual orders. Pull results from the CRM instead.
Attributing everything to the last click keeps discovery channels permanently underfunded, and the fix is a holdout test rather than a different model. Finally, judging long cycle channels on a 30 day window makes brand and content look worthless. Match the measurement window to your actual sales cycle, which you can get by exporting closed deals and taking the median days from first touch to close. If you are new to the reporting side, our guide to using Google Analytics for marketing covers where these figures live.
Frequently asked questions
What is a good marketing ROI?
It depends entirely on gross margin and sales cycle, so any universal benchmark should be treated with suspicion. The useful comparison is against your own prior quarters and against the next best use of the money. A channel returning 150 percent on gross profit is worth expanding if it holds at higher spend.
Is ROAS the same as ROI?
No. ROAS divides attributed revenue by ad spend and ignores both the cost of goods and every marketing cost that is not media. ROI works on gross profit and total cost. A campaign can post a ROAS of 3.0 and still lose money if your gross margin is below about 33 percent.
How long should I wait before judging a channel?
At minimum one full sales cycle, measured as the median days from first touch to closed deal in your own data. For most ecommerce that is days to weeks. For considered business purchases it is often several months, and judging those channels quarterly guarantees you cut them too early.
Do I need a marketing mix model?
Only when spend is large enough that a few percent of misallocation exceeds the cost of building and maintaining the model, and when you have several years of weekly history. Below that, geo holdout tests give you most of the value for a fraction of the effort and are far easier to explain.
How do I measure offline channels?
Use geographic and time based tests rather than trying to track individuals. Run the channel in some markets and not others, or in alternating weeks, and compare total revenue. Vanity codes and dedicated phone numbers help but always undercount, because most people just search for you afterward.
The bottom line
Marketing ROI is a margin calculation, not a revenue calculation, and the difference is usually large enough to reverse a budget decision. Get the real gross margin, include every cost, calculate lifetime value on profit rather than on revenue, and treat every attributed number as a starting hypothesis rather than a result.
Then test the channel you argue about most. One well constructed geo holdout will tell you more about where your money should go than a year of dashboard refinement, and it gives you something a finance team will actually accept: a comparison against what would have happened anyway.
