When Apple rolled out App Tracking Transparency in April 2021, roughly 75% of iPhone users opted out of tracking. On average, that removed 30-50% of the conversion signal Meta relied on to optimize bids. Four years later, most accounts still have not fully recovered — not because it is impossible, but because the fix requires infrastructure work that most in-house teams and agencies skip.
This is the technical playbook we run on every Meta engagement. It is not conceptual. It is specific: what to install, what to send, what to check, and what to fix when the numbers still do not reconcile.
The Core Problem
Before iOS 14, Meta relied heavily on client-side pixel data — a JavaScript snippet that fired from the browser and told Meta what happened. Post-iOS 14, that pixel is unreliable for iOS users because Safari (and third-party cookies more broadly) block much of the underlying tracking. Meta cannot see what those users did after clicking the ad.
The solution Meta shipped is the Conversions API (CAPI): a server-to-server integration that sends conversion events directly from your server to Meta, bypassing the browser entirely. Server-side signal is not blocked by iOS. Set up correctly, it recovers most of the signal that ATT wiped out.
Step 1: Set Up CAPI (Correctly, Not Halfway)
Most accounts we audit have CAPI "installed" but implemented in a way that produces worse-than-nothing results. The three most common mistakes:
1. Using the Shopify or Woo CAPI toggle without cleaning up event deduplication
Enabling Shopify's native Meta + CAPI integration is a good start. But if your existing Meta pixel is still firing client-side and CAPI is also sending the same events server-side, without an event_id to match them, Meta will count both. Your conversion volume in Ads Manager will inflate by 20-40%, ROAS will look great, and none of it will be real.
2. Not sending user data with the events
CAPI events need user identifiers so Meta can match the event to an ad click. Send hashed email, phone, name, city, state, and zip. If you send just the event type without user data, Meta cannot match it and the event does not improve bidding signal — it just fills reports.
3. Not sending the FBCLID or click_id
If a user clicked a Meta ad, that click has an FBCLID. Capture it on landing (same as GCLID) and include it in the CAPI event when the purchase happens. This is the single strongest matching signal — better than email hash in most cases. Most implementations skip it.
Step 2: Fix the Attribution Window
iOS restrictions also capped Meta's attribution window to 7-day click / 1-day view for opted-out users. Longer windows still work for opted-in users but the aggregate signal is degraded. Most accounts have not touched the default window since iOS 14, which was set to 7-day click / 1-day view across the board.
For most e-commerce accounts, 7-day click is right. For considered purchases (furniture, high-ticket DTC, B2B), extending to 28-day click captures conversions that were legitimately driven by Meta but happened outside the default window. Test both — measure incremental lift against the actual purchase data, not against Meta-reported conversions.
Step 3: Rebuild the Custom Audiences
Post-iOS 14, website custom audiences built from pixel data shrunk dramatically. A 30-day 'purchase intent' audience that used to have 500K users now has 180K. Retargeting reach is a fraction of what it was.
The rebuild: switch audiences to source from server-side events (via CAPI) and add first-party audience uploads. Take your customer email list — everyone who purchased in the last 12 months — and upload it as a Custom Audience. Segment by purchase behavior: repeat buyers, big-ticket buyers, product-category buyers. These segments are more reliable than pixel-derived audiences because they come from your first-party data.
Step 4: Update Your Campaign Structure
Pre-iOS 14, Meta accounts often had 15-20 ad sets per campaign, each targeting a narrow audience. Post-iOS 14, this structure works badly because signal per ad set gets too thin — Meta cannot optimize inside a small ad set with a small conversion pool.
The current recommendation: broader ad sets, fewer of them, using Meta's Advantage+ audience expansion. Give the algorithm more room to find the audience itself using your CAPI + first-party audience signal. Consolidate 15 ad sets into 3-5.
What to Check Weekly Once It Is Live
- Event Match Quality score — target 8.0+ on Purchase
- CAPI event volume vs. pixel event volume — should be roughly balanced with deduplication working
- Attributed revenue in Meta vs. your order data — the gap should be <15%
- Advantage+ Shopping Campaign vs. traditional structure — Meta pushes hard for AS+, sometimes it is right, sometimes it is wrong
- iOS vs. Android CPM differential — if iOS CPMs are 3-5× higher, you probably still have signal issues on iOS specifically
