How to Calculate ROMI: Formula and Worked Example
How to Calculate ROMI: Formula and Worked Example
A campaign returns "400% ROMI" in the dashboard. The CFO asks one question: where is the extra cash? Half the time, the honest answer is that there isn't any. The number counted revenue the campaign never caused, ignored the cost of goods, and credited a single click for a deal that took six touches to close.
ROMI (return on marketing investment) is supposed to tell you whether a marketing dollar comes back with friends. Done loosely, it flatters every channel and hides the ones quietly losing money. Done carefully, it becomes the metric you can defend in a budget meeting.
This guide gives you the formula, a full worked example with the math shown, and the three adjustments that separate a vanity ROMI from a number you can act on.
The ROMI formula
The core calculation is short:
ROMI = (Revenue attributable to marketing − Marketing cost) / Marketing cost × 100%
A result of 100% means you doubled your money: every $1 in returned $2 out (the original dollar plus one more). Zero percent means you broke even. A negative number means the campaign cost more than it earned back.
That version uses revenue, which is the most common way people quote ROMI. It also overstates profitability whenever you sell something with a cost of goods or a delivery cost, because revenue is not profit. The stricter version swaps revenue for gross profit:
ROMI (margin-based) = (Revenue × Gross margin − Marketing cost) / Marketing cost × 100%
For a software product with 85% margins, the two numbers land close together. For a reseller running on 20% margins, they tell completely different stories. Pick one version, write down which you chose, and use it consistently. A team that quietly switches between revenue ROMI and margin ROMI between two reports will never trust either.
One naming note. ROMI and marketing ROI describe the same idea, and most people use them interchangeably. If your finance team already reports a marketing ROI figure with a fixed method, match their definition rather than inventing a parallel one.
A worked example, step by step
Take a B2B company running a paid search and LinkedIn campaign for a quarter. All numbers below are illustrative, picked to make the arithmetic clear.
Inputs for the quarter:
- Ad spend: $40,000
- Agency and tooling fees tied to the campaign: $10,000
- Deals closed and attributed to the campaign: 12
- Average deal value: $9,000
- Gross margin on the product: 60%
Step 1: Total the marketing cost.
$40,000 ad spend + $10,000 fees = $50,000. People forget the fees constantly and report on ad spend alone. The fees are real money, so they belong in the denominator.
Step 2: Total the attributed revenue.
12 deals × $9,000 = $108,000.
Step 3: Run the revenue-based ROMI.
($108,000 − $50,000) / $50,000 × 100% = 58,000 / 50,000 × 100% = 116%.
Read aloud: every dollar returned $2.16. Looks strong.
Step 4: Run the margin-based ROMI.
Gross profit = $108,000 × 60% = $64,800.
($64,800 − $50,000) / $50,000 × 100% = 14,800 / 50,000 × 100% = 29.6%.
Same campaign, same quarter. The revenue version says 116%, the margin version says about 30%. Both are real; they answer different questions. The first asks "did revenue exceed cost," the second asks "did profit exceed cost." When you bring a number to the people who control budget, bring the margin version, because that is the cash the business actually keeps.
| Line item | Revenue-based | Margin-based |
|---|---|---|
| Attributed revenue | $108,000 | $108,000 |
| Value used | $108,000 revenue | $64,800 gross profit |
| Marketing cost | $50,000 | $50,000 |
| Net return | $58,000 | $14,800 |
| ROMI | 116% | 29.6% |
What goes into "marketing cost"
The denominator decides half your answer, and it is where most reported ROMI quietly cheats. A defensible marketing cost usually includes:
- Media spend across every channel in the campaign
- Agency retainers and freelance fees for the work
- Software that exists for the campaign (landing page builder, ad management, call tracking)
- Creative production: design, video, copy if outsourced
- A fair share of salaries for the people who ran it, if you want a fully loaded number
You do not have to load every salary in. A common practice is to track a "working media plus direct fees" ROMI for fast channel decisions, and a separate fully loaded ROMI for annual planning. Just label which one a given report uses. The version you skip is the version someone will later assume you included.
Attribution: the part that makes or breaks the number
The numerator depends entirely on which revenue you credit to marketing, and that is an attribution choice, not a fact. Credit a closed deal to the last ad the buyer clicked, and your bottom-of-funnel search campaign looks heroic while the LinkedIn content that started the journey looks worthless.
Three things keep the numerator honest.
First, decide your model and apply it to every channel equally. Last-touch is simple and fine for quick reads, as long as you know it under-credits awareness work. If buyers touch you many times before a deal, a multi-touch view tells a fairer story. Our walkthrough of attribution models and when each fits covers the trade-offs.
Second, connect closed revenue back to its source. ROMI is only as good as the link between a deal in your CRM and the campaign that produced the lead. Without reliable lead source tracking feeding GA4 and your CRM, you are guessing at the numerator, and a precise formula on a guessed input is still a guess.
Third, respect the sales cycle. B2B deals can take weeks or months to close. If you measure ROMI for spend in January but the deals close in April, January will look like a disaster and April like a miracle. Match the spend window to the deal-close window, or use a cohort view that follows the leads from a given month all the way to revenue.
Incrementality: would the sale have happened anyway?
Here is the adjustment almost nobody makes, and it is the one finance respects most.
Branded search is the classic case. Someone already decided to buy, types your company name, clicks your ad, and converts. Your ROMI report credits that ad with the full deal. The honest question is whether that buyer would have found you through the organic result one line below the ad, for free. If yes, the campaign's true contribution is smaller than the dashboard says.
You measure this with a holdout or a geo test: turn the campaign off for a slice of your audience or a set of regions, and compare. If sales in the holdout barely move, the campaign was harvesting demand that existed anyway, and its real ROMI is far lower than reported. Incrementality testing is more work than pulling a dashboard number. It is also the difference between knowing your ROMI and hoping.
ROMI in the wider metric set
A single ROMI number is a verdict, not a diagnosis. When it drops, it cannot tell you why on its own. Pair it with a few partners so you can act:
- CAC and payback. ROMI tells you the return ratio; customer acquisition cost tells you what one customer costs, and payback tells you how many months until you recover it. A high ROMI with a 14-month payback can still strain cash flow.
- LTV. ROMI on a single quarter ignores the renewals and expansion that come later. For subscription or repeat-purchase models, a customer's lifetime value reframes a "weak" first-quarter ROMI into a strong one.
- Lead quality. A campaign can post great cost-per-lead and terrible ROMI because the leads never close. ROMI catches what volume metrics miss, which is exactly why it belongs alongside them.
If you are assembling a full reporting view, ROMI belongs in the same dashboard as those partner metrics, not on a slide by itself.
Common mistakes that inflate ROMI
- Revenue dressed up as profit. Reporting revenue ROMI and calling it return. Use margin for any decision about money.
- Spend-only denominator. Counting media and forgetting fees, tools, and production.
- Last-touch everything. Crediting the final click and starving the top of the funnel of budget it earned.
- Mismatched windows. Comparing this month's spend to this month's closes when the cycle runs longer.
- Ignoring incrementality. Taking credit for demand that would have converted without the ad.
- One number, no context. Quoting ROMI with no CAC, LTV, or payback beside it.
FAQ
What is a good ROMI?
It depends on margin and cycle, so a single benchmark misleads more than it helps. A rough working rule many teams use: revenue-based ROMI of 100% or more (sales at least double the spend) for performance channels. Lower can still be fine for high-margin products or for brand work that pays back over a longer horizon. Judge it against your own payback period, not a number from a blog.
What is the difference between ROMI and ROI?
ROI is the general return-on-investment formula for any spend. ROMI applies the same math specifically to marketing. The formula is identical; ROMI just narrows the scope to marketing costs and marketing-attributed revenue. Most teams use the terms interchangeably.
Should ROMI use revenue or profit?
For decisions about budget, use gross profit (the margin-based version). Revenue ROMI overstates returns on anything with a cost of goods, sometimes dramatically. Revenue ROMI is acceptable as a quick directional read for high-margin software, as long as everyone knows that is what they are looking at.
How do I handle long B2B sales cycles?
Match your measurement window to your sales cycle, or use a cohort view. Track the leads generated in a given month and follow them to closed revenue over the following months, rather than comparing this month's spend to this month's closes. Otherwise recent campaigns always look worse than they are.
Can I calculate ROMI without a CRM?
You can approximate it, but the numerator gets shaky fast. ROMI needs a trustworthy link between closed deals and the campaigns that sourced them. A spreadsheet works for low deal volume if you log the source of every deal by hand. Past a handful of deals a month, a CRM with proper source tracking pays for itself in measurement accuracy alone.
Why is my ROMI high but cash flow tight?
Usually a payback problem. A campaign can show strong long-run ROMI while you wait many months to recover the upfront spend. ROMI measures the eventual ratio; payback period measures the wait. Check both before scaling spend.
Quick checklist before you report a number
- Marketing cost includes media, fees, tools, and production, not spend alone.
- You picked revenue or margin ROMI on purpose and labeled which.
- Attribution model is stated and applied to every channel the same way.
- The spend window matches the deal-close window.
- You have at least thought about incrementality for branded and retargeting spend.
- ROMI is reported next to CAC, LTV, and payback, not on its own.
Get the inputs right and ROMI becomes one of the few marketing numbers a finance team will defend with you. Get them wrong and it becomes the number they quietly stop believing.
If your ROMI looks great in the dashboard but the bank balance disagrees, that gap usually lives in attribution and cost allocation. We can run a focused review of how your campaign costs and closed revenue connect, and show you where the real number sits. Tell us which channels you run and we will take it from there.