Как правильно получать Android Referrer и сохранять атрибуцию
Короткий ответ: используйте официальную библиотеку Google Play Install Referrer (com.android.installreferrer), сразу парсите и URL‑decode строку referrer, отправляйте UTM‑параметры в аналитику и/или сервер‑side Conversion API — это минимизирует потерю атрибуции при задержках установки и deep linking.
Что такое Android Referrer и зачем он нужен
Android Referrer — строка, которую Google Play передаёт приложению при первой установке. В ней обычно передают UTM‑метки (utm_source, utm_medium, utm_campaign и др.). Если не принимать и не фиксировать эти параметры корректно, установки будут считаться «прямыми», что ломает кампании и ROI‑аналитику.
Как правильно настроить Install Referrer (пошагово)
- Добавьте зависимость в build.gradle (app):
implementation 'com.android.installreferrer:installreferrer:2.2'
- Инициализация и чтение referrer в Kotlin (выполняйте при первом запуске приложения):
val client = InstallReferrerClient.newBuilder(context).build()
client.startConnection(object : InstallReferrerStateListener {
override fun onInstallReferrerSetupFinished(responseCode: Int) {
if (responseCode == InstallReferrerClient.InstallReferrerResponse.OK) {
val details = client.installReferrer
val raw = details.installReferrer // URL‑encoded строка
val clickTs = details.googlePlayInstantReferrerClickTimestampSeconds
val installTs = details.installBeginTimestampSeconds
val decoded = URLDecoder.decode(raw, "UTF-8")
// Разбить decoded на пары key=value и отправить в аналитику/сервер
sendToAnalytics(decoded, clickTs, installTs)
} else {
// FEATURE_NOT_SUPPORTED, SERVICE_UNAVAILABLE и т.п. — применить fallback
}
}
override fun onInstallReferrerServiceDisconnected() { /* ретрай */ }
})
// В onDestroy:
client.endConnection()
- Парсите параметры через готовый парсер query string, а не простым split, чтобы избежать ошибок с кодированием.
- Отправляйте данные сразу при первом запуске — это снижает риск потери при долгой задержке установки.
Всегда вызывать client.endConnection() (например, в onDestroy()), чтобы избежать утечек и ошибок при пересоздании Activity.
Ошибки, тестирование и лучшие практики
- Декодирование: строка приходит URL‑encoded — используйте URLDecoder.decode(..., "UTF-8") или проверенные парсеры.
- Retry и fallback: если responseCode != OK, сохраняйте попытки и применяйте fallback (например, Play Campaign API или аналитический SDK).
- Attribution SDK: AppsFlyer/Adjust могут самостоятельно запрашивать referrer; интегрируйте корректно, чтобы не было дублирования событий.
- Server‑side: отправляйте referrer‑UTM на сервер (Conversion API), связывайте install event с серверной аналитикой для LTV и ретаргетинга.
- Согласие пользователя: учитывайте Consent Mode (EEA) и не отправляйте персональные данные без нужного согласия.
Тестирование:
- Сгенерировать тестовую установку через adb: adb shell am start -a android.intent.action.VIEW -d "http://play.google.com/store/apps/details?id=your.app&referrer=utm_source%3Dtest"
- Смотреть логи: adb logcat | grep InstallReferrer
Не полагайтесь только на referrer: комбинируйте данные с серверной атрибуцией, SDK трекерами и метриками кликов, особенно при сложных deeplink/SDK‑цепочках.
Частые ошибки
- Неправильное декодирование: приводит к %3D вместо = — решение: URLDecoder.decode.
- Вызов installReferrer в нескольких местах: дублирование событий — централизуйте чтение и отправку.
- Не сохраняют clickTimestamp: теряется cohort‑анализ LTV.
- Ожидание более 7 дней: referrer хранится до 7 дней, но лучше отправлять сразу.
FAQ
- Нужно ли поддерживать старые Broadcast Receiver?
Нет: Google рекомендует Install Referrer API; legacy CampaignTrackingReceiver устарел. - Сколько времени хранится referrer в Play?
До 7 дней, но лучше отправлять значения при первом запуске. - Что делать, если InstallReferrer возвращает FEATURE_NOT_SUPPORTED?
Реализуйте fallback: попытка повторного подключения, затем использование аналитического SDK или данных Play Console (TrafficSourceParams) на сервере.
С такой настройкой вы минимизируете потери атрибуции: корректный парсинг, немедленная отправка и server‑side совпадут с большинством рекламных сценариев.