Отслеживание аналитики: Сбор событий с приоритетом конфиденциальности
Эта статья объясняет, как мы отслеживаем поведение пользователей, уважая приватность и избегая бот-трафика.
Проблема: Понимание поведения пользователей
Нам необходимо знать:
-
Какие страницы посещают пользователи
-
Какие товары они просматривают
-
Откуда приходит трафик (Google Ads, органический, социальные сети)
-
Какие кампании приводят к конверсиям
Но мы должны избегать:
-
Отслеживания ботов и краулеров
-
Хранения личной идентифицируемой информации (PII)
-
Нарушения правил конфиденциальности
Решение: Клиентское + Серверное отслеживание
Клиентское: JavaScript отслеживание
ID посетителя: Случайный ID, хранящийся в cookie (365 дней)
ID сессии: Случайный ID, хранящийся в sessionStorage (до закрытия браузера)
Параметры кампании: Извлекаются из URL и хранятся в sessionStorage
Отслеживаемые параметры:
-
gclid- Google Click ID (Поисковая реклама) -
gbraid- Google Ads click ID (Товарная реклама) -
wbraid- Google Ads click ID (iOS) -
fbclid- Facebook click ID -
srsltid- Google organic search result ID -
utm_source,utm_medium,utm_campaign,utm_term,utm_content
Хранение: Параметры хранятся в cookies (30 минут) для атрибуции кликов по WhatsApp/телефону
Серверное: Обогащение данных
Сервер обогащает события:
Данными GeoIP: Страна, регион, город по IP-адресу
Парсингом User-Agent: Браузер, ОС, тип устройства
Меткой времени: Время сервера (UTC)
Обнаружением ботов: Фильтрация известных бот-агентов
Типы событий
Просмотр страницы: Пользователь посещает страницу
Просмотр товара: Пользователь просматривает страницу товара
Добавление в корзину: Пользователь добавляет товар в корзину
Оформление заказа: Пользователь начинает оформление заказа
Покупка: Пользователь завершает покупку
Клик по WhatsApp: Пользователь нажимает кнопку WhatsApp
Клик по телефону: Пользователь нажимает на номер телефона
Поток данных
sequenceDiagram
participant User
participant JS as JavaScript
participant API as /api/analytics
participant Firehose as Kinesis Firehose
participant S3
User->>JS: Visit page
JS->>JS: Extract URL params
(gclid, utm_*, etc.)
JS->>JS: Store in sessionStorage
JS->>API: POST event + params
API->>API: Enrich with GeoIP
API->>API: Parse User-Agent
API->>API: Filter bots
API->>Firehose: Send enriched event
Firehose->>S3: Store in analytics bucketОбнаружение ботов
Мы фильтруем бот-трафик, используя несколько сигналов:
Шаблоны User-Agent: Известные строки ботов (Googlebot, Bingbot и т.д.)
Шаблоны поведения: Слишком быстро, слишком много запросов
Отсутствие JavaScript: Боты часто не выполняют JS
Куки исключения: tv_exclude=true останавливает всё отслеживание
Защита конфиденциальности
Без PII: Мы никогда не храним имена, email, номера телефонов
Анонимизированные IP: Последний октет удаляется перед хранением
Без межсайтового отслеживания: Куки только первого лица (first-party)
Отказ от отслеживания: Пользователи могут установить куки исключения
Срок хранения данных: События удаляются через 90 дней
Условная загрузка пикселей
Мы загружаем пиксели отслеживания только когда это уместно:
Пиксель Google Ads: Только если присутствует gclid, gbraid или wbraid
Пиксель LinkedIn: Только если присутствует msclkid
Пиксель Facebook: Только если присутствует fbclid
Преимущество: Более быстрая загрузка страниц, меньше нагрузки от отслеживания
Определение источника трафика
Мы определяем источник трафика по параметрам URL:
Google Ads: gclid, gbraid, wbraid → utm_source=google_ads
Google Organic: srsltid → utm_source=google_search
Facebook: fbclid → utm_source=facebook
LinkedIn: msclkid → utm_source=linkedin
Прямой заход: Нет параметров → utm_source=direct
Отслеживание конверсий
Мы отслеживаем конверсии по воронке:
Просмотр товара → Добавление в корзину → Оформление заказа → Покупка
Каждый шаг включает:
-
ID посетителя (для атрибуции)
-
ID сессии (для анализа сессии)
-
Параметры кампании (для расчета ROI)
-
Артикул товара (для анализа товаров)
Отслеживание контактов с лидами
Когда пользователи связываются с нами (WhatsApp, телефон, email), мы фиксируем:
Способ связи: WhatsApp, телефон, email
Параметры кампании: Из cookies (30-минутное окно)
Контекст товара: На какой странице товара они находились
Преимущество: Атрибуция офлайн-конверсий к онлайн-кампаниям
Ограничение частоты запросов
Конечная точка аналитики имеет ограничение по частоте:
Лимит: 100 запросов за 10 минут с одного IP
Преимущество: Предотвращает злоупотребления и наводнения ботами
Хранение
События хранятся в S3 через Kinesis Firehose:
Формат: JSON lines (одно событие на строку)
Партиционирование: По дате (год/месяц/день/час)
Сжатие: Gzip
Срок хранения: 90 дней
Запросы
События запрашиваются через AWS Athena:
Схема: Определена в Glue Data Catalog
Запросы: SQL на данных в S3
Варианты использования: ROI кампаний, популярность товаров, источники трафика
Ссылки
Технические концепции
-
Веб-аналитика - Википедия
-
Конфиденциальность по умолчанию - Википедия
Сервисы AWS
-
Kinesis Firehose - Документация AWS
-
Athena - Документация AWS
Связанные статьи
- Многосерверная архитектура - Где работает аналитика
Резюме
Наша система аналитики отслеживает поведение пользователей, уважая конфиденциальность:
Клиентская часть:
-
✅ Извлечение параметров кампании из URL
-
✅ Хранение в sessionStorage (в рамках сессии)
-
✅ Хранение в cookies (30 минут для атрибуции)
-
✅ Отправка событий в API
Серверная часть:
-
✅ Обогащение данными GeoIP и User-Agent
-
✅ Фильтрация бот-трафика
-
✅ Отправка в Kinesis Firehose
-
✅ Хранение в S3 (партиционировано по дате)
Конфиденциальность:
-
✅ Без хранения PII
-
✅ Анонимизированные IP
-
✅ Куки только первого лица
-
✅ Доступен отказ от отслеживания
-
✅ Срок хранения 90 дней
Условная загрузка:
-
✅ Пиксель Google Ads только при наличии gclid
-
✅ Пиксель LinkedIn только при наличии msclkid
-
✅ Пиксель Facebook только при наличии fbclid
Этот подход балансирует между получением аналитических данных, конфиденциальностью и производительностью.