This is pointing to a crucial distinction: your app (using RevenueCat) can confirm a user successfully completed a purchase on Apple's (or Google's) platform. That's one thing. But then, for Meta to know about that purchase and attribute it to your ads, that information needs to be separately and correctly sent to Meta.
If that second step fails, you get a "discrepancy" – a successful purchase that Meta never "saw."
Here's why these tracking failures are so common and often the source of your missing data:
The iOS 14.5+ Privacy Wall (App Tracking Transparency - ATT): This is the single biggest modern challenge for app tracking. When a user opens your iOS app, they are (or should be) shown a prompt asking for permission to track their activity across apps and websites.
If a user taps "Ask App Not to Track" (or doesn't respond quickly enough, which defaults to no consent), then the Facebook SDK on their device is severely limited. It essentially goes "blind" for tracking purposes. Even if that user goes on to make a successful purchase through your paywall (confirmed by RevenueCat and Apple), the Facebook SDK often cannot send that purchase event data to Meta due to the user's privacy choice. From Meta's perspective, that conversion just never happened, leading to a huge discrepancy. This doesn't mean your app or RevenueCat failed; it means user privacy choices impacted tracking.
Facebook SDK Implementation Nuances: Even if a user does consent to tracking, the SDK still needs to be set up perfectly.
Incorrect Initialization: If the Facebook SDK isn't initialized correctly when the app starts, or if its configuration isn't quite right, it might not be ready to send events.
Missed Event Calls: Are you absolutely certain Purchases.shared.track (or the direct Facebook SDK call for purchases) is triggered reliably for every single type of purchase? This includes initial subscriptions, trial conversions, renewals, and even restored purchases. If you miss one scenario, those conversions won't be reported.
Missing or Incorrect Parameters: Meta's algorithm relies heavily on rich data. If you're not consistently passing vital parameters like value (the purchase amount), currency, and content_ids (SKUs), Meta might still receive the event but consider it "low quality" or struggle to attribute it effectively, sometimes leading to it being ignored.
Conversions API (CAPI) Deduplication Issues: Many advertisers use CAPI alongside the Facebook SDK to improve data accuracy and bypass issues like ad blockers or network problems. However, if not set up perfectly, CAPI can create new discrepancies:
Mismatched Event IDs: For CAPI and the SDK to work together, they must send a unique event_id for each single purchase, and those IDs must match for the same event from both sources. If the event_ids don't align, Meta doesn't know these are the same purchase. It might then either count it twice (unlikely to be your "failure" issue) or, more often, reject one of the events as un-deduplicable, leading to underreporting.
Incorrect User Data: CAPI relies on strong user identifiers (like hashed email, phone number) for matching. If these aren't consistent or correctly hashed, CAPI events might not link up with Facebook profiles, hindering attribution.
Network and App Lifecycle Glitches:
Client-Side Network Drops: A user might complete a purchase while on a shaky Wi-Fi or cellular connection. While Apple confirms the purchase, the device might lose connectivity before the Facebook SDK can successfully send the event packet to Meta's servers.
Rapid App Backgrounding/Closing: If a user completes a purchase and then immediately closes the app or sends it to the background, the SDK might not have enough time to process and dispatch the event.
In essence, while RevenueCat acts as your reliable accountant for actual app store transactions, getting that exact same data successfully delivered and understood by Meta is a separate and often complex challenge filled with potential points of failure, especially concerning user privacy settings and precise technical implementation.