Skip to content

docs: add cross-platform integration snippets #1030

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: adding-code-examples-integrations
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions code_blocks/integrations/attribution/adjust_4.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import com.adjust.sdk.Adjust
import com.adjust.sdk.AdjustConfig
import com.revenuecat.purchases.Purchases

Purchases.configure(this, "public_sdk_key")

// Automatically collect the $gpsAdId and $ip values
Purchases.sharedInstance.collectDeviceIdentifiers()

// Set the Adjust Id on app launch if it exists
Adjust.getAdid()?.let {
Purchases.sharedInstance.setAdjustID(it)
}

// IMPORTANT: Set the Adjust Id when it becomes available, if it didn't exist on app launch
val config = AdjustConfig(this, "yourAppToken", AdjustConfig.ENVIRONMENT_SANDBOX)
config.onAttributionChangedListener = { attribution ->
Purchases.sharedInstance.collectDeviceIdentifiers()
Purchases.sharedInstance.setAdjustID(attribution.adid)
}
16 changes: 16 additions & 0 deletions code_blocks/integrations/attribution/adjust_5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import Purchases from 'react-native-purchases';
import { Adjust } from 'react-native-adjust';

Purchases.configure({ apiKey: 'public_sdk_key' });
Purchases.collectDeviceIdentifiers();

Adjust.getAdid().then(adid => {
if (adid) {
Purchases.setAdjustID(adid);
}
});

Adjust.addAttributionChangedListener(attribution => {
Purchases.collectDeviceIdentifiers();
Purchases.setAdjustID(attribution.adid);
});
17 changes: 17 additions & 0 deletions code_blocks/integrations/attribution/adjust_6.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:adjust_sdk/adjust.dart';
import 'package:purchases_flutter/purchases_flutter.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
await Purchases.collectDeviceIdentifiers();

final adid = await Adjust.getAdid();
if (adid != null) {
await Purchases.setAdjustID(adid);
}

Adjust.addAttributionChangedListener((attribution) {
Purchases.collectDeviceIdentifiers();
Purchases.setAdjustID(attribution.adid);
});
}
10 changes: 10 additions & 0 deletions code_blocks/integrations/attribution/apple-search-ads_7.js.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import Purchases from 'react-native-purchases';
import { requestTrackingPermission } from 'react-native-tracking-transparency';

async function setupAppleSearchAds() {
await Purchases.configure({ apiKey: 'public_sdk_key' });
const status = await requestTrackingPermission();
if (status === 'authorized') {
await Purchases.enableAdServicesAttributionTokenCollection();
}
}
10 changes: 10 additions & 0 deletions code_blocks/integrations/attribution/apple-search-ads_8.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:app_tracking_transparency/app_tracking_transparency.dart';

Future<void> setupAppleSearchAds() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
final status = await AppTrackingTransparency.requestTrackingAuthorization();
if (status == TrackingStatus.authorized) {
await Purchases.enableAdServicesAttributionTokenCollection();
}
}
28 changes: 28 additions & 0 deletions code_blocks/integrations/attribution/appsflyer_3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import Purchases from 'react-native-purchases';
import appsFlyer from 'react-native-appsflyer';

async function initRevenueCatAndAppsFlyer() {
// 1. Configure RevenueCat first
await Purchases.configure({ apiKey: 'public_sdk_key' });

// 2. Collect device identifiers: $gpsAdId, $ip (automatically handles platform-specifics)
await Purchases.collectDeviceIdentifiers();

// 3. Initialize AppsFlyer before retrieving UID
appsFlyer.initSdk(
{
devKey: 'your_af_dev_key',
isDebug: false,
appId: 'your_ios_app_id', // required only for iOS
},
(result) => console.log('AppsFlyer initialized:', result),
(error) => console.error('AppsFlyer init error:', error)
);

// 4. Get the AppsFlyer ID and set it to RevenueCat
appsFlyer.getAppsFlyerUID((err, uid) => {
if (!err && uid) {
Purchases.setAppsflyerId(uid);
}
});
}
13 changes: 13 additions & 0 deletions code_blocks/integrations/attribution/appsflyer_4.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:appsflyer_sdk/appsflyer_sdk.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
Purchases.collectDeviceIdentifiers();

final appsflyerSdk = AppsFlyerSdk(AppsFlyerOptions(afDevKey: 'afDevKey', appId: '123'));
final uid = await appsflyerSdk.getAppsFlyerUID();
if (uid != null) {
await Purchases.setAppsflyerId(uid);
}
}
11 changes: 11 additions & 0 deletions code_blocks/integrations/attribution/branch_1.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:flutter_branch_sdk/flutter_branch_sdk.dart';
import 'package:purchases_flutter/purchases_flutter.dart';

// login
FlutterBranchSdk.setIdentity('my_app_user_id');

// Optional: Use a different App User ID between Branch and RevenueCat
Purchases.setAttributes({'\$branchId': '<custom_branch_user_id>'});

// logout
FlutterBranchSdk.logout();
11 changes: 11 additions & 0 deletions code_blocks/integrations/attribution/branch_1.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import io.branch.referral.Branch
import com.revenuecat.purchases.Purchases

// login
Branch.getInstance().setIdentity("my_app_user_id")

// Optional: Use a different App User ID between Branch and RevenueCat
Purchases.sharedInstance.setAttributes(mapOf("\$branchId" to "<custom_branch_user_id>"))

// logout
Branch.getInstance().logout()
6 changes: 6 additions & 0 deletions code_blocks/integrations/attribution/branch_5.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import 'package:purchases_flutter/purchases_flutter.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
await Purchases.collectDeviceIdentifiers();
}
7 changes: 7 additions & 0 deletions code_blocks/integrations/attribution/facebook-ads_5.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:facebook_app_events/facebook_app_events.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
FacebookAppEvents().activateApp();
}
7 changes: 7 additions & 0 deletions code_blocks/integrations/attribution/facebook-ads_5.js.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Purchases from 'react-native-purchases';
import { AppEventsLogger } from 'react-native-fbsdk-next';

async function init() {
await Purchases.configure({ apiKey: 'public_sdk_key' });
AppEventsLogger.activateApp();
}
12 changes: 12 additions & 0 deletions code_blocks/integrations/attribution/facebook-ads_5.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import android.app.Application
import com.facebook.appevents.AppEventsLogger
import com.revenuecat.purchases.Purchases
import com.revenuecat.purchases.PurchasesConfiguration

class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Purchases.configure(PurchasesConfiguration.Builder(this, "public_sdk_key").build())
AppEventsLogger.activateApp(this)
}
}
8 changes: 8 additions & 0 deletions code_blocks/integrations/attribution/kochava_1.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import KochavaTracker
import Purchases

Purchases.configure(withAPIKey: "public_sdk_key")

Tracker.shared.retrieveDeviceId { deviceId in
Purchases.shared.attribution.setKochavaDeviceId(deviceId)
}
7 changes: 7 additions & 0 deletions code_blocks/integrations/attribution/kochava_3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Purchases from 'react-native-purchases';
import KochavaTracker from 'react-native-kochava-tracker';

Purchases.configure({ apiKey: 'public_sdk_key' });

const deviceId = await KochavaTracker.getInstallId();
Purchases.setKochavaDeviceId(deviceId);
9 changes: 9 additions & 0 deletions code_blocks/integrations/attribution/kochava_4.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'package:kochava_tracker/kochava_tracker.dart';
import 'package:purchases_flutter/purchases_flutter.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));

final deviceId = await KochavaTracker.instance.getInstallId();
await Purchases.setKochavaDeviceId(deviceId);
}
4 changes: 4 additions & 0 deletions code_blocks/integrations/attribution/singular_3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import Purchases from 'react-native-purchases';

Purchases.configure({ apiKey: 'public_sdk_key' });
Purchases.collectDeviceIdentifiers();
6 changes: 6 additions & 0 deletions code_blocks/integrations/attribution/singular_4.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import 'package:purchases_flutter/purchases_flutter.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
await Purchases.collectDeviceIdentifiers();
}
5 changes: 5 additions & 0 deletions code_blocks/integrations/attribution/tenjin_3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Purchases from 'react-native-purchases';

Purchases.configure({ apiKey: 'public_sdk_key' });
Purchases.collectDeviceIdentifiers();
Purchases.setTenjinAnalyticsInstallationID(tenjinAnalyticsId);
7 changes: 7 additions & 0 deletions code_blocks/integrations/attribution/tenjin_4.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import 'package:purchases_flutter/purchases_flutter.dart';

Future<void> init() async {
await Purchases.configure(PurchasesConfiguration('public_sdk_key'));
await Purchases.collectDeviceIdentifiers();
await Purchases.setTenjinAnalyticsInstallationID(tenjinAnalyticsId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:airship_flutter/airship_flutter.dart';

Future<void> setAirshipChannel() async {
await Purchases.configure(
PurchasesConfiguration('public_sdk_key')..appUserId = 'my_app_user_id',
);

// Airship is configured in native code with your app key
final channelId = await Airship.channelId;
await Purchases.setAirshipChannelId(channelId);
}
13 changes: 13 additions & 0 deletions code_blocks/integrations/third-party-integrations/airship_1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import Purchases from '@revenuecat/purchases-react-native';
import Airship from 'urbanairship-react-native';

async function setAirshipChannel() {
await Purchases.configure({
apiKey: 'public_sdk_key',
appUserID: 'my_app_user_id',
});

// Airship is configured in native code with your app key
const channelId = await Airship.getChannelId();
await Purchases.setAirshipChannelID(channelId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:airship_flutter/airship_flutter.dart';

Future<void> identifyAirshipUser() async {
await Purchases.configure(
PurchasesConfiguration('public_sdk_key')..appUserId = 'my_app_user_id',
);
await Airship.identify('my_app_user_id');
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Purchases from '@revenuecat/purchases-react-native';
import Airship from 'urbanairship-react-native';

async function identifyAirshipUser() {
await Purchases.configure({ apiKey: 'public_sdk_key', appUserID: 'my_app_user_id' });
await Airship.identify('my_app_user_id');
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:amplitude_flutter/amplitude.dart';

Future<void> setup() async {
await Purchases.configure(
PurchasesConfiguration('public_sdk_key')..appUserId = 'my_app_user_id',
);
final amplitude = Amplitude.getInstance(instanceName: 'default');
await amplitude.init('amplitude_api_key', 'my_app_user_id');
final deviceId = await amplitude.getDeviceId();
await Purchases.setAttributes({'\$amplitudeDeviceId': deviceId});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import com.amplitude.api.Amplitude
import com.revenuecat.purchases.Purchases

// Configure Purchases SDK
Purchases.configure(this, "public_sdk_key", appUserID = "my_app_user_id")

// Configure Amplitude SDK
val amplitude = Amplitude.getInstance()
amplitude.initialize(this, "amplitude_api_key")
amplitude.userId = "my_app_user_id"

// Optional User Alias Object attributes
Purchases.sharedInstance.setAttributes(mapOf("\$amplitudeDeviceId" to amplitude.deviceId))
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import Purchases from '@revenuecat/purchases-react-native';
import { init, setUserId, getDeviceId } from '@amplitude/analytics-react-native';

async function setup() {
await Purchases.configure({ apiKey: 'public_sdk_key', appUserID: 'my_app_user_id' });
await init('amplitude_api_key');
setUserId('my_app_user_id');
const deviceId = await getDeviceId();
await Purchases.setAttributes({ '$amplitudeDeviceId': deviceId });
}
13 changes: 13 additions & 0 deletions code_blocks/integrations/third-party-integrations/braze_1.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:braze_plugin/braze_plugin.dart';

Future<void> init() async {
await Purchases.configure(
PurchasesConfiguration('public_sdk_key')..appUserID = 'my_app_user_id',
);
BrazePlugin.changeUser('my_app_user_id');
await Purchases.setAttributes({
'\$brazeAliasName': 'name',
'\$brazeAliasLabel': 'label',
});
}
17 changes: 17 additions & 0 deletions code_blocks/integrations/third-party-integrations/braze_1.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import android.app.Application
import com.braze.Braze
import com.revenuecat.purchases.Purchases

class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
Purchases.configure(this, "public_sdk_key", appUserID = "my_app_user_id")
Braze.getInstance(applicationContext).changeUser("my_app_user_id")
Purchases.sharedInstance.attribution.setAttributes(
mapOf(
"\$brazeAliasName" to "name",
"\$brazeAliasLabel" to "label"
)
)
}
}
10 changes: 10 additions & 0 deletions code_blocks/integrations/third-party-integrations/braze_1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import Purchases from 'react-native-purchases';
import braze from '@braze/react-native-sdk';

Purchases.configure({ apiKey: 'public_sdk_key', appUserID: 'my_app_user_id' });
braze.changeUser('my_app_user_id');

Purchases.setAttributes({
'$brazeAliasName': 'name',
'$brazeAliasLabel': 'label',
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:clevertap_plugin/clevertap_plugin.dart';

Future<void> syncCleverTapId() async {
await Purchases.configure(
PurchasesConfiguration('public_sdk_key')..appUserId = 'my_app_user_id',
);
final cleverTapId = await CleverTapPlugin.profileGetCleverTapID();
await Purchases.setAttributes({'\$cleverTapId': cleverTapId});
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import Purchases from '@revenuecat/purchases-react-native';
import CleverTap from 'clevertap-react-native';

async function syncCleverTapId() {
await Purchases.configure({ apiKey: 'public_sdk_key', appUserID: 'my_app_user_id' });
const cleverTapId = await CleverTap.getCleverTapID();
await Purchases.setAttributes({ '$cleverTapId': cleverTapId });
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:purchases_flutter/purchases_flutter.dart';
import 'package:customer_io/customer_io.dart';

Future<void> setupRevenueCatWithCustomerIo() async {
// Configure RevenueCat first
final configuration = PurchasesConfiguration('public_sdk_key')
..appUserId = 'your_app_user_id';
await Purchases.configure(configuration);

// Ensure Customer.io is initialized and identify has been called
final customerIoId = CustomerIO.instance.profileIdentifier;

if (customerIoId != null) {
await Purchases.setAttributes({'\$customerioId': customerIoId});
}
}

Loading