All case studies
04 / MeasurementCoffee · Egypt · COD and Fawry

The account reported 5.48 ROAS. The real number was 1.80.

A coffee brand about to scale on a reported 5.48 ROAS was actually running at 1.80 once the attribution window, the cancellations and the unsettled Fawry orders were taken out — so the work was measurement first and budget second.

5.48
ROAS on screen
1.80
ROAS after measurement
EGP 200
Break-even cost per order
The situation

A brand doing real volume, with an owner reasonably pleased: the ads manager showed 5.48 ROAS and the blended figure across the whole business looked close to 10x. The plan was to raise budget. The problem with raising budget against a number you have not audited is that scaling does not create margin, it multiplies whatever the account is already doing — so if the number is wrong, the mistake gets bigger at exactly the rate the spend does.

What I found
  • The account was reporting on a 7-day-click-and-1-day-view window while the owner compared it against same-day revenue, so a week of purchases was being credited to a single day of spend.
  • Not one ad carried a UTM, which meant Shopify could not attribute a single order back to the campaign that bought it. Every platform number was unfalsifiable by design.
  • COD and Fawry orders were both counted as revenue the moment checkout completed, before either had settled — and in this market a meaningful share of them never does.
What I changed

Rebuilt the measurement before touching the budget

Reporting moved to a 7-day-click window with view-through removed, every ad got a UTM so Shopify could name the campaign behind each order, and the purchase event was rekeyed to the confirmed order rather than the completed checkout. None of this makes the account earn more. It makes the account tell the truth, which is the prerequisite for every decision that follows.

Wrote down the break-even first

Cost of goods, shipping, packaging, the payment fee and the cancellation rate resolved to a break-even of EGP 200 per delivered order. Having that single number in writing changes what a result means: 1.80 ROAS stops being a disappointing figure to argue about and becomes a specific gap to close, with a specific target to beat.

Built the sprint and left it paused

Three campaigns at EGP 1,500 a day were structured, briefed and queued — and not switched on. The account had a measurement problem, not a budget problem, and launching first would have bought a month of data through the same broken lens that caused the disagreement in the first place.

What happened

The brand went into the next month knowing its real cost per delivered order and its real break-even, on an account that could finally attribute an order to the ad that caused it. The reported ROAS fell by two thirds on paper and nothing about the business got worse — the only thing that changed was that the number stopped flattering itself.

The part usually left out

There is no revenue screenshot attached to this one, because the honest outcome was to stop. Telling an owner that the figure they have been happy with for months is inflated by three times is a bad meeting, and I would rather have that meeting before the budget goes up than explain the same gap afterwards with more money spent.

About this case

What people ask about this one.

Why does the ads-manager ROAS differ from the real one?
Because it is calculated on a generous attribution window and before cancellations, returns and unsettled payments. Here the account reported 5.48 and measured 1.80 once those were removed — and that gap is the entire margin.
What is the right move when you find the number is inflated?
Stop scaling and rebuild the measurement first, not raise spend. The honest outcome here was to leave the budget where it was until the number was real.
WhatsApp