Meta Pixel Not Working After iOS 14? Here's the Complete Fix

iOS 14.5 broke your Meta pixel tracking. Here's exactly what happened, what you need to implement, and how to recover as much conversion data as possible.

Meta pixeliOS 14CAPIconversion trackingFacebook ads

Your Meta pixel was working fine. Then iOS 14.5 happened. Now your conversions are missing, attribution is broken, and your campaigns are struggling to optimize. Here’s what’s actually happening and how to fix it.

What iOS 14.5 Actually Changed

Apple’s App Tracking Transparency (ATT) prompt lets users opt out of cross-app tracking. When a user opts out:

  1. The Meta app can’t access their device identifier
  2. Browser tracking is limited to 7 days
  3. Cookie storage is restricted
  4. Meta can’t connect in-app activity to web conversions

The result: Meta sees dramatically fewer conversions than actually happen, so it can’t optimize your campaigns effectively.

The Three-Part Solution

Recovering from iOS 14 requires implementing all three:

1. Conversions API (CAPI)

CAPI sends conversion data server-to-server, bypassing browser restrictions:

User converts → Your server → Meta's servers

              No browser involved

CAPI can’t be blocked by iOS, ad blockers, or browser privacy features.

Implementation options:

  • Native integration (Shopify, WooCommerce have built-in)
  • Google Tag Manager Server-Side
  • Direct API integration
  • Partner integrations (Zapier, etc.)

2. Aggregated Event Measurement (AEM)

Meta’s response to Apple’s restrictions. You must:

  1. Verify your domain in Business Manager
  2. Configure up to 8 prioritized web events
  3. Set up Events Manager correctly

Go to: Business Manager → Brand Safety → Domains → Verify your domain

Then: Events Manager → Data Sources → Your Pixel → Aggregated Event Measurement

3. First-Party Data Strategy

Collect email addresses and phone numbers, then:

  • Hash and send via CAPI for matching
  • Use customer lists for Custom Audiences
  • Implement email-based attribution

Implementing CAPI: The Technical Details

Option A: GTM Server-Side Container

The cleanest approach for most businesses:

  1. Set up GTM Server-Side container (requires hosting)
  2. Create Meta CAPI tag in server container
  3. Send events from your web container to server container
  4. Server container forwards to Meta

Pros: Flexible, works with existing GTM setup Cons: Requires hosting, more complex setup

Option B: Native E-commerce Integration

If you’re on Shopify, WooCommerce, or BigCommerce:

  1. Go to your platform’s Meta integration settings
  2. Enable Conversions API
  3. Enter your access token from Meta Events Manager
  4. Choose which events to send server-side

Pros: Easy, usually free Cons: Limited customization, may miss some events

Option C: Direct API Integration

For custom builds:

from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.serverside.event import Event
from facebook_business.adobjects.serverside.event_request import EventRequest
from facebook_business.adobjects.serverside.user_data import UserData

user_data = UserData(
    email='hashed_email',  # SHA256 hashed
    phone='hashed_phone',  # SHA256 hashed
    client_ip_address='user_ip',
    client_user_agent='user_agent',
    fbc='fbc_cookie_value',  # For deduplication
    fbp='fbp_cookie_value'   # For deduplication
)

event = Event(
    event_name='Purchase',
    event_time=int(time.time()),
    user_data=user_data,
    custom_data={'value': 99.99, 'currency': 'USD'},
    event_source_url='https://yoursite.com/thank-you',
    action_source='website'
)

request = EventRequest(
    events=[event],
    pixel_id='YOUR_PIXEL_ID'
)
request.execute()

Deduplication: The Critical Step Everyone Misses

If you’re sending events via both browser pixel AND CAPI, you’ll double-count conversions unless you deduplicate.

How Deduplication Works

Send the same event_id from both sources:

Browser-side (GTM):

fbq('track', 'Purchase', {
  value: 99.99,
  currency: 'USD'
}, {
  eventID: 'order_12345'  // Unique per event
});

Server-side (CAPI):

event = Event(
    event_name='Purchase',
    event_id='order_12345',  # Same ID as browser
    # ... other parameters
)

Meta will recognize these as the same event and only count it once.

Measuring Your CAPI Success

After implementation, check Events Manager:

  1. Go to Events Manager → Your Pixel
  2. Look at “Connection Quality” for each event
  3. Target: “Good” or “Great” quality

Check the Event Match Quality score:

  • Below 4.0: Poor matching, low attribution recovery
  • 4.0-6.0: Average, some recovery
  • Above 6.0: Good matching, better attribution

To improve match quality:

  • Send more user data (email, phone)
  • Ensure proper hashing (lowercase, trim whitespace, SHA256)
  • Send browser parameters (IP, user agent, fbc/fbp cookies)

What Recovery Should Look Like

After proper CAPI implementation, you should see:

  • Reported conversions increase: 20-50% more conversions visible in Ads Manager
  • Attribution window extends: Better 7-day click, 1-day view attribution
  • Campaign performance improves: Meta can optimize with more data

You won’t recover everything—users who opt out of ATT are still harder to track. But you’ll get significantly better data than browser-only tracking.

The Most Common CAPI Mistakes

  1. Not deduplicating: Double-counting inflates conversions, breaks optimization
  2. Missing user data: No email/phone = poor match rates
  3. Wrong hashing: Meta requires lowercase + SHA256; wrong format = no match
  4. Not sending all events: CAPI should match your browser events
  5. Incorrect event names: Purchase not purchase (case matters)

When to Get Help

CAPI implementation has lots of places to go wrong. Consider expert help if:

  • You’re spending over $5K/month on Meta ads
  • Your current match quality is below 4.0
  • You’re on a custom platform (not Shopify/Woo)
  • You need server-side GTM setup

Get a free scan and we’ll assess your current Meta pixel implementation and tell you exactly what’s missing.