How to attribute installs in a React Native app
React Native install attribution is the process of determining which ad click caused each install of an app built with React Native, using native platform signals that the JavaScript layer cannot read on its own. Traqio is a mobile measurement partner (MMP) for apps and websites: it attributes app installs, website sign-ups and the events that follow them to ad campaigns and reports return on ad spend, with per-conversion pricing published up front. Traqio's React Native SDK attributes Android installs through the Google Play Install Referrer and iOS installs through Apple's SKAdNetwork, without the IDFA, the GAID or an App Tracking Transparency prompt.
Why does React Native attribution need a native module?
The two signals that attribute an app install are native APIs, so a React Native app cannot read them from JavaScript alone. On Android the signal is the Google Play Install Referrer; on iOS it is SKAdNetwork, Apple's attribution framework.
The Google Play Install Referrer API returns the referrer string attached to a Play Store listing visit, together with click and install timestamps, letting an app read on first launch which ad click preceded its own install. Google's documentation states that the install referrer information is available for 90 days.
SKAdNetwork (SKAN) is Apple's attribution framework: instead of user-level data, Apple sends the ad network a signed, delayed and aggregated postback stating that a campaign produced an install, plus a small conversion value describing early in-app behaviour. The app's part is to register the install and update that conversion value, both through StoreKit calls.
Traqio's React Native SDK, @traqio/react-native, is one package: an autolinked native module written in Kotlin and Swift, plus the JavaScript engine that queues events and sends them. The app imports everything from that one package.
How is a React Native install attributed on Android?
An Android install of a React Native app is attributed deterministically: a click id travels from the ad's tracking link through the Play Store, and the SDK reads it back on first launch. Deterministic attribution matches a click to a conversion using an identifier that is present on both sides, so the match is exact rather than inferred.
No Android permission is required, and no advertising id (GAID) is read at any step. The module declares the manifest entry that lets it see Google Play on Android 11 and later, so the app's own manifest needs no change for attribution.
- A Traqio tracking link records the click and its click id before sending the user to Google Play.
- Google Play keeps the click id in the install referrer string.
- On first launch, the SDK's native module reads the referrer and the Traqio server matches the click id to exactly one recorded click.
- If Google Play does not answer at first launch, the SDK holds the install and retries on the next launches, up to three, rather than reporting it organic.
How is a React Native install attributed on iOS?
An iOS install of a React Native app is attributed through SKAdNetwork postbacks, which Apple sends at campaign level rather than per user. The app declares Traqio as its SKAdNetwork reporting endpoint in Info.plist, and iOS then sends Traqio a copy of every postback for that app.
The SDK registers the install with SKAdNetwork and updates the conversion value from the mapping published for the app in the Traqio console. An app that already manages its own conversion-value schema can turn the SDK's handling off, because two writers would overwrite the same value.
SKAN attribution is campaign-level, not user-level: Apple's documentation states that the first postback arrives after a random 24–48 hour delay once its conversion window closes. Per-user iOS ROAS therefore does not exist from SKAN, and Traqio does not model one.
App Tracking Transparency (ATT) is the iOS framework, mandatory since iOS 14.5, that requires an app to ask the user's permission before accessing the IDFA or tracking them across other companies' apps and websites. The SDK neither shows nor needs that prompt, because SKAN attribution does not depend on it.
What does the setup look like in a React Native app?
Setting up Traqio attribution in a React Native app takes five steps, all in the app's own code and configuration.
@traqio/react-native is published on npm; the setup guide in the documentation gives every command and file in full.
- Enable Expo Modules once with npx install-expo-modules@latest, because the SDK's native half is an Expo module; this adds the Expo Modules runtime, not an Expo managed workflow or an Expo service.
- Install @traqio/react-native together with @react-native-async-storage/async-storage, then run pod install for iOS. AsyncStorage is how the SDK reports the install exactly once and keeps queued events across restarts.
- Call Traqio.init in index.js, before AppRegistry.registerComponent, with the app's SDK key, the endpoint https://api.traqio.app and the native bridge.
- Add NSAdvertisingAttributionReportEndpoint with the value https://api.traqio.app to the iOS Info.plist.
- Call Traqio.setUserId with the id the app gives RevenueCat, and Traqio.track for purchases, with a transaction id so each payment counts once.
Which React Native versions and builds are supported?
Traqio's React Native SDK requires React Native 0.74 or later with Expo Modules installed, and iOS 15.1 or later; Android needs no permission. The SDK runs in a development build or a release build, not in Expo Go.
Expo Go is a prebuilt app with a fixed set of native libraries, so it cannot load a native module that it does not already contain. A development build is the app compiled with its own native code, which is what the Install Referrer reader and the SKAdNetwork calls require.
An Expo app uses @traqio/expo, an alias that re-exports the same module under a name Expo users search for. An app installs one of the two packages, never both.
The React Native SDK is the one Traqio SDK verified end to end on a device: a click, an install from Google Play, the referrer read on first launch, and an install attributed deterministically.
What happens after the install: events, revenue and deep links
After the install, the SDK attaches in-app events and revenue to the campaign credited with the install, which is what makes ROAS per campaign computable once the Meta and TikTok ad accounts are connected for spend.
Deferred deep linking is the technique of preserving the destination of a link tapped before installation, so that a user who installs the app lands on that specific screen on first launch instead of the home screen.
- Events are queued offline and sent when the app goes to the background; an app open is recorded when the app returns after 30 minutes or more. No manual flush is needed on React Native.
- Subscription revenue reported by RevenueCat joins the same user when the app passes RevenueCat's app_user_id to Traqio.setUserId.
- The SDK listens to React Native's Linking module and hands Traqio links to an onDeepLink callback, including the deferred link of a fresh install.
What Traqio does not do in a React Native app
Traqio's SDK collects neither the IDFA nor the GAID, never reads the clipboard and does no device fingerprinting, on iOS or on Android. Click-through installs are matched only on a click id.
The one probabilistic match Traqio makes is view-through attribution, off by default and turned on per app: when no click matches, an ad impression can be matched to the install on the hashed IP address inside the view-through window. With view-through off, an install that no click id connects to a click is counted as organic rather than guessed at.
Click and view attribution inside Meta's and TikTok's own app-install inventory requires being a listed measurement partner of each network, and Traqio is not listed yet. Teams that need that coverage, many more ad networks, or fraud scoring will find it in the established MMPs.
FAQ
- How do I track app installs from ads in React Native?
- Install a mobile measurement SDK with a native module: React Native's JavaScript layer cannot read the Google Play Install Referrer or call SKAdNetwork on its own. With Traqio, the app installs @traqio/react-native, calls Traqio.init before registering the app, and declares Traqio's SKAdNetwork endpoint in Info.plist; ad links go through a Traqio tracking link.
- Does React Native attribution need the IDFA or an ATT prompt?
- No. Traqio attributes Android installs through the Google Play Install Referrer and iOS installs through SKAdNetwork postbacks, neither of which requires the IDFA, the GAID or App Tracking Transparency permission. The SDK never shows the ATT prompt.
- Does Traqio's React Native SDK work in Expo Go?
- No. The SDK contains native code, and Expo Go only runs the native libraries it ships with. The SDK works in a development build or a release build; Expo apps install the @traqio/expo alias of the same module.
- Which React Native version is required?
- React Native 0.74 or later, with Expo Modules installed in the project, and iOS 15.1 or later. Android needs no permission.
- Can I attribute React Native installs to Meta and TikTok campaigns?
- Yes, for traffic routed through a Traqio tracking link on Android and for SKAN postbacks on iOS, where Traqio maps the ad-network ids of Meta and TikTok. Connecting the Meta and TikTok ad accounts adds their spend, which turns attributed revenue into ROAS per campaign.
- Does the SDK handle deferred deep links in React Native?
- Yes. The SDK listens to React Native's Linking module and passes Traqio links — both direct opens and the deferred link of a fresh install — to the app's onDeepLink callback. The app must declare its branded link domain for links to open it.
Sources
- Google Play Install Referrer Library — Android Developers — checked 2026-09-19
- Apple — Receiving ad attributions and postbacks (SKAdNetwork) — checked 2026-09-19
- Expo — Install Expo modules in an existing React Native project — checked 2026-10-22
- Expo — Introduction to development builds — checked 2026-10-22
Related
Other guides
Last updated 2026-10-22