Как метрика узнает из какой рекламной компании клиент открыл push?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Отслеживание источника push-уведомления через рекламные кампании
Это отличный вопрос об атрибуции трафика! Отслеживание того, из какой рекламной кампании пришел клиент и открыл push, требует правильной организации трекинга и использования UTM-параметров, аналитических ID и других механизмов идентификации.
1. Основной механизм: UTM-параметры и дип-линки
Когда реклама ведет на сайт или приложение, используют параметры отслеживания в URL для идентификации кампании.
Обычно в рекламной ссылке используют:
https://myapp.com/download?utm_source=facebook&utm_medium=push&utm_campaign=summer_sale&utm_id=camp_12345
Где:
- utm_source: источник трафика (facebook, google_ads, email, telegram)
- utm_medium: тип трафика (push, email, cpc, organic)
- utm_campaign: название кампании
- utm_id: уникальный ID кампании для связи с другими системами
2. Первый клик — первичная установка приложения
Если это первая установка приложения, нужно сохранить данные о источнике еще до запуска app.
# После запуска приложения — отправка события установки
# Система отслеживает URL, по которому пользователь перешел
from dataclasses import dataclass
from datetime import datetime
from typing import Optional
@dataclass
class InstallEvent:
user_id: str
timestamp: datetime
utm_source: str
utm_medium: str
utm_campaign: str
utm_id: str
advertising_partner: str
campaign_name: str
install_source: str # 'organic' или 'paid'
app_version: str
def track_install(event: InstallEvent):
# Сохранение в аналитику
save_to_analytics({
'event_type': 'app_install',
'user_id': event.user_id,
'timestamp': event.timestamp,
'utm_source': event.utm_source,
'utm_medium': event.utm_medium,
'utm_campaign': event.utm_campaign,
'utm_id': event.utm_id,
'advertising_partner': event.advertising_partner,
'campaign_name': event.campaign_name,
'install_source': event.install_source,
})
# Сохранение в БД для связи будущих событий с кампанией
save_user_attribution(event.user_id, event.utm_id, event.utm_campaign)
3. Отправка push-уведомлений с идентификацией кампании
При отправке push-уведомлений нужно привязать ID кампании, чтобы потом понять, из какой это push пришла.
from typing import Dict, Optional
import uuid
class PushNotificationManager:
def send_push_campaign(self,
campaign_id: str,
campaign_name: str,
user_id: str,
title: str,
body: str,
payload: Dict):
# Добавляем campaign_id в payload (данные, которые приходят в приложение)
push_payload = {
**payload,
'campaign_id': campaign_id,
'campaign_name': campaign_name,
'push_timestamp': datetime.now().isoformat(),
'push_id': str(uuid.uuid4()) # уникальный ID каждого push
}
# Отправка через сервис push-уведомлений (Firebase, OneSignal и т.д.)
send_to_push_service({
'user_id': user_id,
'title': title,
'body': body,
'data': push_payload,
'tracking_id': str(uuid.uuid4())
})
# Логирование отправки push'а
log_push_send({
'push_id': push_payload['push_id'],
'campaign_id': campaign_id,
'campaign_name': campaign_name,
'user_id': user_id,
'timestamp': datetime.now()
})
def log_push_send(data: Dict):
# Сохранение в таблицу push_logs
insert_into_table('push_logs', {
'push_id': data['push_id'],
'campaign_id': data['campaign_id'],
'campaign_name': data['campaign_name'],
'user_id': data['user_id'],
'sent_at': data['timestamp']
})
4. Отслеживание открытия push в приложении
Когда пользователь нажимает на push, приложение должно отправить событие с информацией о том, какой push был открыт.
# На мобильном устройстве (iOS/Android)
class PushTracking:
def on_push_opened(self, push_data: Dict):
campaign_id = push_data.get('campaign_id')
campaign_name = push_data.get('campaign_name')
push_id = push_data.get('push_id')
# Отправка события открытия в аналитику
send_analytics_event({
'event_type': 'push_open',
'campaign_id': campaign_id,
'campaign_name': campaign_name,
'push_id': push_id,
'user_id': get_current_user_id(),
'timestamp': datetime.now(),
'deep_link': push_data.get('deep_link'),
'source': 'push_notification'
})
# Логирование открытия push'а
log_push_open({
'push_id': push_id,
'campaign_id': campaign_id,
'user_id': get_current_user_id(),
'opened_at': datetime.now()
})
def log_push_open(data: Dict):
insert_into_table('push_opens', {
'push_id': data['push_id'],
'campaign_id': data['campaign_id'],
'user_id': data['user_id'],
'opened_at': data['opened_at']
})
5. SQL-запрос для связи открытия push с рекламной кампанией
В аналитике нужно соединить события открытия push с информацией о кампаниях.
-- Таблица events содержит все события пользователей
CREATE TABLE events (
event_id UUID,
user_id UUID,
event_type VARCHAR,
campaign_id UUID,
campaign_name VARCHAR,
push_id UUID,
timestamp TIMESTAMPTZ,
properties JSONB
);
-- Таблица рекламных кампаний
CREATE TABLE campaigns (
campaign_id UUID PRIMARY KEY,
campaign_name VARCHAR,
utm_source VARCHAR,
utm_medium VARCHAR,
utm_campaign VARCHAR,
advertising_partner VARCHAR, -- Facebook, Google Ads, etc.
budget DECIMAL,
created_at TIMESTAMPTZ,
started_at TIMESTAMPTZ,
ended_at TIMESTAMPTZ
);
-- Запрос: сколько раз была открыта каждая кампания
SELECT
c.campaign_id,
c.campaign_name,
c.utm_source,
c.advertising_partner,
COUNT(DISTINCT e.user_id) as unique_opens,
COUNT(e.event_id) as total_opens,
COUNT(DISTINCT DATE(e.timestamp)) as days_with_opens
FROM events e
JOIN campaigns c ON e.campaign_id = c.campaign_id
WHERE e.event_type = 'push_open'
AND e.timestamp >= c.started_at
AND e.timestamp <= COALESCE(c.ended_at, CURRENT_TIMESTAMP)
GROUP BY 1, 2, 3, 4
ORDER BY total_opens DESC;
6. Multi-touch атрибуция и историческая отслеживание
Частый случай: пользователь видит несколько рекламных кампаний перед тем, как сделать покупку. Нужно отслеживать всю историю.
-- Таблица user_touchpoints для отслеживания всех точек контакта
CREATE TABLE user_touchpoints (
user_id UUID,
touchpoint_id UUID,
touchpoint_type VARCHAR, -- 'push', 'email', 'web_ad', 'organic'
campaign_id UUID,
campaign_name VARCHAR,
utm_source VARCHAR,
utm_medium VARCHAR,
timestamp TIMESTAMPTZ,
action VARCHAR, -- 'shown', 'clicked', 'opened'
position INT -- Позиция в customer journey (1 = first, N = последняя перед конверсией)
);
-- Запрос: какие кампании привели к покупке
WITH user_purchases AS (
SELECT
user_id,
MIN(timestamp) as first_purchase_date
FROM events
WHERE event_type = 'purchase'
GROUP BY 1
),
user_journey AS (
SELECT
tp.user_id,
tp.campaign_id,
tp.campaign_name,
tp.utm_source,
tp.touchpoint_type,
tp.timestamp,
ROW_NUMBER() OVER (PARTITION BY tp.user_id ORDER BY tp.timestamp DESC) as position
FROM user_touchpoints tp
JOIN user_purchases up ON tp.user_id = up.user_id
WHERE tp.timestamp <= up.first_purchase_date
)
SELECT
campaign_id,
campaign_name,
utm_source,
COUNT(CASE WHEN position = 1 THEN 1 END) as last_click_attributions,
COUNT(CASE WHEN position = 2 THEN 1 END) as second_to_last,
COUNT(DISTINCT user_id) as influenced_users
FROM user_journey
WHERE touchpoint_type IN ('push', 'email')
GROUP BY 1, 2, 3
ORDER BY influenced_users DESC;
7. Вся система в контексте
Процесс отслеживания:
1. Рекламная кампания (Facebook, Google Ads)
↓
2. Пользователь кликает на рекламу → URL с utm_campaign=summer_sale
↓
3. Переход в приложение, сохранение campaign_id в user_attribution
↓
4. Send push с payload={'campaign_id': '12345', 'push_id': 'xyz'}
↓
5. Пользователь открывает push → event 'push_open' с campaign_id
↓
6. Аналитика соединяет events.campaign_id с campaigns.campaign_id
↓
7. Dashboard показывает: "Кампания X привела Y открытий push"
8. Практический пример дашборда
-- Дашборд: эффективность рекламных кампаний через push
SELECT
DATE(e.timestamp) as date,
c.advertising_partner,
c.campaign_name,
COUNT(CASE WHEN e.event_type = 'push_send' THEN 1 END) as push_sent,
COUNT(CASE WHEN e.event_type = 'push_open' THEN 1 END) as push_opened,
ROUND(100.0 * COUNT(CASE WHEN e.event_type = 'push_open' THEN 1 END) /
NULLIF(COUNT(CASE WHEN e.event_type = 'push_send' THEN 1 END), 0), 2) as open_rate,
COUNT(CASE WHEN e.event_type = 'purchase' THEN 1 END) as purchases,
ROUND(100.0 * COUNT(CASE WHEN e.event_type = 'purchase' THEN 1 END) /
NULLIF(COUNT(CASE WHEN e.event_type = 'push_open' THEN 1 END), 0), 2) as conversion_rate
FROM events e
JOIN campaigns c ON e.campaign_id = c.campaign_id
WHERE e.timestamp >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1, 2, 3
ORDER BY date DESC, push_sent DESC;
Ключевые моменты для Product Analyst
- Уникальный ID для каждого push помогает отследить конкретное уведомление
- Payload в push должен содержать campaign_id и других идентификаторы
- Таблица событий должна сохранять campaign_id для каждого события
- UTM-параметры используются в первый раз, потом user_id связывает с кампанией
- Multi-touch атрибуция показывает все кампании, которые повлияли на конверсию
Заключение
Отслеживание источника push-уведомлений требует систематического подхода: правильной передачи campaign_id через весь pipeline, логирования всех событий и правильного соединения данных в аналитике. Таким образом метрика может легко определить, из какой рекламной кампании пришел клиент и открыл push.