Background
A Shopify fashion brand was running $8,000/month in Meta ads post-iOS14. Their reported ROAS had dropped from 3.9x to 1.8x — but sales in Shopify hadn't dropped nearly as much. The gap was attribution loss, not performance loss.
The iOS14 Attribution Problem
After Apple's App Tracking Transparency, browser-based pixels lost visibility on a large portion of iOS users who opted out of tracking. For this client:
- Pixel event match quality: 4.2/10 (Meta's own rating)
- Purchase events captured: ~40% of actual Shopify orders
- Meta's algorithm was flying half-blind, allocating budget based on incomplete data
Solution: Conversions API via Stape.io
Server-Side Event Matching
We implemented Meta Conversions API (CAPI) through Stape.io's server-side GTM container. This sends purchase events directly from the server — bypassing iOS restrictions entirely.
Key improvements:
- Deduplication — browser pixel + server CAPI events deduplicated so Meta doesn't double-count
- Hashed customer data — email, phone, name, address all hashed and sent with every event for maximum match rate
- Purchase value + currency — sent accurately from Shopify order webhooks, not estimated from pixel
Enhanced Match Quality
Added Shopify customer data to every event payload:
- Email (hashed SHA256)
- Phone (hashed SHA256)
- First/last name, city, country, postcode
Results (45 Days)
| Metric | Before CAPI | After CAPI |
|---|---|---|
| Event Match Quality | 4.2 / 10 | 8.7 / 10 |
| Purchase events captured | ~40% | ~94% |
| Reported ROAS | 1.8x | 4.1x |
| CPA (per purchase) | $44 | $19 |
| Monthly ad spend | $8,000 | $8,000 |
| Monthly attributed revenue | $14,400 | $32,800 |
What Actually Changed
The ad spend didn't change. The creative didn't change. Meta's algorithm got better data and found better buyers.
When the algorithm can see 94% of your conversions instead of 40%, it stops wasting budget on people who don't convert — and doubles down on people who do.
Lesson
If you're running Meta ads on a Shopify store and haven't implemented CAPI, you're almost certainly undercounting purchases and overpaying per acquisition. The fix is a one-time setup — the returns are permanent.