Deferred deep linking sin SDK: cómo funciona realmente por dentro
Puedes llevar el contexto de un enlace a través de una instalación sin incrustar un SDK de atribución. Esto es lo que sobrevive a la frontera de la tienda en Android e iOS, lo que se rompe y el coste en privacidad de cada alternativa.
El contexto muere en la frontera de la tienda
Alguien toca un enlace a /product/42. La app no está instalada, así que tu redirección lo envía a la tienda. Instala, abre la app y aterriza en una pantalla de inicio genérica. La petición HTTP que llevaba su intención terminó en la ficha de la tienda: la app recién instalada arranca sin URL, sin cookie, sin referrer. Nada del clic sobrevivió.
Llevar ese contexto a través de la instalación es el deferred deep linking, y la respuesta estándar es "incrusta un SDK de MMP". Muchos equipos no quieren esa respuesta — el hilo 772811 de los Apple Developer Forums es uno de tantos preguntando cómo hacerlo sin SDK de terceros — y la audiencia creció en agosto de 2026, cuando AppsFlyer sacó el deferred deep linking de su plan gratuito. ¿Se puede construir? En Android, sí, de forma limpia y oficial. En iOS, más o menos, con soluciones que tienen costes reales.
Una nota de alcance: qué es el deferred deep linking y cuándo compensa lo cubrimos en otro artículo. Este post trata solo de la fontanería: qué transporte puede pasar un token a través de una instalación y cuánto puedes fiarte de cada uno.
Qué sobrevive a la instalación y qué no
Android: la Install Referrer API es la buena noticia honesta
Google Play lo resuelve de forma nativa. La URL de la tienda acepta un parámetro referrer, Play guarda esa cadena junto a la instalación y la app la lee literal tras el primer arranque mediante la Install Referrer API. Ese es todo el mecanismo: sin fingerprinting, sin portapapeles, sin adivinar.
No es exactamente "cero código": leer el valor requiere la librería com.android.installreferrer, un artefacto pequeño que habla localmente con la app de Play Store. No hace llamadas de red a nadie ni es un SDK de analítica; no añade nada a tus declaraciones de privacidad más allá de lo que hagas con la cadena.
Qué poner en el parámetro es cosa tuya: un ID de enlace, una campaña, un destino codificado. Mantenlo corto y URL-encoded — el referrer en play.google.com/store/apps/details?id=com.example&referrer=tok_8f2 vuelve exactamente como se envió.
El ciclo completo, de extremo a extremo
- 1Al tocar el enlace, tu redirección añade referrer=<token> a la URL de Play; el token apunta al contexto del clic guardado en tu servidor.
- 2En el primer arranque, la app conecta un InstallReferrerClient y lee la cadena installReferrer.
- 3La app intercambia el token en tu API por el contexto guardado — ruta del deep link, campaña — y enruta al usuario.
- 4Tu servidor marca el token como consumido. La cadena persiste en el dispositivo, así que el uso único debe vivir en el servidor.
Los límites son estrechos y predecibles: la API solo cubre instalaciones hechas a través de Google Play. Sideloads, Huawei AppGallery y otras tiendas no llevan referrer de Play, y el valor debe leerse una vez poco después del primer arranque.
Los enlaces de Appy ya resuelven la mitad de Android
Desde septiembre de 2026, cada enlace de Appy que lleva a alguien a una ficha de Google Play añade el parámetro referrer por su cuenta. No hay nada que configurar ni SDK que añadir. El referrer siempre lleva appy_slug, el slug del enlace que se tocó, así que la app sabe qué enlace trajo la instalación. Esta parte funciona en todos los planes, Free incluido.
Si el enlace tiene activado el reenvío de parámetros, la query string del toque también entra en el referrer. Un QR que apunta a appy.to/summer?screen=product-42&utm_source=poster llega a la primera apertura como la cadena de abajo. Para esto no guardamos nada de nuestro lado ni emparejamos nada a ojo.
- Escaneado o tocado
- https://appy.to/summer?screen=product-42&utm_source=poster
- Enviado a Google Play
- https://play.google.com/store/apps/details?id=com.example.app&referrer=appy_slug%3Dsummer%26screen%3Dproduct-42%26utm_source%3Dposter&screen=product-42&utm_source=poster
- Lo que lee la app en el primer arranque
- appy_slug=summer&screen=product-42&utm_source=poster
El ajuste en el panel
El reenvío de parámetros es un interruptor por enlace en el plan Business. Al crear un enlace aparece como “Activar el reenvío de parámetros”; en un enlace existente el mismo ajuste se llama “Reenviar parámetros entrantes”. Si está apagado, el referrer sigue llevando appy_slug y nada más.
Algunas reglas que conviene saber. Lo que hayas escrito tú en la URL de Play manda: si el destino ya contiene referrer=utm_source%3Dposter, Appy conserva ese valor y añade appy_slug al lado. appy_slug no se puede sobrescribir desde la query string, así que un enlace no puede quedarse con las instalaciones de otro. Y si los parámetros reenviados hicieran que el referrer superara 1 KB, Appy los descarta y deja solo el slug.
Los parámetros viajan en claro. Para un nombre de campaña o un ID de pantalla no pasa nada. Si se trata de algo personal o de más de unos pocos valores, reenvía un token corto y resuélvelo en tu servidor, siguiendo el patrón que verás más abajo.
Leerlo en la app
Añade la librería Install Referrer, lee el valor una vez en el primer arranque y analízalo como una query string. Este es todo el lado del cliente:
implementation("com.android.installreferrer:installreferrer:2.2")fun readAppyReferrer(context: Context, onResult: (Map<String, String>) -> Unit) {
val client = InstallReferrerClient.newBuilder(context).build()
client.startConnection(object : InstallReferrerStateListener {
override fun onInstallReferrerSetupFinished(responseCode: Int) {
val raw = if (responseCode == InstallReferrerClient.InstallReferrerResponse.OK) {
runCatching { client.installReferrer.installReferrer }.getOrNull()
} else null
client.endConnection()
val uri = Uri.parse("?" + raw.orEmpty())
onResult(uri.queryParameterNames.associateWith { uri.getQueryParameter(it).orEmpty() })
}
override fun onInstallReferrerServiceDisconnected() = Unit
})
}
readAppyReferrer(this) { params ->
val slug = params["appy_slug"] ?: return@readAppyReferrer
params["screen"]?.let { openScreen(it) }
analytics.logInstallSource(slug, params["utm_source"])
}Ejecútalo solo en el primer arranque tras la instalación y guarda que ya lo hiciste. El referrer se queda en el dispositivo, así que leerlo en cada arranque en frío mandaría a la gente una y otra vez a la misma pantalla. Las instalaciones desde AppGallery o con un APK suelto llegan sin referrer; deja la pantalla de inicio normal como alternativa.
iOS: sin equivalente oficial, tres alternativas ordenadas
Apple no ofrece nada parecido al Install Referrer. Una ficha del App Store no transporta parámetros arbitrarios a través de la instalación; todo lo siguiente es un rodeo construido sobre esa ausencia. De menos malo a más nicho:
Paso por portapapeles
01 · fiabilidad media, con permisoTu página de clic escribe un token corto en el portapapeles — tras un toque de botón, porque Safari exige gesto de usuario para copiar — y reenvía al App Store. En la primera apertura, la app lee el portapapeles, encuentra el token y lo intercambia con tu servidor.
El problema llegó con iOS 16: leer el portapapeles dispara el aviso de pegado del sistema. El usuario ve "¿Permitir pegar desde Safari?" en la primera pantalla de una app instalada hace treinta segundos, y muchos lo rechazan. El rechazo es pérdida silenciosa: no puedes distinguirlo de "no había token". UIPasteboard.detectPatterns comprueba patrones sin preguntar, pero no lee el valor. Además, el portapapeles puede sobrescribirse entre el toque y la apertura. Funciona con frecuencia medible, pero tiene una segunda cara visible.
Matching probabilístico, hecho con honestidad
02 · una estimación con puntuación, nunca una certezaAl hacer clic, el servidor guarda un registro breve: qué enlace, qué plataforma, la versión de OS del user agent, un timestamp y una forma de reconocer la red de la que vino el clic. En la primera apertura, la app pide un clic reciente que parezca del mismo teléfono en la misma red. No viaja ningún token. La coincidencia es una estimación, y la única pregunta real es si lo reconoce.
Hecho a la ligera, se merece su mala fama: direcciones IP en bruto guardadas durante días, el mejor candidato devuelto como si fuera seguro y un desconocido en la misma Wi-Fi de oficina capaz de quedarse con la recompensa de otro. Las señales, además, son más débiles de lo que parecen. iCloud Private Relay oculta direcciones, el CGNAT pone muchos teléfonos detrás de una, Chrome en Android dice que todos los teléfonos usan Android 10 y Safari en iOS 26 congela su versión en 18.6.
Hecho con cuidado, sigue siendo una estimación, pero útil. Puntúa cada candidato y devuelve la puntuación con las señales que la producen. Nunca dejes que una estimación llegue a la certeza. Deja que la app elija su umbral y no consumas un clic que quedó por debajo, para que el teléfono que de verdad hizo clic pueda reclamarlo. Mantén la ventana corta y no guardes ninguna IP. El SDK de Appy en Enterprise deja todo eso del lado de Appy. Tu app recibe el enlace o nada, tu backend puede consultar si una instalación está verificada y las redes se reconocen mediante un hash con clave de la dirección que rota cada día y caduca a las dos horas. Con la atribución estricta activada, solo cuentan las instalaciones verificadas y todo lo demás es orgánico.
App Clips y otras vías nicho
03 · fiable pero estrechoUn App Clip invocado desde tu enlace recibe la URL completa y puede pasar el contexto a la app completa mediante un contenedor compartido tras la instalación. En su nicho es la vía más fiable de iOS, pero exige construir y mantener un App Clip y solo encaja en flujos donde una experiencia instantánea tiene sentido. Las shared web credentials resuelven la continuidad de sesión, no el contexto general del enlace. Vale la pena conocerlo; rara vez es la respuesta.
El patrón de diseño que vale para cualquier mecanismo
Sea cual sea el transporte del token — cadena referrer, portapapeles o un ID de coincidencia probabilística — la arquitectura de servidor es la misma, y acertarla importa más que el transporte. No metas el deep link entero en el canal: guarda el contexto en tu servidor y mueve solo una clave de vida corta.
Guarda el contexto bajo un token aleatorio
Al hacer clic, escribe {deep_link, campaña, timestamp} bajo un token corto y aleatorio, y pon solo el token en el transporte. Las cargas quedan pequeñas, los datos de campaña no acaban en portapapeles ni en logs, y puedes cambiar qué significa "contexto" sin tocar el cliente.
Expira agresivamente
Un TTL de 30 a 60 minutos cubre el viaje real de toque a instalación. Una ruta diferida resuelta una semana después del clic se equivoca más veces de las que acierta.
Impón el uso único
Consume el token en el primer intercambio. Las cadenas referrer persisten y el portapapeles puede leerse dos veces; sin uso único, una reinstalación o un segundo dispositivo puede reproducir el contexto de otra persona.
Falla hacia el defecto, no hacia una conjetura
Sin token, token expirado o permiso rechazado: lleva al usuario a la pantalla de inicio normal. Una primera apertura genérica decepciona un poco; acabar en el carrito de otro usuario es un ticket de soporte.
Fiabilidad, dicha con honestidad
Cifras aproximadas de equipos que ejecutan esto en producción. Tu mezcla de fuentes, retraso de instalación y versión de iOS de tu audiencia mueven cada número.
| Mecanismo | Plataforma | Fiabilidad | Notas |
|---|---|---|---|
| Play Install Referrer | Android | Alta | API oficial, sobrevive a instalaciones tardías, sin aviso al usuario. Solo instalaciones de Play. |
| Token en portapapeles | iOS | Media | Condicionada por el aviso de pegado de iOS 16+; los rechazos son silenciosos; el portapapeles es volátil. |
| Matching probabilístico puntuado | iOS; Android sin referrer | Media, puntuada | Misma red, versión de OS y tiempo. Fuerte en la misma Wi-Fi minutos después del toque; débil entre redes, con CGNAT y Private Relay. Solo vale la pena con una puntuación visible y un umbral. |
| Relevo por App Clip | iOS | Alta, estrecha | Determinista, pero solo para flujos que justifiquen construir un App Clip. |
Qué significa esto para tu stack
Si tu necesidad es solo Android, necesitas muy poco: un enlace que añada el parámetro referrer, la pequeña librería y un endpoint de intercambio de tokens. Es una tarde de trabajo y es genuinamente libre de SDK en el sentido que importa: sin código de terceros observando a tus usuarios.
iOS es donde las soluciones gestionadas se ganan el sueldo, porque allí los rodeos son el producto: la infraestructura de matching, un modelo de puntuación que alguien tiene que mantener honesto y cada versión de OS que mueve el suelo, como iOS 26 congelando la versión de Safari. Por eso el SDK de Appy para iOS y Android, con deferred deep linking y atribución de instalaciones, está en el plan Enterprise, mientras que el referrer de Android viene con cada enlace.
Sé honesto sobre qué problema tienes. Si lo que necesitas es que "los usuarios que ya tienen la app aterricen en la pantalla correcta", eso es deep linking estándar, sin frontera de instalación. El shim de deep links de Appy cubre ese caso en el plan Pro por 9,99 $/mes, manda a la tienda a quien no tiene la app y no necesita SDK. Mide cuánta parte de tu embudo es realmente instalación nueva con contexto antes de comprar la maquinaria pesada.
Sigue leyendo
Preguntas frecuentes
¿Funciona el Install Referrer desde un escaneo de QR?
Sí, siempre que el QR se resuelva a través de un enlace que añada el parámetro referrer a la URL de Play. Al mecanismo no le importa cómo empezó el clic — escaneo, toque o NFC — solo que la URL de la tienda llevara el referrer al abrirse Play. Un QR que apunta a una URL de Play desnuda no lleva nada.
¿Por qué se rompió de repente mi enfoque de token en portapapeles?
Casi seguro, el aviso de pegado de iOS. Desde iOS 16, la primera lectura del portapapeles dispara un diálogo de permiso y una parte significativa de usuarios lo rechaza. Tu código no empeoró; tu lectura ahora tiene un humano en el circuito. Comprueba si tu tasa de tokens encontrados bajó en vez de irse a cero: esa es la firma.
¿Está permitido el matching probabilístico en iOS?
El acuerdo de desarrolladores de Apple prohíbe derivar datos de un dispositivo para identificarlo de forma única, y App Review puede rechazar apps cuyos SDK lo hacen. Un fingerprint que reconoce un teléfono entre apps y durante semanas está del lado equivocado de esa línea. Comparar un clic y una primera apertura en la misma red dentro de dos horas, para tu propio enlace, sin guardar la IP y con una puntuación, es algo mucho más acotado, pero aun así debes declarar esos datos en tu información de privacidad. Uses la herramienta que uses, pregunta qué guarda, durante cuánto tiempo y si te avisa cuando lo que te da es una estimación.
¿Necesito deferred deep linking siquiera?
Solo si la pantalla de aterrizaje tras la instalación cambia materialmente tu embudo. Si la mayoría de instalaciones viene de campañas genéricas sin destino concreto, un buen onboarding rinde más. Mide primero: cuenta los clics con destino real de deep link y app no instalada. Si el número es pequeño, invierte el esfuerzo en otra parte.
Seguir explorando
Descubre qué enlace trajo cada instalación: el SDK de Appy para iOS y Android
Appy ahora sigue tus enlaces más allá de la tienda de apps. El nuevo SDK te muestra instalaciones, eventos in-app e ingresos de cada enlace, código QR y campaña, y abre la pantalla correcta a los nuevos usuarios.
Chrome le dice a cada servidor que tu teléfono usa Android 10
Chrome en Android dice que todos los teléfonos son Android 10, modelo K. Qué supuso eso para el matching de deferred deep links, por qué Critical-CH contaría cada clic dos veces y cómo los Client Hints recuperan la versión y el modelo reales.
Deferred deep linking: cómo funciona y cuándo usarlo
Conserva la intención original del enlace tras la instalación para que los nuevos usuarios aterricen en la pantalla correcta y no en la home por defecto.
¿Buscas otra cosa? Explora todos los temas en el blog.
Enruta las instalaciones que ya ganaste
El install referrer de Play en cada enlace y, en Pro, deep links que mandan a la tienda a quien no tiene la app, sin meter un SDK en tu app. Cuando necesites deferred deep links y atribución de instalaciones en iOS y Android, el SDK de Enterprise atribuye cada instalación al enlace que la trajo.
Empieza con Appy