Google's Play Install Referrer API is the reliable, Google-sanctioned mechanism on Android - it lets your app read a signed, tamper-resistant referrer string set at install time, which is materially more trustworthy than the older broadcast-intent approach it replaced, since that broadcast could be spoofed by other apps on the device. Branch.io and similar SDKs build on this same API plus iOS's more limited signals, adding deep-linking and cross-platform matching on top - but the Android guarantee still comes from Google's own API, not from a third-party SDK's own cleverness.
Why this happens
Mobile install attribution has to solve a problem web attribution does not: there is no cookie that survives the trip from "clicked an ad" to "opened the Play Store" to "installed and opened the app" - the app does not exist on the device yet when the ad click happens.
The old INSTALL_REFERRER broadcast intent approach was insecure because any app already installed on the device could register a receiver for that same broadcast and intercept or fake the referrer data before your app read it. The Play Install Referrer API - a bound service, not a broadcast - closes that hole by having your app query Google Play directly and receive a value only Google Play itself can set, which is why Google explicitly recommends migrating any implementation still using the legacy broadcast.
Fix it
- On Android, integrate the Play Install Referrer Library rather than any code still listening for the legacy INSTALL_REFERRER broadcast.
- On first app launch, start the connection and read the referrer string once the service connects - it contains the UTM-style parameters your ad network or link-shortening layer set on the Play Store URL.
- Parse and forward that referrer string to your attribution backend (or Branch/Adjust/AppsFlyer) immediately on first open, since the value is only available for a limited window after install.
- If using Branch.io specifically, let its SDK handle the Play Install Referrer call internally, which it does by default - your job is mainly to confirm your Play Store listing URL is generated through Branch's link so the referrer parameter it needs is actually present.
- On iOS, recognize the ceiling: there is no equivalent signed-referrer API - SKAdNetwork or probabilistic/deterministic matching via a service like Branch is the realistic best available signal, not a guaranteed one-to-one click-to-install match.
- Log and monitor the raw referrer string during QA - a real test install through a genuine tracking link - before trusting it in production reporting; malformed UTM parameters upstream are a common silent cause of installs falling into an "organic/unknown" bucket that should have been attributed.
How to verify it worked
Perform a real test click-through-to-install using a genuine tracking link, not a direct Play Store URL, on a physical or emulator device, then log the referrer value returned on first launch and confirm it matches the parameters your ad network or link actually set. Cross-check that the resulting install shows up correctly attributed, not "organic," in whichever downstream system consumes that referrer.