Как попасть клиенту в приложение чтобы определить источник сессии?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как попасть клиенту в приложение чтобы определить источник сессии?
Отслеживание источников трафика в мобильном приложении
Этот вопрос о Attribution (атрибуции) - как определить, откуда пришел пользователь. В мобильных приложениях это сложнее чем в веб, потому что нет встроенного механизма (как UTM параметры). Я расскажу о разных способах отслеживания.
1. Deep Links - основной способ
Deep Link это специальная ссылка, которая открывает приложение и передает информацию о том, откуда пришел пользователь.
Пример:
Обычная ссылка на веб: https://myapp.com/products/123
Deep Link в приложение: myapp://products/123?utm_source=instagram&utm_campaign=summer_sale
Когда пользователь кликает deep link:
- Если приложение установлено → открывается приложение
- Если не установлено → редирект в App Store (this is called "Deferred Deep Link")
- После установки → приложение открывается на нужной странице с параметрами
Структура Deep Link
myapp://screen_name?param1=value1¶m2=value2
Примеры:
myapp://product?id=123&utm_source=email
myapp://offer?code=SUMMER20&utm_campaign=promo
myapp://feed?tab=recommendations&utm_source=push
2. UTM параметры в Deep Links
Чтобы отслеживать источник, использую стандартные UTM параметры:
Обязательные:
utm_source- источник трафика (google, facebook, email, partner_site)utm_medium- тип канала (organic, cpc, email, push, social)utm_campaign- название кампании (summer_sale, black_friday)
Опциональные:
utm_content- А/B вариант (button_v1, banner_v2)utm_term- ключевое слово
Примеры:
Из Instagram рекламы:
myapp://product?id=123&utm_source=instagram&utm_medium=social&utm_campaign=summer2025
Из Email кампании:
myapp://offer?code=WELCOME&utm_source=email&utm_medium=email&utm_campaign=onboarding
Из Google Play поиска:
myapp://search&utm_source=google&utm_medium=organic&utm_campaign=appstore
3. Реализация отслеживания в приложении
На уровне ОС (iOS + Android)
iOS (Swift):
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
guard let url = userActivity.webpageURL else { return }
// Парсим deep link
let components = URLComponents(url: url, resolvingAgainstBaseURL: true)
let params = components?.queryItems
// Извлекаем utm параметры
let utm_source = params?.first(where: { $0.name == "utm_source" })?.value
let utm_campaign = params?.first(where: { $0.name == "utm_campaign" })?.value
// Отправляем в аналитику
Analytics.logSessionStart(source: utm_source, campaign: utm_campaign)
}
}
Android (Kotlin):
fun handleDeepLink(intent: Intent) {
val deepLink = intent.data
if (deepLink != null) {
val utm_source = deepLink.getQueryParameter("utm_source")
val utm_campaign = deepLink.getQueryParameter("utm_campaign")
Analytics.logSessionStart(source = utm_source, campaign = utm_campaign)
}
}
На уровне аналитики (Firebase Analytics, Amplitude)
Основная реализация обычно идет через SDK аналитики:
// Firebase Analytics (iOS)
Analytics.logEvent(AnalyticsEventViewItem, parameters: [
AnalyticsParameterSource: utm_source ?? "unknown",
AnalyticsParameterCampaign: utm_campaign ?? "organic",
AnalyticsParameterMedium: utm_medium ?? "direct"
])
// Amplitude
Amplitude.instance().logEvent("app_open", withEventProperties: [
"utm_source": utm_source,
"utm_campaign": utm_campaign,
"utm_medium": utm_medium
])
4. Сложность с Deferred Deep Links
Проблема: Пользователь кликает deep link, но приложение не установлено. Его перенаправляет в App Store. После установки - как узнать, откуда он пришел?
Решение: Деferred Deep Link сервис
Использую сервисы вроде:
- Branch.io
- AppsFlyer
- Adjust
- Firebase Dynamic Links
Как работает:
1. Пользователь кликает deep link из Instagram
myapp://product?id=123&utm_source=instagram
2. Branch.io перехватывает и сохраняет параметры
(сохраняет в cloud)
3. Если приложение не установлено → редирект в App Store
4. Пользователь устанавливает приложение
5. Приложение запускается → звонит в Branch API
"Я новый пользователь, дайте мне мой deep link"
6. Branch.io возвращает сохраненные параметры
{utm_source: "instagram", id: "123"}
7. Приложение открывает нужный product и логирует source
5. Отслеживание других источников
Push-уведомления
Когда я отправляю push, включаю параметры:
{
"title": "Летняя распродажа!",
"body": "Скидка 50% на все товары",
"deeplink": "myapp://offer?utm_source=push&utm_campaign=summer_sale"
}
В каждом email использую unique ссылку:
<a href="https://myapp.com/offer?code=USER123&utm_source=email&utm_campaign=onboarding">
Получить оффер
</a>
Если пользователь уже установил приложение, браузер автоматически перенаправляет на deep link.
Партнёрские ссылки
https://myapp.com/ref?partner_id=123&utm_source=partner&utm_medium=affiliate
App Store Search
Когда пользователь находит приложение в App Store поиском (organic), параметры:
utm_source=appstoreutm_medium=organicutm_campaign=app_search
Это автоматически логируется через AppStore Connect.
6. Хранение и анализ данных
Как я сохраняю информацию о источнике
При first install или first app launch, я сохраняю:
CREATE TABLE user_acquisition (
user_id UUID,
utm_source VARCHAR,
utm_medium VARCHAR,
utm_campaign VARCHAR,
utm_content VARCHAR,
utm_term VARCHAR,
install_date TIMESTAMP,
first_session_date TIMESTAMP,
ip_address VARCHAR,
device_model VARCHAR,
os VARCHAR,
app_version VARCHAR
);
Анализ:
-- Какой источник дает больше всего пользователей?
SELECT utm_source, COUNT(*) as installs
FROM user_acquisition
WHERE install_date >= NOW() - INTERVAL '30 days'
GROUP BY utm_source
ORDER BY installs DESC;
-- ROI по источникам (сколько потратили на каждый источник?)
SELECT
u.utm_source,
COUNT(u.user_id) as users,
SUM(ad_cost.cost) / COUNT(u.user_id) as CAC, -- Customer Acquisition Cost
SUM(revenue.amount) / COUNT(u.user_id) as LTV -- Lifetime Value
FROM user_acquisition u
JOIN ad_cost ON u.utm_campaign = ad_cost.campaign
JOIN revenue ON u.user_id = revenue.user_id
GROUP BY u.utm_source;
-- Какой источник дает лучший retention?
SELECT
u.utm_source,
COUNT(DISTINCT u.user_id) as total_users,
COUNT(DISTINCT CASE WHEN s.session_date > u.install_date + INTERVAL '7 days' THEN u.user_id END) as d7_active,
ROUND(100.0 * COUNT(DISTINCT CASE WHEN s.session_date > u.install_date + INTERVAL '7 days' THEN u.user_id END) / COUNT(DISTINCT u.user_id), 2) as d7_retention_pct
FROM user_acquisition u
LEFT JOIN sessions s ON u.user_id = s.user_id
GROUP BY u.utm_source
ORDER BY d7_retention_pct DESC;
7. Сложности и edge cases
Проблема 1: Attribution Last-click
Если пользователь видел рекламу в Facebook, потом гуглил приложение, потом установил через Google Play - какой источник считать?
Решение: Отслеживать весь путь (multi-touch attribution):
{
"user_id": "123",
"touchpoints": [
{"source": "facebook", "date": "2025-01-10", "type": "impression"},
{"source": "google", "date": "2025-01-11", "type": "click"},
{"source": "appstore", "date": "2025-01-11", "type": "install"}
],
"first_touch": "facebook",
"last_touch": "appstore"
}
Проблема 2: Отсутствие параметров
Не все пользователи приходят по deep link (например, поиск в App Store). Для них использую:
utm_source: "organic" или "direct"
utm_medium: "organic" или "direct"
Проблема 3: IDFA в iOS
В iOS 14.5+ Apple требует разрешение пользователя на отслеживание (IDFA). Много пользователей отказывают. Решение:
- Использовать SKAdNetwork (Apple's attribution)
- Использовать Fingerprinting (Device properties)
- Работать с aggregate данными
8. Лучшие практики
DO:
- Всегда включать utm параметры в deep links
- Использовать сервис deferred deep links (Branch, AppsFlyer)
- Логировать источник при первом запуске
- Анализировать retention и LTV по источникам
- Использовать A/B тесты для разных источников
DON'T:
- Не доверять только Last-touch attribution
- Не забывать про privacy regulations (GDPR, CCPA)
- Не смешивать web UTM с app tracking (разные системы)
- Не забывать обновлять параметры при новых кампаниях
Заключение
Отслеживание источников в мобильном приложении - это ключевой инструмент для понимания customer acquisition. Правильная атрибуция позволяет:
- Определить, какие каналы дают качественных пользователей
- Оптимизировать маркетинговый бюджет
- Рассчитать CAC и ROI
- Улучшать retention по источникам
Без правильного отслеживания все решения - это просто гадание.