8 мин

Как создать веб‑приложение для атрибуции дохода партнёров

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

Как создать веб‑приложение для атрибуции дохода партнёров

Цели продукта и основные понятия

Приложение для атрибуции партнёрского дохода нужно, чтобы честно и прозрачно связать результат (покупку, оплату, подписку) с источником трафика и правильно начислить вознаграждение. Бизнес получает управляемый канал привлечения, партнёры — понятные правила и прогнозируемую экономику, а команда — единое место для данных и разборов спорных ситуаций.

На практике такие системы «живут» на стыке маркетинга, продукта, биллинга и аналитики. Поэтому важнее всего договориться о терминах и правилах до того, как начнётся разработка.

Кто пользователи и что им важно

  • Партнёры хотят быстро создавать ссылки, видеть статистику и понимать, за что начислены деньги.
  • Админам нужны инструменты управления правилами, модерации и антифрода.
  • Финансам важны точные суммы, статусы выплат и сверка с заказами.
  • Саппорт ищет ответы на вопросы «почему конверсия не засчиталась» и «почему комиссия изменилась» — желательно за минуту, а не за день.

Базовые термины, без которых не договориться

  • Клик — переход по партнёрской ссылке.
  • Сессия — набор действий пользователя после клика в течение заданного окна.
  • Конверсия — целевое событие (например, регистрация или оплата).
  • Заказ — конкретная покупка с суммой, валютой, статусом.
  • Комиссия — вознаграждение партнёру по правилам (процент/фикс, пороги, исключения).

Решения, которые стоит принять до разработки

Определите заранее:

  • модель атрибуции (первый/последний клик, мульти‑канальная);
  • окна атрибуции и их пересечение с повторными кликами;
  • какие конверсии считаются валидными;
  • когда комиссия «созревает» (после оплаты, доставки, окончания окна возврата);
  • какие статусы заказов влияют на выплату.

Эти пункты критично зафиксировать в правилах и в публичных условиях программы: это резко снижает количество ручных разборов и конфликтов.

Ключевые метрики

Минимальный набор:

  • CR (конверсия),
  • EPC (доход на клик),
  • ROI (окупаемость канала),
  • удержание/повторные покупки по партнёрам,
  • доля отклонённых конверсий (как индикатор качества трафика).

Модель атрибуции и бизнес‑правила

Модель атрибуции — это набор правил, по которым вы решаете, кому засчитать конверсию и комиссию, если на покупку повлияли разные источники трафика. Чем раньше вы зафиксируете эти правила, тем проще будет и партнёрам, и внутренним командам: меньше «серых зон», больше повторяемости в расчётах.

Одно касание vs мультикасание

Одно касание (single‑touch) проще: вся ценность уходит одному источнику. Для партнёрской программы чаще всего выбирают:

  • Last click: комиссия последнему партнёру, чья ссылка была кликнута перед покупкой.
  • First click: комиссия партнёру, который первым привёл пользователя.

Мультикасание (multi‑touch) полезно, если вы хотите делить комиссию (например, 70/30) между источниками. Но это усложняет объяснение партнёрам и повышает требования к качеству данных.

Практичный компромисс: single‑touch по умолчанию + отдельные кампании/акции с разделением, где правила заранее описаны и ограничены по времени.

Окно атрибуции: 7/30 дней и не только

Окно атрибуции задаёт, как долго клик “живёт”. Типовые варианты:

  • 7 дней для импульсных покупок.
  • 30 дней для товаров с длинным циклом выбора.

Важно определить:

  • окно считается от клика или от первого визита;
  • продлевается ли окно при повторных кликах (часто — да, но только в пределах максимального окна).

Приоритеты источников

Без приоритетов вы почти гарантированно получите спорные случаи. Частая логика:

  1. Партнёрская ссылка
  2. Рекламные кампании
  3. Прямой трафик/органика

Но бывает и наоборот — например, если бизнес не готов платить комиссию, когда пользователь уже пришёл из платной рекламы.

Главное: приоритеты должны быть одинаково понятны в продукте, документации и логике расчёта.

Кросс‑девайс: когда учитываем и как подтверждаем

Кросс‑девайс стоит включать, только если вы можете уверенно связать пользователя: вход в аккаунт, подтверждённый 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_iduser_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 — без перегруза терминами, с примерами строк параметров.

Админ‑панель и антифрод

Соберите прототип атрибуции за вечер
Опишите правила в чате, и TakProsto соберет каркас React и Go.

Админ‑панель — это место, где команда держит партнёрскую программу «в руках»: управляет правилами, предотвращает злоупотребления и быстро разбирает спорные ситуации.

Чем прозрачнее действия админов (аудит‑лог, понятные причины решений), тем меньше конфликтов с партнёрами и бухгалтерией.

Управление партнёрами и договорённостями

Сделайте карточку партнёра центральной точкой:

  • статусы (на проверке, активен, приостановлен, закрыт),
  • теги (тип трафика, приоритет, менеджер),
  • индивидуальные ставки и исключения.

Важно, чтобы ставки можно было задавать на разных уровнях: партнёр → кампания → товар/категория → период.

Ручные корректировки и аудит‑лог

Корректировки неизбежны: возвраты, отмены, добросовестные ошибки трекинга.

Любое ручное действие должно оставлять аудит‑лог: кто, когда, что изменил и почему.

Практика: требуйте комментарий и выбираемый «тип причины» (возврат, жест доброй воли, ошибка интеграции) — это ускоряет последующую сверку.

Модерация кампаний и контроль источников

Дайте админам инструменты для проверки кампаний: разрешённые источники трафика, список запрещённых площадок/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) и версию события — так партнёры смогут обновляться без остановки интеграции.

Безопасность, приватность и соответствие требованиям

Заработайте кредиты на разработку
Получайте кредиты за контент о TakProsto или приглашения по реферальной ссылке.

Безопасность и приватность в атрибуции — это не «добавка в конце», а часть продукта: вы обрабатываете клики, идентификаторы устройств, заказы и выплаты.

Чем меньше данных вы храните и чем понятнее правила доступа, тем проще пройти проверки и пережить инциденты.

Персональные данные и минимизация

Собирайте только то, без чего атрибуция и расчёт комиссий невозможны. Часто достаточно:

  • технического идентификатора клика/сессии,
  • времени,
  • 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 дней — для товаров/подписок с долгим выбором.

Важно документировать:

  • от какой точки идёт отсчёт (от клика или первого визита);
  • продлевается ли окно повторными кликами;
  • есть ли максимальный лимит продления.
Зачем задавать приоритеты источников трафика и какие бывают варианты?

Потому что даже при хорошем окне атрибуции возникнут конфликты: платная реклама, органика, прямые визиты, повторные клики.

Типовой порядок:

  1. партнёрская ссылка
  2. рекламные кампании
  3. прямой/органика

Но иногда бизнес выбирает обратный приоритет, чтобы не платить комиссию за пользователя, пришедшего из платного канала. Главное — зафиксировать правило в условиях и применять одинаково для всех.

Когда стоит учитывать кросс-девайс и как это делать корректно?

Кросс-девайс включайте только когда можете надёжно связать пользователя:

  • логин в аккаунт;
  • подтверждённый 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 и рассчитанную комиссию на момент атрибуции — так отчёты быстрее и проще сверка.

Как правильно считать комиссию, учитывать холд и обрабатывать возвраты?

Сделайте расчёт воспроизводимым и «проверяемым»:

  • два состояния начисления: pendingapproved (после холда/доставки);
  • сторно и частичные корректировки отдельными записями с причиной;
  • храните «снимок расчёта»: ставка, база (gross/net), округление, версия правил, курс валюты, ссылки на исходные события.

Так споры решаются пересчётом по тем же входным данным, а не ручными правками.

Похожие статьи