Deep links diferidos en Android
Cuando alguien en Android abre tu enlace de Unolink, Unolink lo envía a Google Play y adjunta un referrer. Después de instalar y abrir tu app, Google Play le pasa ese referrer a la app. Te dice de qué enlace vino la persona, además del deep link y los parámetros que pusiste en ese enlace. Esta página lo hace a mano, sin el SDK de Unolink, en todos los planes. Con el SDK es un solo listener.
1. Dale un deep link al enlace
En el panel, abre tu app, ve a Enlaces y elige ⋯ → Editar en un enlace. Configura:
- Enlace profundo: dónde debe abrirse la app, como ruta (
/promo/3for2) o como URI (myapp://promo/3for2). - Parámetros (opcional): hasta diez pares nombre/valor, por ejemplo
offer=3for2.
Los cambios se aplican a los clics nuevos en segundos.
2. Añade la biblioteca Install Referrer
// app/build.gradle.kts
dependencies {
implementation("com.android.installreferrer:installreferrer:2.2")
}
3. Lee el referrer una vez, en el primer inicio
Kotlin:
import android.content.Context
import android.net.Uri
import com.android.installreferrer.api.InstallReferrerClient
import com.android.installreferrer.api.InstallReferrerStateListener
fun readUnolinkReferrer(context: Context, onLink: (deepLink: String?, params: Map<String, String>) -> Unit) {
val prefs = context.getSharedPreferences("unolink", Context.MODE_PRIVATE)
if (prefs.getBoolean("referrer_read", false)) return
val client = InstallReferrerClient.newBuilder(context).build()
client.startConnection(object : InstallReferrerStateListener {
override fun onInstallReferrerSetupFinished(code: Int) {
if (code == InstallReferrerClient.InstallReferrerResponse.OK) {
val referrer = client.installReferrer.installReferrer
val query = Uri.parse("https://unolink.invalid/?$referrer")
if (query.getQueryParameter("unolink_click_id") != null) {
val params = query.queryParameterNames
.filter { it.startsWith("unolink_p_") }
.associate { it.removePrefix("unolink_p_") to query.getQueryParameter(it).orEmpty() }
onLink(query.getQueryParameter("unolink_deep_link"), params)
}
}
prefs.edit().putBoolean("referrer_read", true).apply()
client.endConnection()
}
override fun onInstallReferrerServiceDisconnected() = Unit
})
}
Java:
InstallReferrerClient client = InstallReferrerClient.newBuilder(context).build();
client.startConnection(new InstallReferrerStateListener() {
@Override public void onInstallReferrerSetupFinished(int code) {
if (code == InstallReferrerClient.InstallReferrerResponse.OK) {
try {
String referrer = client.getInstallReferrer().getInstallReferrer();
Uri query = Uri.parse("https://unolink.invalid/?" + referrer);
String clickId = query.getQueryParameter("unolink_click_id");
String deepLink = query.getQueryParameter("unolink_deep_link");
// Route to deepLink if clickId != null; parameters are unolink_p_<name>.
} catch (RemoteException e) {
// Play Store unavailable: try again on the next launch.
}
}
client.endConnection();
}
@Override public void onInstallReferrerServiceDisconnected() { }
});
React Native o Expo (solo Android), con react-native-device-info:
import DeviceInfo from "react-native-device-info"
const referrer = await DeviceInfo.getInstallReferrer() // e.g. "unolink_click_id=clk_…&unolink_deep_link=%2Fpromo"
const query = new URLSearchParams(referrer)
const deepLink = query.get("unolink_click_id") ? query.get("unolink_deep_link") : null
Llámalo una vez después del primer inicio y recuerda que ya lo hiciste. Google Play guarda el referrer durante 90 días después de la instalación, así que una segunda lectura devuelve los mismos valores: no abras el deep link dos veces.
Con el SDK (0.3.3+), eso ya está resuelto: el enlace espera en el dispositivo hasta
que lo consumas, aunque la app se cierre entretanto (hasta 30 días), así que puedes abrirlo después del onboarding o del
inicio de sesión y llamar a consumeDeferredDeepLink() cuando lo hayas hecho.
Qué contiene el referrer
| Clave | Valor |
|---|---|
unolink_click_id | El ID del clic, por ejemplo clk_01JA…. Siempre presente en las instalaciones de Unolink. |
unolink_link | La ruta del enlace de campaña, por ejemplo tiktok. Ausente para el enlace principal de tu app. |
utm_source, utm_medium, utm_campaign, utm_term, utm_content | Las etiquetas UTM del enlace que tocó la persona, cuando las hay. |
unolink_deep_link | El deep link del enlace. |
unolink_p_<name> | Cada uno de los parámetros del enlace. |
El referrer está limitado a 1000 caracteres. Si el deep link y los parámetros de un enlace son más largos, primero se quitan los parámetros y luego el deep link. La consulta de clics siempre devuelve todo.
Si tu URL de Google Play en Unolink ya tiene su propio referrer=, Unolink lo deja como está y no añade nada.
Las instalaciones que no llegaron a través de Unolink no tienen unolink_click_id. En ese caso Google Play informa algo como
utm_source=google-play&utm_medium=organic.
Opcional: consultar el clic
Con una clave de API (plan Pro y superiores), envía el ID de clic a Unolink para obtener el deep link y los parámetros actuales del enlace, aunque fueran demasiado largos para el referrer o hayan cambiado después del clic:
curl https://api.unolink.dev/v1/clicks/clk_01JA… -H "X-Unolink-Key: ulk_…"
Consulta la referencia de la API del SDK.
Probarlo
Google Play solo pasa un referrer en las instalaciones desde Google Play, así que prueba con una instalación real:
- Sube una build a Google Play Console → Pruebas → Pruebas internas y añádete como tester.
- En el teléfono, desinstala la app, luego abre tu enlace de Unolink (por ejemplo
go.unolink.dev/yourapp/test) e instala desde la ficha de Play que se abre. - Abre la app. El referrer debería contener tu
unolink_click_id, y el callback del deep link debería ejecutarse.
Para probar tu código de análisis sin instalar, pásale una cadena como
unolink_click_id=clk_01JA0000000000000000000000&unolink_deep_link=%2Fpromo%2F3for2.
iPhone
No hay deep link diferido en iPhone. Apple no tiene referrer de instalación, y las alternativas dependen del fingerprinting, algo que Unolink nunca hace. Los visitantes de iPhone siguen yendo directamente al App Store, y sus clics se cuentan.
Contar lo que pasa después de la instalación es otra cosa: con el SDK de Unolink, las instalaciones, el onboarding, las vistas del paywall, las pruebas y las compras en iPhone se cuentan, igual que en Android, y el panel asocia las instalaciones en iPhone al enlace del que vinieron, sin fingerprinting. Lo que iPhone no puede hacer es pasarle el enlace a tu app la primera vez que se abre. Para las cifras de descargas por campaña de la propia Apple en App Store Connect, configura el token de proveedor del App Store en tu app.