Short answer: this is structural, not a bug. On iOS 14.5 and later the IDFA is all zeros unless the user grants tracking permission, Apple does not allow fingerprinting, and many networks report iOS results through SKAN or AdAttributionKit. Read iOS paid performance from those aggregate sources.
Why iOS and Android attribution differ
ATT (App Tracking Transparency): Apple's framework that requires an app to ask permission before it can access the IDFA or track the user across other companies' apps and websites.
Apple says the IDFA reads as all zeros if tracking is not requested, denied, restricted or in the Simulator. Without it, an MMP has far fewer ways to match an iOS install to an ad click.
Should iOS and Android attribution rates match?
No. On Android the Google Play Install Referrer still hands same-session click data to the app, so user-level matching works for many more installs. Expect iOS user-level attribution to be lower and fill the gap with aggregate data.
Likely causes
- ATT denials. The IDFA is zeroed for users who do not grant permission.
- No fingerprinting. Apple says you may not derive data from a device to uniquely identify it, and treats fingerprint IDs as tracking identifiers.
- No other identifier workaround. Apple says that without ATT permission you cannot use another identifier, such as a hashed email, to track.
- SKAN-only network reporting. Meta says third-party tools may only receive SKAdNetwork reporting for its iOS campaigns.
- The ATT prompt never shows. Apple says it does not appear if tracking is restricted, the user turned off requests, the app is not active, or it is called from an extension.
How to confirm it
- Compare iOS user-level attributed installs with the SKAN or AdAttributionKit installs for the same campaigns.
- Check whether your ATT prompt appears on a fresh install with tracking requests turned on.
- Check that the prompt is called while the app is active, not from an extension or during launch.
- Compare the iOS organic share before and after a major iOS campaign launch.
How to fix it
- Use SKAN and AdAttributionKit as the main source of iOS paid results.
- Use Meta's AEM and other network aggregates for in-platform optimisation.
- Make sure the ATT prompt is shown at a sensible moment while the app is active.
- Do not try to rebuild user-level matching with fingerprinting or hashed identifiers; Apple's policy forbids it.
- Set separate attribution expectations for iOS and Android in your reporting.
| Android | iOS without ATT permission | |
|---|---|---|
| Advertising ID | Not limited by ATT | IDFA all zeros |
| Store referrer | Play Install Referrer | None |
| Aggregate source | Network reports | SKAN, AdAttributionKit |
See paid installs showing as organic for the broader picture, the SKAN 4 postbacks guide for iOS measurement, and the organic installs troubleshooter to rule out other causes.