Case study

Why a store's 3.0 ROAS was really 0.73, and how it reached 1.8

A twelve-week look at an online store whose ad dashboards overstated results, and what changed when we tracked profit instead of platform revenue.

Client type
Direct-to-consumer online store
Services
Google Ads, Meta Ads, tracking, feed
Timeframe
12 weeks
Platform
Shopify
Primary KPI
Verified ROAS

Background

The client is a direct-to-consumer online store selling home and lifestyle products across India, with a catalogue of about 140 products and an average order value of ₹1,460. It runs on Shopify, accepts prepaid and cash-on-delivery orders, and spends on Google Ads and Meta Ads.

The owner was told by the ad dashboards that campaigns were working. Google and Meta together reported ₹9 L of revenue from ₹3 L of spend, a return of 3.0. Yet the bank balance told a different story: stock was selling, but cash was not growing.

The challenge

The reported return of 3.0 looked healthy. The real return, measured from the store's own order data after cancellations and returns, was 0.73. That is ₹73 of revenue for every ₹100 of ad spend, well below the break-even point.

The business sells at a 62.5% contribution margin after product cost, shipping and payment fees. At that margin, the break-even return on ad spend is 1 divided by 0.625, which is 1.6. Anything below 1.6 loses money on every order, before overheads.

  • Two purchase tags were firing on the thank-you page, so some orders were counted twice.
  • Meta and Google both claimed credit for the same order, because each used a different attribution window.
  • Cash-on-delivery orders that were cancelled or returned still counted as revenue in ad dashboards.
  • Campaigns optimised toward the platform's own numbers, so budget kept flowing to the wrong places.
  • The product feed had missing titles and categories, and Shopping ads showed irrelevant queries.

Objectives

The owner's goal was simple: make ad spend profitable. We translated that into measurable targets.

  • Reconcile ad platform revenue with store revenue, so every report uses one trusted number.
  • Raise verified ROAS above the 1.6 break-even within 12 weeks.
  • Reduce cost per verified order.
  • Keep ad spend flat at ₹3 L per 12-week period, so any gain came from efficiency, not a bigger budget.

Strategy

We started with measurement, because you cannot fix what you cannot see. Then we changed how budget was allocated.

1. Establish one source of truth

We used Shopify order data after cancellations and returns as the revenue figure. Ad platform numbers were treated as directional only. Every weekly report showed both side by side, along with the gap.

2. Repair tracking

We removed the duplicate purchase tag, standardised event names, passed order values accurately, and set up server-side events alongside the browser pixel to reduce lost signals. We also excluded cancelled and returned orders from reporting.

3. Rebuild the account structure

Brand search, non-brand search and Shopping were separated, so brand traffic stopped flattering the numbers. On Meta, prospecting and remarketing audiences were split and excluded from each other, which reduced overlap.

4. Clean the product feed

We rewrote product titles to include the words shoppers use, filled missing attributes, and excluded low-margin products from paid campaigns.

5. Use margin to decide

Each campaign was judged against the 1.6 break-even ROAS. Campaigns that could not reach it after a fair test were paused.

shop.yourbrand.inShopAboutSaleShopNewEveryday essentials,delivered fastShop now₹499₹749₹999₹1249ShopEveryday essentials,delivered fastShop now₹499₹749Add to cartPurchase event sent onceOrder value and ID, no duplicates
The storefront on desktop and mobile, with purchase tracking. Modelled figures. Designed mockup, not a screenshot of a client account.

Implementation

The work ran over twelve weeks with the same total budget as the previous twelve.

Weeks 1 to 2

Reconcile and audit

Matched ad platform revenue to Shopify orders, found the duplicate tag, and quantified where the ₹6.81 L gap came from.

Weeks 3 to 4

Fix tracking

Removed the duplicate purchase event, added server-side events, and built a weekly report showing reported and verified revenue together.

Weeks 5 to 8

Restructure campaigns

Split brand and non-brand, rebuilt Shopping with a cleaned feed, and separated Meta prospecting from remarketing. Paused the five weakest campaigns.

Weeks 9 to 12

Optimise on verified data

Shifted budget toward campaigns above break-even, tested new creative, and tightened audiences. Verified ROAS passed break-even in week eight.

Before and after

BeforeStarting point

  • Reported ROAS of 3.0, verified ROAS of 0.73
  • Two purchase tags, with duplicate orders counted
  • Cancelled and returned orders counted as revenue
  • Brand and non-brand traffic mixed together
  • Contribution after ad spend of -₹1,63,125

AfterSix-month position

  • Reported ROAS of 2.5, verified ROAS of 1.80
  • One clean purchase event plus server-side events
  • Reports based on Shopify orders after cancellations
  • Separate campaigns for brand, non-brand and Shopping
  • Contribution after ad spend of ₹37,625

Results

Reported vs verified ROASMODELLED DATA3.00Platform0.73VerifiedBefore2.50Platform1.80VerifiedAfterDashed line: break-even ROAS 1.6Weekly verified ROAS, 12 weeksBreak-evenW1W12Past break-even from about week 9
Platform-reported ROAS against verified ROAS, and the weekly climb past break-even. Modelled figures. Designed mockup, not a screenshot of a client account.

The most important result is one that looks like a step backwards: platform-reported revenue fell from ₹9 L to ₹7.5 L, while verified revenue rose from ₹2.19 L to ₹5.4 L. The platforms now report less because duplicate and inflated conversions were removed. The store now earns more because budget moved to campaigns that produce real, delivered orders.

Verified ROAS
1.80
from 0.73
+147%
Verified orders (12 weeks)
370
from 150
+147%
Cost per verified order
₹811
from ₹2,000
-59%
Contribution after ad spend
₹37,625
from -₹1,63,125
Now positive

Reported against verified ROAS

The gap between what dashboards say and what the store earned.

Platform-reported against verified ROASBefore the work the platform reported 3.0 but verified ROAS was 0.73. After, 2.5 reported and 1.8 verified.0.01.02.03.04.03.00.7Before2.51.8AfterRevenue per rupee of ad spend
Platform-reported ROASVerified store ROAS

Verified ROAS by week

Weekly return from the store's own order data. Break-even is 1.6.

Verified ROAS by weekVerified ROAS climbed from 0.72 in week one to 1.82 in week twelve, passing the 1.6 break-even in week eight.0.000.501.001.502.00W1W2W3W4W5W6W7W8W9W10W11W121.820.72Verified ROAS
Verified ROAS (weekly)

Why the dashboards over-reported

The four sources of the gap in the before period. Together they account for the full difference.

Where the over-reporting came fromSources of the ₹6.81 L gap between platform-reported and verified revenue before the work.View-through and overlapping attribution₹2.9 LDuplicate purchase tag firing₹1.9 LCancelled and returned cash-on-delivery orders₹1.2 LOrders that would have come from email or organic₹81,000

Summary table

Platform-reported and verified results compared
MeasureBefore (12 weeks)After (12 weeks)
Ad spend₹3,00,000₹3,00,000
Platform-reported revenue₹9,00,000₹7,50,000
Platform-reported ROAS3.002.50
Verified orders (store, after cancellations)150370
Verified revenue (orders x average order value of ₹1,460)₹2,19,000₹5,40,200
Verified ROAS0.731.80
Break-even ROAS (62.5% contribution margin)1.601.60
Contribution after ad spend-₹1,63,125₹37,625

Business impact

Before the work, the ₹3 L ad spend produced a verified loss of about ₹1.63 L after product, shipping and payment costs. After the work, the same spend produced a verified contribution of about ₹37,625. That is a swing of roughly ₹2.01 L over twelve weeks without raising the budget.

Cost per verified order fell from ₹2,000 to ₹811. The owner now has a weekly number they can reconcile with their own books, and a clear rule for pausing campaigns: if verified ROAS stays below 1.6 after a fair test, the campaign stops.

There is also a quieter benefit. Because reports now agree with the bank, the owner can plan stock and cash with more confidence, and discussions about marketing are about decisions rather than whose dashboard is right.

Lessons learned

Dashboard ROAS is not profit

Platform revenue includes overlap, duplicates and orders that never ship. Use your own order data as the source of truth.

Know your break-even

Break-even ROAS comes from margin, not from a rule of thumb. At a 62.5% margin it is 1.6. At a thinner margin it is higher.

Fix tracking before optimising

Optimising on inflated data sends budget to the wrong campaigns. The first month of this work was almost entirely measurement.

Reported numbers can fall while profit rises

Cleaner reporting often looks worse before it looks better. Explain this to stakeholders early.

Assumptions and method

This is a modelled example, not an audited client result. The storefront, website and dashboard images are designed mockups, not screenshots of a client account. Assumptions: ad spend of ₹3,00,000 in each 12-week period; average order value of ₹1,460; a 62.5% contribution margin after product cost, shipping and payment fees (so break-even ROAS is 1.6); 150 verified orders before and 370 after; verified revenue equals verified orders multiplied by average order value; contribution equals verified revenue multiplied by the margin, minus ad spend. The four gap components add up exactly to the difference between reported and verified revenue before the work. Real results vary with margin, return rates, product mix and seasonality. We do not promise any specific outcome.

Keep reading

Free audit

Not sure your ad numbers are real?

We will compare your ad platform revenue with your store orders and show you the gap, free of charge.

  • Free review of your website, ads and tracking
  • A plain-English plan with clear priorities
  • Month-to-month support, no lock-in contracts

Request your free audit

Tell us a little about your business. We reply within 24 hours on business days.

What do you need help with? (choose all that apply)

We never share your details. Read our privacy policy.