Skip to main content

UTM Tracking


1. Summary

Goal: Система отслеживания маркетинговых кампаний — позволяет создавать короткие ссылки с UTM-параметрами, отслеживать переходы и конверсии, анализировать эффективность каналов привлечения.

User Value: Маркетолог получает точную аналитику по каждому источнику трафика: сколько кликов, сколько регистраций, какая конверсия. Красивые короткие ссылки (goloot.online/influencer/code) вместо длинных Telegram URL.


2. Business Logic

UTM Parameters

Обязательные параметры:

ПараметрОписаниеПример
sourceИсточник трафикаtelegram, youtube, vk
mediumСпособ размещенияcpc, social, influencer, banner
campaignНазвание кампанииwinter_sale, new_users_2024

Ограничения: 1-20 символов (source/medium), 1-100 символов (campaign)

Формат короткой ссылки: goloot.online/{influencer}/{code}

Внутреннее хранение: {influencer}_{code} (с underscore) Отображение: {influencer}/{code} (со slash)

Генерация shortCode
  1. Базовый код из первых символов параметров: tel_vid_winter
  2. При коллизии: добавляется счётчик tel_vid_winter_1, tel_vid_winter_2
  3. При переполнении (>999): fallback на случайный 6-символьный код

Click Tracking Flow

Архитектурное решение v4.0.0

Redirect сервис НЕ записывает клики в БД. Это "чистый редирект" для максимальной производительности. Клики подсчитываются при старте Mini App через /auth endpoint.

InviteSession (Activation Domain)

UTM и Referrals используют сервисы из домена activation:

  • InviteSessionService — создание и поиск сессий
  • ActivationRewardService — активация и распределение наград

Модель InviteSession:

  • type: InviteType — UTM или REFERRAL
  • telegramId — ID пользователя до регистрации
  • metadata: Json — UTM параметры или referralCode
  • state — PENDING → ACTIVATED / EXPIRED
Переиспользуемая архитектура

InviteSession — это общий механизм для трекинга любых "приглашений". UTM и Referrals — два варианта использования. Подробнее см. Activation.

Conversion Tracking

Конверсия считается когда:

  1. Пользователь перешёл по UTM-ссылке (зафиксировано в InviteSession)
  2. Пользователь завершил регистрацию (onboarding completed)
  3. Система устанавливает UTMTracking.converted = true

Метрики:

  • utm_campaigns.clicksCount — агрегированное количество кликов
  • utm_campaigns.conversions — агрегированное количество регистраций
  • conversionRate = conversions / clicksCount * 100%

Promo Code Integration

UTM-кампания может быть связана с промокодом (promoCodeId). Это позволяет:

  • Отслеживать активации промокода от пользователей, пришедших по UTM
  • Видеть на графике аналитики две линии: общие активации и активации от UTM
  • Сравнивать эффективность разных кампаний по промокоду

Метрики промокода:

  • totalPromoRedemptions — все активации привязанного промокода
  • utmPromoRedemptions — активации от пользователей с UTM-визитом за последние 7 дней
  • На графике: фиолетовая линия (всего) и розовая линия (от UTM)
Attribution Logic

Активация промокода атрибутируется к UTM-кампании если пользователь посетил Mini App по любой UTM-ссылке в течение 7 дней до активации. Связь устанавливается через source+medium+campaign match.

Normalization

UTM параметры автоматически нормализуются для консистентности:

ВводРезультат
youtube, YOUTUBE, ютубYouTube
tiktok, тиктокTikTok
vk, вконтактеVK
shorts, reels, реелиvideo_vertical

Protection

ДействиеRate LimitAuthValidation
Redirect (public)shortlinks (100/min)none
Create campaigncritical (5/min)adminUTMParametersSchema
List campaignsadmin (10/min)adminUTMLinksQuerySchema
Toggle/Deletecritical (5/min)admin
Analyticsanalytics (30/min)adminAnalyticsQuerySchema
Trackingtracking (60/min)telegramUTMTrackingSchema
Emergencyemergency (1/min)При подозрительной активности
Rate Limit Configs

Определены в backend/src/domains/utm/routes/utm/middleware/rate-limiting.middleware.ts:

ConfigЛимитНазначение
criticalRateLimitConfig5/minСоздание/изменение кампаний
trackingRateLimitConfig60/minТрекинг активности
analyticsRateLimitConfig30/minАналитика
shortlinksRateLimitConfig100/minПубличные редиректы
adminRateLimitConfig10/minАдминские операции
emergencyRateLimitConfig1/minЭкстренная защита
Security Details

См. Security Matrix для полного обзора защит.

Edge Cases

СитуацияUI поведениеКод
❌ Кампания не найденаRedirect на /start (fallback)
❌ Кампания неактивнаRedirect на /start (fallback)
❌ Short link истёкRedirect на /start (fallback)
❌ Дублирующая комбинация UTM"Кампания с такими параметрами уже существует"DUPLICATE
❌ Заблокированное значение"Значение заблокировано"BLOCKED_VALUE
✅ Успешный редирект302 → Telegram

3. ADR (Architectural Decisions)

ADR 1: Clean Redirect Architecture (v4.0.0)

Проблема: Запись кликов в БД при каждом redirect создаёт нагрузку и latency.

Решение: Redirect сервис только редиректит, НЕ пишет в БД. Клики подсчитываются при авторизации в Mini App.

Альтернативы (отклонены):

  • Async запись в БД — усложняет архитектуру, возможна потеря данных
  • Redis counter — дополнительная инфраструктура

Последствия: Простой, быстрый redirect. Клики подсчитываются точнее (только реальные открытия Mini App, не боты).


ADR 2: Агрегированные счётчики в utm_campaigns

Проблема: Подсчёт кликов через COUNT(*) в utm_tracking дорогой при большом объёме данных.

Решение: Денормализация: clicksCount и conversions хранятся в utm_campaigns и инкрементируются атомарно.

Альтернативы (отклонены):

  • Материализованные представления — сложнее поддерживать
  • Кэширование — inconsistency при инвалидации

Последствия: O(1) для получения статистики кампании. Trade-off: нужно инкрементировать при каждом событии.


ADR 3: Unique constraint (source, medium, campaign)

Проблема: Две кампании с одинаковыми UTM параметрами создают путаницу в аналитике.

Решение: Unique constraint на комбинацию (source, medium, campaign).

Альтернативы (отклонены):

  • Разрешить дубликаты с разными ID — невозможно определить attribution
  • Добавить timestamp в constraint — переусложнение

Последствия: Одна комбинация UTM = одна кампания. При необходимости новой кампании нужно изменить один из параметров.


ADR 4: Soft delete для UTM значений

Проблема: Удалённого инфлюенсера/источник можно создать заново, обойдя блокировку.

Решение: Таблица utm_deleted_values хранит заблокированные значения. При создании кампании проверяется отсутствие в этой таблице.

Последствия: Заблокированный инфлюенсер не сможет создать новую кампанию с тем же именем. Restore возможен через админку.


4. Architecture

Services Overview

Key Components

КомпонентПутьОписание
UTMServicebackend/src/domains/utm/services/core/utm.service.tsFacade, делегирует к специализированным сервисам
UTMCampaignServicebackend/src/domains/utm/services/campaigns/utm-campaign.service.tsCRUD кампаний, аналитика
UTMShortLinksServicebackend/src/domains/utm/services/tracking/utm-short-links.service.tsУправление короткими ссылками
UTMValidatorbackend/src/domains/utm/services/utils/utm-validator.tsВалидация параметров
UTMNormalizerbackend/src/domains/utm/services/utils/utm-normalizer.tsНормализация значений
UTMAnalyticsbackend/src/domains/utm/services/utils/utm-analytics.tsРасчёт трендов
UTMHashGeneratorbackend/src/domains/utm/services/utils/utm-hash-generator.tsГенерация уникальных shortCode
PromoAnalyticsServicebackend/src/domains/utm/services/stats/promo-analytics.service.tsАналитика промокодов для UTM
InviteSessionServicebackend/src/domains/activation/services/invite-session.service.tsСоздание UTM/Referral сессий
ActivationRewardServicebackend/src/domains/activation/services/activation-reward.service.tsАктивация сессий и награды
Admin Controllersbackend/src/domains/utm/controllers/utm-admin-links, utm-admin-sources, utm-admin-values, utm-analytics, utm-autocomplete
Public Routesbackend/src/domains/utm/routes/shortlinks.routes.tsRedirect endpoint
Admin Routesbackend/src/domains/utm/routes/utm/utm-admin.routes.tsAdmin API
Rate Limitsbackend/src/domains/utm/routes/utm/middleware/rate-limiting.middleware.tsUTM-специфичные rate limit конфиги

5. Database Schema

Models

МодельОписаниеКлючевые поля
UTMCampaignМаркетинговая кампанияsource, medium, campaign, shortCode, clicksCount, conversions, isActive
ShortLinkКороткая ссылкаcampaignId, shortCode, destinationUrl, expiresAt
UTMTrackingВизит пользователяsource, medium, campaign, userId, converted, conversionDate
UTMDeletedValueЗаблокированные значенияfield, value, deletedBy, reason

Relationships

Indexes

ТаблицаIndexНазначение
UTMCampaign(source, medium, campaign)UNIQUE — одна кампания на комбинацию
UTMCampaignshortCodeБыстрый поиск для redirect
UTMCampaignisActiveФильтрация активных
UTMCampaigninfluencerПоиск кампаний инфлюенсера
UTMCampaignclicksCount, conversionsСортировка по эффективности
ShortLinkshortCodeБыстрый redirect
ShortLinkexpiresAtCron для деактивации
UTMTrackingsource, campaignГруппировка аналитики
UTMTrackinguserId, convertedКонверсии пользователя
UTMDeletedValue(field, value)UNIQUE — проверка при создании

6. API Endpoints

МетодЭндпоинтОписаниеDocs
GET/utm/:influencer/:codeRedirect на Telegram

Response: 302 Redirectt.me/goloot_bot?start={shortCode}


  • Activation — домен InviteSession (создание и активация сессий)
  • Promo Codes — промокоды атрибутируются к UTM-кампаниям
  • Referrals — реферальная система (также использует activation domain)
  • Glossary — термины: UTM, ShortLink, Conversion, InviteSession
  • Security Matrix — защиты UTM эндпоинтов
Shared Components

UTM и Referrals используют общие компоненты из activation домена:

  • InviteSessionService — создание и поиск сессий
  • ActivationRewardService — активация и награды
  • InviteSession модель — общая модель в Prisma schema