← Назад к вопросам

Как метрика узнает из какой рекламной компании клиент открыл push?

2.2 Middle🔥 151 комментариев
#Атрибуция и маркетинг#Метрики продукта

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отслеживание источника 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.

Как метрика узнает из какой рекламной компании клиент открыл push? | PrepBro