From 0.9x at week 0, climbing through 13 weeks of stack rebuild. Above pre-iOS-18 baseline of 2.1x.
Wellness brand, ROAS recovered post-iOS 18.
An archetype drawn from server-side attribution rebuilds we have shipped for DTC wellness brands. ROAS from 0.9x to 2.8x across thirteen weeks via Meta CAPI, Cloudflare sGTM, and warehouse-blended reporting.
A DTC wellness brand watched its reported ROAS collapse after iOS 18.
iOS 18 shipped in September 2024 with capped postback windows and tighter App Tracking Transparency enforcement. Meta's ad manager, reading only browser-side pixels that Safari iOS now routinely dropped, reported blended ROAS falling from 2.1x to 0.9x within three weeks. The business had not actually lost revenue. The business had lost the ability to measure it. We rebuilt the stack and recovered reported ROAS to 2.8x across thirteen weeks, above pre-iOS-18 levels, because the new measurement captured conversions the old pixel had been missing all along.
Meta Event Match Quality score post-CAPI + SGTM. From 38% on browser-side pixel alone.
Signed on week 0; CAPI live week 2; SGTM week 6; warehouse blended week 11; pre-iOS-18 baseline cleared week 13.
The brand had not lost revenue. The brand had lost the ability to see it.
In September 2024 the founder watched Meta's ad manager report a week-over-week ROAS drop from 2.1x to 1.4x to 0.9x, with no change in ad spend, creative, or audience. Shopify revenue was flat. Email revenue was flat. Direct-type-in traffic was flat. Everything was flat except what Meta claimed it was driving. The logical conclusion, that ads had stopped working, was wrong. The actual conclusion, that iOS 18's Safari tracking restrictions had started dropping conversion events from the browser-side pixel, was harder to prove to a founder about to turn ads off.
The brand was running a standard 2023-era measurement stack: Meta Pixel on every page, Google Analytics 4 via client-side GTM, a handful of server events fired from Shopify webhooks into Klaviyo, and weekly CSV exports to a founder's spreadsheet. Nothing was server-side. Nothing was consent-aware beyond a cookie banner. Nothing survived contact with iOS 18's Intelligent Tracking Prevention 2.3 release.
The rebuild was not a matter of adding one tool. It was a full stack replacement. The thirteen-week runway below is what we ran, stage by stage. The first six weeks were pure engineering with no reported-ROAS improvement. Weeks 7 through 13 is where the curve turned.
Five layers, measured once.
The stack below is what every mid-market DTC brand should be running after iOS 18. Each layer solves a specific failure mode from the previous stack. The warehouse at the bottom is the single source of truth; everything above it is instrumentation feeding that truth.
Browser pixel.
Kept, not trusted. Meta Pixel + GA4 via GTM for audience building, not reporting. iOS 18 capped 24h postback respected.
Consent.
Google Consent Mode v2 via Cookiebot. Per-user ad_storage + ad_user_data + ad_personalization signals.
Meta CAPI.
Server-side Conversions API via Shopify webhook → Cloudflare Worker → Meta endpoint. Event deduplication via event_id.
Server-side GTM.
sGTM on Cloudflare Workers. Routes events to Meta, GA4, TikTok, Klaviyo, BigQuery. First-party domain, no iOS throttling.
Warehouse truth.
BigQuery via Rivery. Blended CAC, MER, contribution LTV. Single source of truth for founder's Monday meeting.
Looker Studio dashboard on BigQuery. Meta is no longer a reporting surface; it is an audience tool.
Thirteen weeks. One curve.
Engineering first. Reporting second.
- Weeks 1-2: audit current stack, map every event, ship Meta CAPI server-side via Shopify webhooks + Cloudflare Worker with event deduplication
- Weeks 3-5: migrate GTM to Consent Mode v2 via Cookiebot, configure ad_storage + ad_user_data + ad_personalization signals per region
- Weeks 6-8: deploy server-side GTM on Cloudflare, move all marketing event routing server-side, first-party subdomain for first-party cookies
- Weeks 9-10: wire BigQuery via Rivery CDP, schema for orders, sessions, events, customers, subscriptions
- Weeks 11-12: build Looker Studio dashboard: blended MER, contribution CAC, 1-year LTV, payback period by channel
- Week 13: switch founder's Monday reporting to warehouse dashboard, archive Meta as an audience surface only
"We almost turned off ads because Meta said they were broken. The rebuild showed us we had a measurement problem, not an ads problem. Thirteen weeks later we were spending more and reporting a higher ROAS than before iOS 18."
Watching your reported ROAS collapse?
We run server-side attribution rebuilds in 10 to 14 weeks. Audit in week one, written plan in week two, implementation through week ten, reporting flip in week thirteen.