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.

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

ClaveValor
unolink_click_idEl ID del clic, por ejemplo clk_01JA…. Siempre presente en las instalaciones de Unolink.
unolink_linkLa 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_contentLas etiquetas UTM del enlace que tocó la persona, cuando las hay.
unolink_deep_linkEl 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:

  1. Sube una build a Google Play Console → Pruebas → Pruebas internas y añádete como tester.
  2. 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.
  3. 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.