Qué vas a construir
Al terminar este tutorial, tu app de React Native atribuirá las compras dentro de la app a los afiliados que las generaron. Cuando un usuario haga clic en un enlace de afiliado, abra tu app y haga una compra, la transacción aparecerá en tu panel de Insert Affiliate con el afiliado correcto acreditado y la comisión calculada.
La integración usa el paquete insert-affiliate-react-native-sdk y toma unos 30 minutos.
Requisitos previos
- React Native 0.60 o posterior
- iOS 13.0+ / Android API 21+
- Un Company Code de tu panel de Insert Affiliate (página de Configuración)
- Una plataforma de verificación de compras configurada (este tutorial usa RevenueCat, pero el SDK también es compatible con Adapty, Apphud, Iaptic, App Store directo y Google Play directo)
Paso 1: instala el SDK
Instala el SDK de Insert Affiliate y las dependencias peer que requiere:
npm install insert-affiliate-react-native-sdk
npm install @react-native-async-storage/async-storage @react-native-clipboard/clipboard @react-native-community/netinfo react-native-device-info axiosPara proyectos bare de React Native, instala los pods de iOS:
cd ios && pod install && cd ..Para el flujo administrado de Expo, omite la instalación de pods. Los pods se instalan automáticamente cuando ejecutas npx expo prebuild o npx expo run:ios.
Paso 2: envuelve tu app con el provider
El SDK usa React Context para administrar el estado. Envuelve tu app con DeepLinkIapProvider en tu archivo de entrada (index.js):
import React from 'react';
import { AppRegistry } from 'react-native';
import App from './App';
import { name as appName } from './app.json';
import { DeepLinkIapProvider } from 'insert-affiliate-react-native-sdk';
const RootComponent = () => {
return (
);
};
AppRegistry.registerComponent(appName, () => RootComponent);Paso 3: inicializa el SDK
En tu App.tsx, llama a initialize() con tu Company Code:
import React, { useEffect } from 'react';
import { useDeepLinkIapProvider } from 'insert-affiliate-react-native-sdk';
const App = () => {
const { initialize, isInitialized } = useDeepLinkIapProvider();
useEffect(() => {
if (!isInitialized) {
initialize(
"YOUR_COMPANY_CODE",
true, // verbose logging (disable in production)
true, // enable Insert Links
false // clipboard attribution
);
}
}, [initialize, isInitialized]);
return ;
};Cuando la inicialización se complete correctamente, verás esto en tu consola:
[Insert Affiliate] SDK initialized with company code: YOUR_COMPANY_CODEPaso 4: conecta con RevenueCat
Este es el paso crítico que une la atribución de afiliados con el seguimiento de compras. Cuando el SDK detecta un identificador de afiliado (de un deep link o un short code), se lo pasas a RevenueCat como atributo de suscriptor:
import React, { useEffect } from 'react';
import { AppState } from 'react-native';
import Purchases from 'react-native-purchases';
import { useDeepLinkIapProvider } from 'insert-affiliate-react-native-sdk';
const App = () => {
const {
initialize,
isInitialized,
setInsertAffiliateIdentifierChangeCallback,
isAffiliateAttributionValid,
getAffiliateExpiryTimestamp
} = useDeepLinkIapProvider();
useEffect(() => {
if (!isInitialized) {
initialize("YOUR_COMPANY_CODE", true, true, false);
}
}, [initialize, isInitialized]);
useEffect(() => {
setInsertAffiliateIdentifierChangeCallback(async (identifier, offerCode) => {
if (identifier) {
await Purchases.setAttributes({
"insert_affiliate": identifier,
"affiliateOfferCode": offerCode || "",
"insert_timedout": ""
});
await Purchases.syncAttributesAndOfferingsIfNeeded();
}
});
return () => setInsertAffiliateIdentifierChangeCallback(null);
}, [setInsertAffiliateIdentifierChangeCallback]);
useEffect(() => {
if (!isInitialized) return;
const clearExpiredAffiliation = async () => {
const isValid = await isAffiliateAttributionValid();
if (!isValid) {
const expiryTimestamp = await getAffiliateExpiryTimestamp();
if (!expiryTimestamp) return;
await Purchases.setAttributes({
"affiliateOfferCode": "",
"insert_timedout": expiryTimestamp.toString()
});
await Purchases.syncAttributesAndOfferingsIfNeeded();
}
};
clearExpiredAffiliation();
const subscription = AppState.addEventListener('change', (state) => {
if (state === 'active') {
clearExpiredAffiliation();
}
});
return () => subscription?.remove();
}, [isInitialized, isAffiliateAttributionValid, getAffiliateExpiryTimestamp]);
return ;
};El callback se ejecuta cada vez que cambia el identificador de afiliado. El atributo insert_timedout guarda la marca de tiempo de vencimiento para que el webhook pueda comparar las fechas de compra con la ventana de atribución.
Paso 5: configura el webhook de RevenueCat
- En RevenueCat, crea un nuevo webhook.
- Define la URL del webhook como
https://api.insertaffiliate.com/v1/api/revenuecat-webhook. - Define el tipo de evento como "All events".
- En la Configuración de tu panel de Insert Affiliate, define RevenueCat como método de verificación de compras dentro de la app.
- Copia el valor de RevenueCat Webhook Authentication Header desde el panel de Insert Affiliate.
- Pégalo en el campo del encabezado Authorization en la configuración del webhook de RevenueCat.
Paso 6: configura el deep linking (iOS)
Actualiza tu ios/YourApp/AppDelegate.mm para manejar las URL entrantes:
#import
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler
{
return [RCTLinkingManager application:application
continueUserActivity:userActivity
restorationHandler:restorationHandler];
} Agrega tu esquema de URL de iOS a Info.plist y, para Universal Links, agrega applinks:insertaffiliate.link a Associated Domains en Xcode.
Paso 7: configura el deep linking (Android)
Agrega un intent filter a tu activity principal en android/app/src/main/AndroidManifest.xml:
Para Android App Links, agrega un segundo intent filter con android:autoVerify="true" y android:host="insertaffiliate.link". Define android:launchMode="singleTop" en tu activity.
Paso 8: maneja Expo Router (si aplica)
Si usas Expo Router, crea app/+native-intent.tsx para evitar conflictos de rutas:
export function redirectSystemPath({ path }: { path: string }): string | null {
if (path.includes('insert-affiliate') || path.includes('insertAffiliate')) {
return null;
}
return path;
}Paso 9: prueba la integración
Crea un afiliado de prueba en tu panel de Insert Affiliate usando un alias de correo (por ejemplo, [email protected]). Luego prueba el deep link:
# iOS Simulator
xcrun simctl openurl booted "https://insertaffiliate.link/YOUR_COMPANY_CODE/TEST_SHORT_CODE"
# Android Emulator
adb shell am start -a android.intent.action.VIEW -d "https://insertaffiliate.link/YOUR_COMPANY_CODE/TEST_SHORT_CODE"Verifica que el identificador de afiliado quedó guardado revisando los logs de la consola, luego haz una compra en sandbox y confirma que la transacción aparece en tu panel.
Cómo usar otras plataformas de verificación de compras
Si usas Adapty en lugar de RevenueCat, el callback del identificador define un atributo personalizado mediante adapty.updateProfile(). Para Iaptic, llama a validatePurchaseWithIapticAPI() desde el SDK. Para la integración directa con App Store, llama a returnUserAccountTokenAndStoreExpectedTransaction() antes de cada compra. Para Google Play directo, llama a storeExpectedStoreTransaction() con el token de compra después de cada compra.
Los pasos de deep linking y de inicialización del SDK son los mismos sin importar qué plataforma de verificación de compras elijas.
Funciones avanzadas
Cuando la integración básica esté funcionando, considera agregar:
- Short codes: permite que los afiliados compartan códigos como "SAVE20" que los usuarios ingresan en tu app. Llama a
setShortCode(code)para validarlo y guardarlo. - Códigos de oferta dinámicos: configura modificadores de códigos de oferta en el panel y usa
OfferCodedel SDK para construir ID de producto dinámicos. - Seguimiento de eventos: registra eventos personalizados, como los registros de usuarios, con
trackEvent('user_signup')para estructuras de comisiones que van más allá de las compras. - Tiempo límite de atribución: define un límite de tiempo para la vigencia de la atribución de afiliado, por ejemplo 7 días (604,800 segundos).
- Evitar la transferencia de afiliado: bloquea la primera atribución de afiliado para que los clics posteriores en otros enlaces no puedan sobrescribirla.
