A five-week scope for a fictional pet-food DTC brand on Shopify, modelled on the kind of engagement I ship for real clients. The numbers are stylised; the frameworks, the SQL, and the sequence of findings are exactly how it runs in production.
Every DTC brand doing £1M+ has some version of the same problem: three tools, three numbers, and a founder who's stopped trusting any of them. PawCart — a Shopify-based pet-food brand — came in with exactly that. Five weeks later they had one number, a roadmap, and £280K of previously-invisible revenue pinned to specific fixes.
PawCart does £3.2M run-rate on Shopify. Spends ~£35K/month on Meta and Google. Two-person marketing team, one fractional CFO, founder CEO. Six months ago they hired a growth agency who "improved ROAS by 40%" — which the founder has never believed, because the Shopify P&L didn't move.
That gap — between what the ads dashboard says and what the bank account says — is where every engagement I run starts.
Before looking for leaks, I build a three-way reconciliation: Shopify orders, GA4 purchase events, Meta conversions. Same window, same revenue definition, same attribution model. Every engagement reveals the gap; the interesting part is where the gap is.
| Source | Revenue (30d) | vs. Shopify | Diagnosis |
|---|---|---|---|
| Shopify (truth) | £264,100 | — | Baseline |
| GA4 purchase | £241,800 | -8.4% | Consent-mode signal loss + ad blockers |
| Meta Ads Manager | £318,400 | +20.6% | Double-count + view-through inflation |
Meta is claiming £54K of revenue that Shopify doesn't have a matching order for. That's the agency's "40% ROAS improvement" in one table.
Purchase event fires on /thank-you page load. A meaningful share of customers refresh to save the page, which fires the pixel again. Meta has no dedupe key set up server-side. Result: ~12% inflation on top of view-through — enough to make the worst-performing campaigns look break-even.
Fix: CAPI with event_id dedupe, plus server-side purchase confirmation from Shopify webhook.
Klaviyo flow fires on Added to Cart, but three specific conditions silently skip it: customer not logged in, checkout initiated in-app, and discount-code flows. Combined, about 34% of abandoned carts never received the recovery email. Standard industry recovery rate on this segment is 8–12%.
Fix: Shopify checkouts/create webhook → server-side Klaviyo track. Two-day build, one-day QA.
900+ product reviews collected in Okendo. Aggregate rating is shown on product pages but not exposed via AggregateRating schema. Google Shopping therefore shows no seller rating — competitors in pet-food category all show stars. Baseline CTR lift from stars in PLAs is ~17% on comparable categories.
Fix: Okendo already has a Google integration turned off by default. Flip it. Two hours.
Every engagement ends with one page the operator actually checks. Not twelve dashboards, not a monster deck — one page, weekly. For PawCart it had six tiles: revenue (Shopify truth), GA4 vs. Shopify delta, CAC by channel, 30-day LTV, abandoned-cart recovery %, and review-signal CTR.
"Don't trust a dashboard you couldn't explain to your mum in 90 seconds." — what I tell every new client on kickoff.
£280K of recoverable revenue is the signal, not the guaranteed lift. The three fixes above usually capture 50–70% of that over six months, with the rest decaying into noise as customer behaviour adapts. A responsible consultant writes it as a range, not a promise. Any consultant who'll stand behind a single number on five weeks of data is selling you something.