In the Integrations tab, under Analytics, click Configure under Google Analytics. Firebase App ID and a Measurement Protocol API secret will be required. These are different for iOS and Android.To retrieve the Firebase App ID and Measurement Protocol API secret:
Open Admin (settings icon) from the bottom-left of the Google Analytics interface.
Under Property → Data collection and modification → Data streams, click your app data stream (iOS or Android).
In the App stream details panel, copy the Firebase App ID.
Under Events, click Measurement Protocol API secrets.
Create (or reuse) an API secret and copy its value.
The Firebase App ID and API secret will be different for your iOS and Android apps, so repeat these steps for each platform.
The app instance ID uniquely identifies a specific installation of a Firebase app. This value needs to be retrieved from the Firebase SDK. After collecting this ID, pass it to linkrunner.signup so that Linkrunner can associate GA4 app instance IDs with installs and campaigns.Use the following examples to pass the app instance ID:
Android (Kotlin)
iOS (Swift)
React Native
Flutter
Copy
import com.google.firebase.analytics.FirebaseAnalyticsimport io.linkrunner.sdk.LinkRunnerimport io.linkrunner.sdk.models.request.UserDataRequestimport kotlinx.coroutines.CoroutineScopeimport kotlinx.coroutines.Dispatchersimport kotlinx.coroutines.launchprivate fun onSignup() { CoroutineScope(Dispatchers.IO).launch { try { val firebaseAnalytics = FirebaseAnalytics.getInstance(context) val appInstanceId = firebaseAnalytics.appInstanceId.await() // suspend extension from Kotlin coroutines val userData = UserDataRequest( id = "123", // Your user ID // ...other user fields gaAppInstanceId = appInstanceId, // GA4 app instance ID ) LinkRunner.getInstance().signup( userData = userData ) } catch (e: Exception) { println("Error during signup with GA4 app instance ID: ${e.message}") } }}
Copy
import FirebaseAnalyticsimport Linkrunnerfunc onSignup() async { do { let appInstanceId = try await Analytics.appInstanceID() let userData = UserData( id: "123", // Your user ID // ...other user fields gaAppInstanceId: appInstanceId // GA4 app instance ID ) try await LinkrunnerSDK.shared.signup( userData: userData ) } catch { print("Error during signup with GA4 app instance ID:", error) }}
Copy
import analytics from "@react-native-firebase/analytics";import linkrunner from "rn-linkrunner";const onSignup = async () => { try { const gaAppInstanceId = await analytics().getAppInstanceId(); await linkrunner.signup({ user_data: { id: "123", // Your user ID // ...other user fields ga_app_instance_id: gaAppInstanceId, // GA4 app instance ID }, data: {}, }); } catch (error) { console.error("Error during signup with GA4 app instance ID:", error); }};
Copy
import 'package:firebase_analytics/firebase_analytics.dart';import 'package:linkrunner/main.dart';Future<void> onSignup() async { try { final analytics = FirebaseAnalytics.instance; final gaAppInstanceId = await analytics.appInstanceId; await LinkRunner().signup( userData: LRUserData( id: '123', // Your user ID // ...other user fields gaAppInstanceId: gaAppInstanceId, // GA4 app instance ID ), data: {}, ); } catch (e) { print('Error during signup with GA4 app instance ID: $e'); }}
The GA4 session ID uniquely identifies a session of a Firebase app. Similar to the app instance ID, this value is retrieved from the Firebase SDK and should be passed to linkrunner.signup so that session-level engagement can be connected to installs and campaigns.Use the following examples to pass the session ID (for example, ga_session_id or gaSessionId, depending on the SDK’s naming convention):
Android (Kotlin)
iOS (Swift)
React Native
Flutter
Copy
import com.google.firebase.analytics.FirebaseAnalyticsimport io.linkrunner.sdk.LinkRunnerimport io.linkrunner.sdk.models.request.UserDataRequestimport kotlinx.coroutines.CoroutineScopeimport kotlinx.coroutines.Dispatchersimport kotlinx.coroutines.launchprivate fun onSignup() { CoroutineScope(Dispatchers.IO).launch { try { val firebaseAnalytics = FirebaseAnalytics.getInstance(context) val sessionId = /* Retrieve GA4 session ID from your tracking layer */ val userData = UserDataRequest( id = "123", // Your user ID // ...other user fields gaSessionId = sessionId, // GA4 session ID ) LinkRunner.getInstance().signup( userData = userData ) } catch (e: Exception) { println("Error during signup with GA4 session ID: ${e.message}") } }}
Copy
import Linkrunnerfunc onSignup() async { do { let gaSessionId = /* Retrieve GA4 session ID from your tracking layer */ let userData = UserData( id: "123", // Your user ID // ...other user fields gaSessionId: gaSessionId // GA4 session ID ) try await LinkrunnerSDK.shared.signup( userData: userData ) } catch { print("Error during signup with GA4 session ID:", error) }}
Copy
import analytics from "@react-native-firebase/analytics";import linkrunner from "rn-linkrunner";const onSignup = async () => { try { const gaSessionId = await analytics().getSessionId(); await linkrunner.signup({ user_data: { id: "123", // Your user ID // ...other user fields ga_session_id: gaSessionId, // GA4 session ID }, data: {}, }); } catch (error) { console.error("Error during signup with GA4 session ID:", error); }};
Copy
import 'package:firebase_analytics/firebase_analytics.dart';import 'package:linkrunner/main.dart';Future<void> onSignup() async { try { final analytics = FirebaseAnalytics.instance; int? sessionId = await analytics.getSessionId(); await LinkRunner().signup( userData: LRUserData( id: '123', // Your user ID // ...other user fields gaSessionId: sessionId, // GA4 session ID ), data: {}, ); } catch (e) { print('Error during signup with GA4 session ID: $e'); }}
The Traffic acquisition report helps you understand where your app visitors are coming from. You can find this under Reports > Lifecycle > Acquisition > Traffic acquisition. For more information on the Traffic acquisition report, see the Google documentation.
BigQuery data is visible as soon as the event is received by GA4, while it can take 24–48 hours for data to reflect in GA4 reports. Read more here.