Как создать веб‑приложение для атрибуции дохода партнёров
Пошаговый план: трекинг кликов и конверсий, модель данных, расчёт комиссий, отчёты и API — как собрать веб‑приложение атрибуции дохода партнёров.

Цели продукта и основные понятия
Приложение для атрибуции партнёрского дохода нужно, чтобы честно и прозрачно связать результат (покупку, оплату, подписку) с источником трафика и правильно начислить вознаграждение. Бизнес получает управляемый канал привлечения, партнёры — понятные правила и прогнозируемую экономику, а команда — единое место для данных и разборов спорных ситуаций.
На практике такие системы «живут» на стыке маркетинга, продукта, биллинга и аналитики. Поэтому важнее всего договориться о терминах и правилах до того, как начнётся разработка.
Кто пользователи и что им важно
- Партнёры хотят быстро создавать ссылки, видеть статистику и понимать, за что начислены деньги.
- Админам нужны инструменты управления правилами, модерации и антифрода.
- Финансам важны точные суммы, статусы выплат и сверка с заказами.
- Саппорт ищет ответы на вопросы «почему конверсия не засчиталась» и «почему комиссия изменилась» — желательно за минуту, а не за день.
Базовые термины, без которых не договориться
- Клик — переход по партнёрской ссылке.
- Сессия — набор действий пользователя после клика в течение заданного окна.
- Конверсия — целевое событие (например, регистрация или оплата).
- Заказ — конкретная покупка с суммой, валютой, статусом.
- Комиссия — вознаграждение партнёру по правилам (процент/фикс, пороги, исключения).
Решения, которые стоит принять до разработки
Определите заранее:
- модель атрибуции (первый/последний клик, мульти‑канальная);
- окна атрибуции и их пересечение с повторными кликами;
- какие конверсии считаются валидными;
- когда комиссия «созревает» (после оплаты, доставки, окончания окна возврата);
- какие статусы заказов влияют на выплату.
Эти пункты критично зафиксировать в правилах и в публичных условиях программы: это резко снижает количество ручных разборов и конфликтов.
Ключевые метрики
Минимальный набор:
- CR (конверсия),
- EPC (доход на клик),
- ROI (окупаемость канала),
- удержание/повторные покупки по партнёрам,
- доля отклонённых конверсий (как индикатор качества трафика).
Модель атрибуции и бизнес‑правила
Модель атрибуции — это набор правил, по которым вы решаете, кому засчитать конверсию и комиссию, если на покупку повлияли разные источники трафика. Чем раньше вы зафиксируете эти правила, тем проще будет и партнёрам, и внутренним командам: меньше «серых зон», больше повторяемости в расчётах.
Одно касание vs мультикасание
Одно касание (single‑touch) проще: вся ценность уходит одному источнику. Для партнёрской программы чаще всего выбирают:
- Last click: комиссия последнему партнёру, чья ссылка была кликнута перед покупкой.
- First click: комиссия партнёру, который первым привёл пользователя.
Мультикасание (multi‑touch) полезно, если вы хотите делить комиссию (например, 70/30) между источниками. Но это усложняет объяснение партнёрам и повышает требования к качеству данных.
Практичный компромисс: single‑touch по умолчанию + отдельные кампании/акции с разделением, где правила заранее описаны и ограничены по времени.
Окно атрибуции: 7/30 дней и не только
Окно атрибуции задаёт, как долго клик “живёт”. Типовые варианты:
- 7 дней для импульсных покупок.
- 30 дней для товаров с длинным циклом выбора.
Важно определить:
- окно считается от клика или от первого визита;
- продлевается ли окно при повторных кликах (часто — да, но только в пределах максимального окна).
Приоритеты источников
Без приоритетов вы почти гарантированно получите спорные случаи. Частая логика:
- Партнёрская ссылка
- Рекламные кампании
- Прямой трафик/органика
Но бывает и наоборот — например, если бизнес не готов платить комиссию, когда пользователь уже пришёл из платной рекламы.
Главное: приоритеты должны быть одинаково понятны в продукте, документации и логике расчёта.
Кросс‑девайс: когда учитываем и как подтверждаем
Кросс‑девайс стоит включать, только если вы можете уверенно связать пользователя: вход в аккаунт, подтверждённый email/телефон, единый идентификатор клиента. Если связи нет — честнее ограничиться “в пределах устройства/браузера”, чтобы не раздувать начисления и не провоцировать споры.
Спорные случаи и как закрывать их правилами
- Пользователь кликнул партнёра, потом пришёл напрямую и купил: засчитываем по окну атрибуции (или отменяем, если прямой трафик имеет приоритет).
- Два партнёра за 24 часа: при last click — последний; при мультикасании — делим по заранее заданной схеме.
- Возврат/отмена заказа: комиссия переводится в “ожидание” и списывается при возврате (правило должно быть одинаковым для всех).
Архитектура веб‑приложения
Архитектура системы атрибуции — это не только «куда писать клики», но и как гарантировать корректные начисления, повторяемость расчётов и понятные отчёты. Удобно мыслить продуктом как набором модулей, связанных через события и очереди.
Если вы хотите быстро пройти путь от идеи до работающего прототипа, часть этих модулей можно собрать на vibe‑coding платформе TakProsto.AI: вы описываете сценарии и правила в чате, а платформа помогает с каркасом веб‑приложения (React), бэкендом (Go) и PostgreSQL, включая быстрые итерации через снапшоты и откат.
Базовые модули
Минимальный состав обычно такой:
- трекинг (клики/сессии/UTM),
- приём конверсий (заказы, лиды),
- расчёт комиссий (правила, корректировки, сторно),
- отчётность (партнёрский кабинет и админка),
- управление партнёрами (статусы, условия, выплаты),
- антифрод и сверка данных.
Клиентский vs серверный трекинг
Клиентский трекинг (JS‑пиксель, редирект‑ссылка) проще внедрить, он хорошо ловит клики и первичную сессию, но страдает от блокировок, ограничений cookie и потерь при нестабильном соединении.
Серверный трекинг (S2S события из бэкенда рекламодателя или e‑commerce) надёжнее для конверсий и сумм заказа, но требует интеграции и дисциплины в отправке событий.
На практике часто используют гибрид: клик и сессия — на клиенте, подтверждённая конверсия — с сервера.
Сервисная схема
Типовая схема: публичное API (приём кликов/конверсий) → очередь сообщений → воркеры обработки → база данных.
Отдельно полезны:
- хранилище логов/сырья (для пересчётов),
- сервис отчётности (агрегации, витрины).
Очередь защищает от пиков и позволяет обрабатывать события асинхронно.
Идемпотентность и защита от дублей
Каждое событие должно иметь уникальный ключ (например, event_id или order_id + тип события). На приёме фиксируйте его в таблице/кеше с уникальным индексом: повторная доставка не должна приводить к двойной комиссии.
Окружения dev/stage/prod
Разделяйте окружения не только по базам, но и по ключам подписи, вебхукам и доменам.
На stage держите максимально близкую к продакшену конфигурацию очередей и воркеров, чтобы ловить проблемы с нагрузкой и идемпотентностью до релиза.
Модель данных и схема БД
Хорошая схема БД для атрибуции дохода должна уверенно отвечать на два вопроса: «кто привёл» и «за какой заказ сколько платить», причём быстро и воспроизводимо (включая пересчёты).
Базовые сущности
Минимальный набор таблиц обычно включает: Partner, Campaign, Link, Click, Session, User, Order, Payout.
- Partner: партнёр и его условия (статус, ставка по умолчанию, реквизиты, налоговые настройки).
- Campaign: правила конкретной оферты/продукта (окна атрибуции, разрешённые источники, капы).
- Link: реферальная ссылка (
partner_id,campaign_id, UTM‑параметры, публичный slug). - Click: факт клика (
click_id,link_id, ip/device, user_agent,created_at). - Session: сессия на сайте (
session_id, первыйclick_id,last_click_id,created_at). - User: ваш пользователь/лид (
user_id,external_id, контакты — при необходимости). - Order: заказ/платёж (
order_id,external_id, сумма, валюта, статус,attributed_at). - Payout: выплаты и строки начислений (period,
partner_id, сумма,approved_at).
Поля для связывания и воспроизводимости
Критичные ключи: external_id (идентификатор из внешних систем), click_id, session_id. Их стоит хранить и в событиях, и в заказе, чтобы можно было объяснить цепочку «клик → сессия → пользователь → заказ».
Связи и денормализация
Типовые связи:
- Partner 1:N Campaign/Link,
- Link 1:N Click,
- Session 1:N Order (не всегда),
- Partner 1:N Payout.
Для N:M (например, Campaign ↔ Partner при разных ставках) удобна таблица связей partner_campaign_terms.
Денормализуйте аккуратно: в Order часто полезно хранить partner_id, campaign_id, click_id, session_id и рассчитанную комиссию на момент атрибуции — это ускоряет отчёты и сверку.
Временные поля, индексы и партиционирование
Обязательные даты: created_at, attributed_at, approved_at (для заказов/начислений). Индексируйте external_id, click_id, session_id, а также составные (partner_id, created_at) и (campaign_id, created_at).
При больших объёмах кликов и событий используйте партиционирование по дате (created_at по месяцам/неделям) и отдельные «горячие» индексы для последних 30–90 дней — так отчёты из /blog/otchety-dlya-partnyorov не будут «падать» под нагрузкой.
Трекинг кликов, ссылок и сессий
Качество атрибуции начинается с того, как вы фиксируете переход по партнёрской ссылке. Ошибка на этом шаге приводит к «потерянным» конверсиям, спорам и лишним ручным корректировкам.
Формат партнёрских ссылок
Обычно достаточно понятного набора параметров: pid (партнёр), offer/program, click_id (опционально), а также UTM.
Чтобы защититься от подмены, добавьте подпись (HMAC) по ключевым полям: партнёр, оффер, timestamp, произвольный nonce.
Для удобства партнёров поддержите короткие ссылки: пользователь кликает по /r/AbC123, а сервис разворачивает её в полную ссылку с параметрами и подписью.
Редирект: скорость, логирование, отказоустойчивость
Редирект должен быть быстрым: не делайте тяжёлых запросов «в лоб». Хорошая практика — записывать клик асинхронно (очередь/буфер) и сразу отдавать 302/307.
Логируйте минимум: время, IP (в усечённом виде), user-agent, referrer, целевой URL, параметры кампании, результат проверок. Введите понятные коды причин отказа (невалидная подпись, бот, повтор).
Хранение идентификаторов и «сессия атрибуции»
После редиректа сохраните click_id и контекст (pid, utm) в cookie и/или localStorage. Cookie удобнее для серверных сценариев, localStorage — запасной вариант.
Задайте сроки жизни: например, 30 дней для клика и 24 часа для сессии. «Сессия атрибуции» — это окно, в котором повторные визиты пользователя связываются с тем же кликом.
Уникальность кликов: дедупликация и фильтры
Дедупликацию делайте по комбинации pid + fingerprint + timeframe (например, 10–60 секунд), отдельно учитывая «чистые» клики и подозрительные.
Отфильтровывайте очевидных ботов (датацентры, пустые user-agent, слишком высокая частота), но сохраняйте «сырые» данные для последующего анализа и разборов.
Серверные конверсии и приём событий
Серверные конверсии — это события, которые отправляет не браузер, а ваш бэкенд (или бэкенд рекламодателя/магазина). Такой канал надёжнее: меньше блокировок, выше точность и проще связывать действие с заказом.
Какие события принимать
Минимальный набор обычно включает:
- Регистрация (
signup) — когда создан аккаунт. - Покупка (
purchase) — когда заказ оплачен или подтверждён. - Возврат/отмена (
refund/cancel) — когда нужно сторнировать или уменьшить комиссию.
Важно заранее договориться о статусах (например, «оплачен», «доставлен», «возврат») и в какой момент начисляется комиссия.
Как связать событие с кликом
Чтобы корректно применить атрибуцию, каждое событие должно нести идентификаторы связи:
click_id— лучший вариант: выдаётся при клике по партнёрской ссылке и сохраняется в сессии/куке.user_id— если пользователь уже известен и его можно связать с кликом (например, при логине).order_id— обязательный для покупок и возвратов, чтобы считать комиссию по заказу.
На практике удобно принимать несколько полей и выбирать приоритет: click_id → user_id → «неатрибутировано».
Валидация и защита входящих событий
События — финансово значимые, поэтому вход нужно защищать: подпись запроса (HMAC), API‑токен и/или IP‑allowlist.
Дополнительно проверяйте схему: тип события, валюту, сумму, временные метки, наличие order_id.
Идемпотентность и хранение «сырых» данных
Повторная отправка неизбежна (ретраи, таймауты). Принимайте idempotency_key (или используйте комбинацию event_type + order_id + status + occurred_at) и отклоняйте дубликаты.
Параллельно сохраняйте сырые события (как пришли) отдельно от «нормализованных» записей. Это помогает расследовать спорные случаи и безопасно делать пересчёты, не теряя исходный контекст.
Расчёт комиссий и корректировки
Расчёт комиссий — это место, где атрибуция превращается в деньги, поэтому правила должны быть формализованы и воспроизводимы.
Хорошая практика: считать комиссию не «на лету» в нескольких местах, а через единый расчётный модуль, который принимает событие (заказ/оплата) и набор бизнес‑правил.
Типы комиссий и ставки
Чаще всего встречаются четыре схемы:
- процент от суммы,
- фиксированная выплата,
- ступени (например, 3% до 100 000 ₽ оборота и 5% после),
- индивидуальные ставки для конкретных партнёров/кампаний.
Важно заранее определить базу расчёта: сумма заказа, маржа, сумма без доставки/НДС, а также округление и минимальную выплату.
Момент начисления: заказ, оплата, холд
Комиссия может «считаться» при создании заказа, при поступлении оплаты или после холда (периода ожидания на возвраты). Удобная модель — два состояния:
- предварительное начисление (pending),
- подтверждённое (approved).
Тогда партнёр видит ожидаемую сумму, а бухгалтерия — будущие обязательства.
Возвраты и корректировки
Нужны ревёрсалы (полное сторно) и частичные корректировки. Например, при частичном возврате пересчитывается база, а разница оформляется отдельной корректирующей записью с причиной (refund/chargeback/cancel).
Это сохраняет историю и позволяет сверять итоги за период.
Мультикасание: доли и ограничения
Если конверсия распределяется между несколькими источниками, зафиксируйте модель: равные доли, веса (например, 70/30), ограничения по окну атрибуции и максимуму касаний.
Комиссия считается по доле, а затем суммируется по участникам, чтобы итог по заказу не превышал установленный потолок.
Прозрачность и воспроизводимость
Сохраняйте рядом с начислением «снимок» параметров расчёта: применённые ставки, базу (gross/net), долю атрибуции, валюту, курс, версию правил и ссылки на исходные события.
Тогда любой спор решается повторным прогоном по тем же входным данным.
Кабинет партнёра: UX и ключевые отчёты
Кабинет партнёра — «витрина» вашей партнёрской программы: если здесь неудобно, партнёры перестают лить трафик, даже если расчёт комиссий настроен идеально.
UX стоит проектировать вокруг типовых сценариев: быстро получить ссылку, понять, что происходит с трафиком, и объяснить себе сумму начислений.
Онбординг: регистрация и верификация без лишних шагов
Минимальный путь должен занимать пару минут: email/телефон, пароль, согласия и базовые реквизиты для выплат (их можно запросить позже, перед первой выплатой).
Верификацию лучше делать «мягкой»: разрешайте работать с лимитами до подтверждения документов, показывая прогресс и причины отказов понятным языком.
Ссылки и кампании: создание, копирование, отключение
В разделе ссылок партнёр ожидает простую логику: «кампания → ссылка → подметки». Дайте:
- создание кампании с понятным названием (например, «YouTube_обзор_декабрь»);
- быстрый копипаст реферальной ссылки и короткой ссылки (если поддерживаете);
- переключатель «активна/выключена» и причину блокировки, если отключили вы;
- заметки к кампании (чтобы партнёр вспомнил, где размещал).
Дашборд: клики, конверсии, доход и статусы
Главная страница должна отвечать на 4 вопроса: сколько кликов, сколько конверсий, сколько заработано и сколько «к выплате».
Отображайте статусы начислений (ожидает подтверждения/подтверждено/отклонено/выплачено) и подсказки, почему часть конверсий ещё не засчитана (например, не завершился холд).
Отчёты: периоды, фильтры и экспорт
Сделайте отчёты по дням/неделям/месяцам с фильтрами по кампании, источнику, UTM и статусу.
Экспорт в CSV обязателен: партнёры сверяют данные в своих таблицах.
UTM и подсказки по трекингу
Поддержите UTM и произвольные подметки (sub_id) и прямо в интерфейсе объясните, как их использовать.
Полезны короткие подсказки «как установить трекинг» и ссылка на /docs/tracking — без перегруза терминами, с примерами строк параметров.
Админ‑панель и антифрод
Админ‑панель — это место, где команда держит партнёрскую программу «в руках»: управляет правилами, предотвращает злоупотребления и быстро разбирает спорные ситуации.
Чем прозрачнее действия админов (аудит‑лог, понятные причины решений), тем меньше конфликтов с партнёрами и бухгалтерией.
Управление партнёрами и договорённостями
Сделайте карточку партнёра центральной точкой:
- статусы (на проверке, активен, приостановлен, закрыт),
- теги (тип трафика, приоритет, менеджер),
- индивидуальные ставки и исключения.
Важно, чтобы ставки можно было задавать на разных уровнях: партнёр → кампания → товар/категория → период.
Ручные корректировки и аудит‑лог
Корректировки неизбежны: возвраты, отмены, добросовестные ошибки трекинга.
Любое ручное действие должно оставлять аудит‑лог: кто, когда, что изменил и почему.
Практика: требуйте комментарий и выбираемый «тип причины» (возврат, жест доброй воли, ошибка интеграции) — это ускоряет последующую сверку.
Модерация кампаний и контроль источников
Дайте админам инструменты для проверки кампаний: разрешённые источники трафика, список запрещённых площадок/UTM, лимиты по гео и устройствам.
При нарушениях — автоматическая приостановка начислений «до разбора», без удаления данных.
Антифрод‑сигналы и правила реакций
Собирайте сигналы: аномальная кликабельность, повторяющиеся устройства/браузеры, слишком высокая скорость конверсии, всплески ночью, цепочки одинаковых IP/подсетей.
Для каждого сигнала задайте пороги и сценарий: пометка, ручная проверка, временная блокировка, запрос документов.
Разбор спорных атрибуций
Нужна процедура:
- карточка спора,
- таймлайн событий (клик → сессия → конверсия),
- приложенные доказательства,
- комментарии решения,
- финальный статус.
Это превращает «спорим на словах» в воспроизводимый процесс и защищает обе стороны.
Отчётность и сверка данных
Отчётность — это место, где партнёрская программа либо становится прозрачной, либо превращается в бесконечные споры «у нас не сходится».
Поэтому отчёты и сверка должны опираться на одни и те же определения, даты и источники данных.
Набор ключевых отчётов
Минимальный набор, который закрывает 80% вопросов:
- По партнёрам: клики, уникальные сессии, конверсии, выручка, комиссия, статус начисления.
- По кампаниям/источникам: UTM, площадка, креатив, эффективность и стоимость (если импортируете расход).
- По товарам/планам: что именно продаётся лучше и где комиссия “съедается” скидками.
- По странам/регионам: сегментация, где отличается конверсия и возвраты.
Когортный взгляд на качество трафика
Когорты помогают оценить не только «первую продажу», а долгосрочную ценность: повторные покупки, продления, возвраты.
Обычно базовая когорта — по дате первой конверсии; дальше показывайте retention/повторные заказы по неделям или месяцам.
Сверка с биллингом/CRM
Сверка должна отвечать на два вопроса: что не сошлось и почему.
Полезно хранить причины расхождений как статусы:
- заказ отменён/возврат;
- платеж в биллинге есть, события конверсии нет (потеря события/блокировщик/ошибка интеграции);
- валюта/налоги/скидки изменили базу расчёта;
- изменён партнёр по бизнес‑правилу (например, last click).
Глоссарий метрик и экспорт
В интерфейсе закрепите единые определения (tooltip/справка): что такое «уникальная сессия», «подтверждённая конверсия», «выручка к начислению».
Это снижает нагрузку на поддержку и ускоряет разбор спорных кейсов.
Добавьте экспорт CSV/XLSX и расписание отправки: на почту или постановкой внутренней задачи.
Отдельно стоит вести страницу с правилами расчётов и примерами — например, /blog/commission-calculation-guide.
API и интеграции (вебхуки, импорт заказов)
Хорошее API делает партнёрскую программу «подключаемой»: партнёры могут сами забирать статистику, а вы — получать события о заказах и корректно начислять комиссии.
Важно сразу заложить правила доступа и эволюции интерфейса, чтобы не ломать интеграции при изменениях.
API для партнёров: токены, лимиты, версии, документация
Начните с простого REST API: получение кликов/конверсий/начислений, список выплат, экспорт отчётов.
Аутентификация — персональные токены (например, в кабинете партнёра), с возможностью отзыва и ротации.
Добавьте лимиты запросов (rate limiting) и понятные ошибки: партнёрам проще отлаживать интеграцию, когда они видят причину отказа и рекомендации.
Версионирование лучше фиксировать в URL (например, /api/v1/...) или через заголовок — главное, чтобы оно было стабильным.
Документацию держите рядом с продуктом: /docs/api, примеры запросов, список параметров, форматы дат и часовые пояса.
Вебхуки: конверсия/начисление/выплата, ретраи и подпись
Вебхуки позволяют партнёру получать события автоматически: conversion.created, commission.accrued, payout.paid.
Обязательно предусмотрите ретраи (повторные отправки) с экспоненциальной задержкой и дедупликацию по event_id.
Подпись защищает от подмены. Минимальный подход:
X-Signature: HMAC_SHA256(secret, raw_body)
Плюс журнал доставки: статус, время, ответ получателя, количество попыток.
Интеграция с платёжными системами для выплат (на уровне интерфейса)
Даже если выплаты выполняются вручную, интерфейс должен поддерживать: выбор метода, реквизиты, статусы (создана/в обработке/выплачена/ошибка) и хранение ссылки на транзакцию или номер поручения.
Это упрощает сверку и поддержку.
Импорт заказов из внешней системы и маппинг полей
Если заказы живут в другой системе, добавьте импорт: загрузка файла или endpoint «создать/обновить заказ».
Нужен маппинг полей (валюта, сумма, скидки, статус, идентификатор клиента) и правила обновления: какие поля можно менять, какие фиксируются после подтверждения.
Обратная совместимость при изменении событий и параметров
Никогда не переименовывайте параметры «втихую». Добавляйте новые поля, поддерживайте старые хотя бы один релизный цикл, фиксируйте изменения в changelog.
Для событий используйте схему (JSON Schema) и версию события — так партнёры смогут обновляться без остановки интеграции.
Безопасность, приватность и соответствие требованиям
Безопасность и приватность в атрибуции — это не «добавка в конце», а часть продукта: вы обрабатываете клики, идентификаторы устройств, заказы и выплаты.
Чем меньше данных вы храните и чем понятнее правила доступа, тем проще пройти проверки и пережить инциденты.
Персональные данные и минимизация
Собирайте только то, без чего атрибуция и расчёт комиссий невозможны. Часто достаточно:
- технического идентификатора клика/сессии,
- времени,
- UTM‑параметров,
- партнёрского ID,
- суммы/валюты заказа,
- статуса.
Email/телефон покупателя обычно не нужны — если они приходят из CRM, храните их в виде хэша или не сохраняйте вовсе.
Зафиксируйте в документации: цель обработки, перечень полей, сроки хранения и основания (152‑ФЗ/договор, а при работе с ЕС — GDPR).
Согласия на cookies и трекинг
Если используете cookies/пиксели/SDK, нужен понятный процесс согласия: баннер, центр предпочтений, лог согласия (версия текста, время, источник).
Важно уметь уважать отказ: не ставить необязательные cookies и не связывать сессии с пользователем без правового основания.
Шифрование, секреты и RBAC
Шифруйте трафик (TLS), а чувствительные поля — «на диске» (например, через KMS).
Секреты (ключи вебхуков, токены API, пароли) храните в менеджере секретов, включите ротацию и принцип наименьших привилегий.
Доступы разделяйте ролями (RBAC): партнёр видит только свои ссылки и выплаты; саппорт — ограниченный просмотр; финансы — отчётность; админ — настройка правил.
Журнал действий и хранение логов
Ведите аудит: входы, изменения бизнес‑правил, ручные корректировки комиссий, экспорт отчётов, управление ключами.
Заранее задайте сроки хранения, доступ по ролям и процедуру удаления/анонимизации по запросу.
План реагирования на инциденты
Опишите короткий runbook:
- кто дежурит,
- как изолировать утечку (отключение ключей/вебхуков),
- как быстро оценить затронутые данные,
- кого уведомлять (внутри компании и регуляторно),
- как фиксировать таймлайн,
- что делать после (пост‑мортем и улучшения).
Тестирование, мониторинг и пересчёты
Эта часть часто решает судьбу продукта: трекинг и атрибуция «живут» на стыке браузера, сервера и внешних систем, поэтому ошибки проявляются не сразу.
Хорошая стратегия — заранее заложить тест‑матрицу, измеримость и безопасный пересчёт.
Тест‑матрица: что обязательно проверить
Соберите набор сценариев, который покрывает критические ветки:
- клики: уникальные/повторные, разные устройства, блокировка cookies, UTM‑параметры, редиректы;
- атрибуция: окна (например, 7/30 дней), last/first click, приоритеты каналов, реатрибуция;
- комиссии: разные ставки, уровни партнёров, промокоды, капы, округления;
- возвраты и частичные возвраты: сторно, удержания, перерасчёт выплат;
- дубли: повторные события заказа, повторные вебхуки, повторная отправка из очереди.
Важно тестировать не только «счастливый путь», но и деградации: недоступность БД, таймауты внешнего API, задержки очереди.
Нагрузочное тестирование трекинга и очередей
Проверьте пиковые нагрузки на приём кликов/конверсий и на обработчики очередей: QPS, рост задержки, накопление ретраев.
Отдельно измерьте влияние «тяжёлых» правил атрибуции на время обработки.
Мониторинг и алерты
Минимальный набор метрик:
- задержка обработки событий,
- процент потерь (по разнице «принято/обработано»),
- ошибки вебхуков,
- длина очередей,
- доля дубликатов.
Алерты стоит ставить на аномалии: резкие скачки кликов/конверсий, рост отказов, изменение конверсии по источникам.
Пересчёт атрибуции при изменении правил
Заложите механизм пересчёта:
- версионирование бизнес‑правил,
- возможность переобработки событий за период,
- идемпотентность расчёта (чтобы повторный прогон давал тот же результат),
- журнал изменений,
- «сухой прогон» перед применением.
Это позволяет безопасно обновлять правила и сохранять доверие партнёров.
Масштабирование и план развития
Когда система атрибуции начинает приносить деньги, нагрузка растёт неравномерно: пик обычно приходится на трекинг кликов и приём конверсий.
План развития лучше строить вокруг узких мест, а не «переписывания всего».
Горизонтальное масштабирование трекинга и воркеров
Трекинг делайте максимально stateless: запись события в очередь/лог и быстрый ответ. Тогда вы масштабируете фронт трекинга добавлением инстансов за балансировщиком.
Вычисления (атрибуция, дедупликация, пересчёты комиссий) выносите в воркеры. Их удобно масштабировать отдельно: больше воркеров в дни распродаж, меньше — в обычные.
Разделение хранения: OLTP и OLAP
Операционные данные (переходы, заказы, статусы, начисления) держите в OLTP‑БД: транзакции, строгая целостность.
Для отчётов и аналитики постепенно подключайте OLAP‑контур (колоночное хранилище/витрины). Это снимает нагрузку с OLTP и делает отчёты быстрее без компромиссов по данным.
Пакетная обработка vs потоковая
На старте достаточно пакетных расчётов (каждые N минут/час).
Переходите к потоковой обработке, когда бизнесу критичны почти мгновенные статусы конверсий или объём событий делает батчи слишком долгими.
Оптимизация затрат: ретеншн и агрегаты
Сырые события храните ограниченное время (например, 30–90 дней), а дальше оставляйте агрегаты по дням/партнёрам/кампаниям.
Это снижает стоимость хранения и ускоряет типовые отчёты.
Бэклог улучшений
Часто первыми в очереди оказываются:
- мультивалютность (курсы и округления),
- уровни партнёров (tier‑комиссии),
- промокоды как дополнительный канал атрибуции и конфликт‑правила с реферальными ссылками.
Если вы планируете собирать продукт итеративно, TakProsto.AI может быть удобным способом быстро проверить гипотезы по модулю трекинга, кабинету партнёра и админке: платформа поддерживает экспорт исходников, деплой и хостинг, а также «планировочный режим», чтобы сначала согласовать бизнес‑правила, а уже затем переходить к программированию и интеграциям.
FAQ
Какие решения нужно принять до разработки системы атрибуции партнёрского дохода?
Начните с фиксации бизнес-правил:
- модель атрибуции (last/first click или мультикасание);
- окно атрибуции (7/30 дней, от клика или визита, продление при повторном клике);
- какие статусы заказа валидны для комиссии (оплачен/доставлен/после холда);
- приоритеты источников (когда партнёр «перебивает» рекламу или наоборот).
Эти решения уменьшают ручные разборы и задают структуру данных и API.
Как выбрать между last click, first click и мультикасанием?
Single-touch проще и прозрачнее:
- Last click — чаще всего подходит для партнёрских программ, легко объяснить партнёрам.
- First click — полезно, если вы поощряете «первое привлечение» и длинный цикл сделки.
Практичный подход: сделать single-touch по умолчанию, а мультикасание включать точечно для отдельных кампаний с заранее описанным правилом распределения.
Что такое окно атрибуции и как правильно выбрать 7 или 30 дней?
Окно атрибуции — срок, в течение которого клик может «засчитать» конверсию.
Рекомендуемая базовая настройка:
- 7 дней — для быстрых решений;
- 30 дней — для товаров/подписок с долгим выбором.
Важно документировать:
- от какой точки идёт отсчёт (от клика или первого визита);
- продлевается ли окно повторными кликами;
- есть ли максимальный лимит продления.
Зачем задавать приоритеты источников трафика и какие бывают варианты?
Потому что даже при хорошем окне атрибуции возникнут конфликты: платная реклама, органика, прямые визиты, повторные клики.
Типовой порядок:
- партнёрская ссылка
- рекламные кампании
- прямой/органика
Но иногда бизнес выбирает обратный приоритет, чтобы не платить комиссию за пользователя, пришедшего из платного канала. Главное — зафиксировать правило в условиях и применять одинаково для всех.
Когда стоит учитывать кросс-девайс и как это делать корректно?
Кросс-девайс включайте только когда можете надёжно связать пользователя:
- логин в аккаунт;
- подтверждённый email/телефон;
- единый идентификатор клиента.
Если такой связи нет, честнее считать атрибуцию в рамках устройства/браузера. Иначе вы получите завышенные начисления и больше споров с партнёрами.
Как организовать трекинг партнёрских ссылок и кликов, чтобы не терять конверсии?
Минимальный безопасный набор:
- редирект-сервис, который быстро отдаёт 302/307;
- генерация
click_idи сохранение контекста (partner/campaign/UTM); - запись клика асинхронно (очередь/буфер), чтобы не тормозить переход;
- хранение
click_idв cookie и/или localStorage со сроком жизни (например, 30 дней).
Дополнительно стоит добавить подпись (HMAC) для защиты параметров ссылки от подмены.
Как защититься от дублей кликов и повторной отправки конверсий?
Дедупликация нужна на двух уровнях:
- клики: фильтр по
pid + fingerprint + timeframe(например, 10–60 секунд), маркировка подозрительных; - события/заказы: идемпотентность по
event_idилиevent_type + order_id + status + occurred_at.
Важный принцип: дубликаты не должны приводить к двойной комиссии, но «сырые» данные лучше сохранять для расследований.
Какие серверные события конверсий принимать и как договориться о статусах?
Рекомендуемый минимальный набор:
signup— регистрация;purchase— покупка (лучше в момент подтверждённой оплаты/статуса);refund/cancel— возврат/отмена для сторно.
Для каждой интеграции заранее согласуйте:
- список статусов и их смысл;
- в какой момент начисляется комиссия;
- обязательные поля (как минимум
order_id, сумма, валюта, время события).
Какая минимальная схема данных нужна для атрибуции и расчёта комиссий?
Для отчётности и объяснимости храните цепочку «клик → сессия → пользователь → заказ».
Минимальные сущности:
- Partner, Campaign, Link
- Click, Session
- User (если есть идентификатор клиента)
- Order
- Payout/начисления
В Order часто полезно денормализовать partner_id, campaign_id, click_id, session_id и рассчитанную комиссию на момент атрибуции — так отчёты быстрее и проще сверка.
Как правильно считать комиссию, учитывать холд и обрабатывать возвраты?
Сделайте расчёт воспроизводимым и «проверяемым»:
- два состояния начисления:
pending→approved(после холда/доставки); - сторно и частичные корректировки отдельными записями с причиной;
- храните «снимок расчёта»: ставка, база (gross/net), округление, версия правил, курс валюты, ссылки на исходные события.
Так споры решаются пересчётом по тем же входным данным, а не ручными правками.