Перейти к содержимому
Все статьи
9 мин чтения

Параметры Postback URL: Click ID, Sub ID и макросы без путаницы

Один токен клика проходит полный server-to-server цикл конверсии через три разных трекинговых реле

Больше всего путаницы часто вызывает вполне безобидный Postback URL:

https://track.example.com/p?click_id={subid}&status={status}&payout={payout}

Почему слева написано click_id, а справа — {subid}? Где здесь настоящий click ID? И почему другой трекер для той же задачи может использовать cid={s2}?

Короткий ответ: у параметра постбека есть два владельца. Трекер, принимающий запрос, определяет ключ слева от =. Партнёрская сеть, отправляющая запрос, определяет макрос справа. В момент отправки сеть заменяет макрос реальным значением. Названия не обязаны совпадать — совпадать должно значение.

Ниже разберём это маппирование, разницу между click ID и sub ID и тесты, которые действительно доказывают, что постбек работает. Если сначала нужна общая механика server-to-server, прочитайте что такое S2S-трекинг постбеков.

Три разные вещи, которые называют «макросом»

Возьмём такую пару:

click_id={subid}

В ней есть три отдельных уровня:

УровеньПримерКто контролируетЗадача
Ключ параметра получателяclick_id=Трекер, принимающий запросПоказывает, откуда получателю читать значение
Макрос отправителя{subid}Сеть, отправляющая запросПоказывает, какое сохранённое значение подставить
Реальное значение8f2a91c0d3Создано раньше во время кликаИдентифицирует конкретный клик

После подстановки макросов в запросе уже нет фигурных скобок:

https://track.example.com/p?click_id=8f2a91c0d3&status=deposit&payout=45.00

Если в сыром запросе всё ещё видно click_id={subid}, сеть не распознала или не раскрыла макрос. Браузер может даже получить 200 OK, но атрибуция уже сломана.

Пустой разъём получателя, сменный трафарет токена и итоговое подставленное значение как три отдельных уровня

Click ID и sub ID: связаны, но не одинаковы

Click ID — уникальный идентификатор одного отслеженного клика. Это ключ связи между исходящим переходом и поздней конверсией. Если кликнули 10 000 человек, трекер должен создать 10 000 click ID.

Sub ID — универсальное поле для переноса или хранения значения. В нём может находиться click ID трекера, а также плейсмент, код баера, креативный подход или название кампании. sub1=facebook_feed полезен для сегментации, но не является уникальным идентификатором клика.

Именно поэтому сеть может попросить передать ваш click ID в своё поле subid, aff_sub, s2 или sub1. Она не меняет сам идентификатор. Она хранит его в свободном слоте, чтобы вернуть то же значение после конверсии.

Не путайте их со следующими данными:

  • Campaign, ad set или ad ID: определяет группу кликов, а не один клик. Для этой иерархии используйте маппирование URL-параметров Facebook или маппирование макросов TikTok.
  • fbclid или ttclid: идентификатор клика рекламной платформы. Он помогает атрибуции платформы, но трекеру всё равно нужен стабильный внутренний click ID для поиска конверсии.
  • Transaction ID: определяет одну конверсию. Один клик может дать регистрацию, первый депозит и повторный депозит — с отдельным transaction ID для каждого события.

Полный цикл от клика до постбека

Представим, что DarkCore отправляет трафик в партнёрскую сеть, где доступно поле aff_sub.

1. Трекер создаёт click ID

Пользователь открывает Track Link. DarkCore записывает контекст источника и создаёт:

dc_01K2A7M9X4

2. Трекер передаёт его в оффер

URL оффера содержит исходящий макрос DarkCore:

https://network.example/offer?aff_sub={click_id}

Перед редиректом DarkCore подставляет реальное значение:

https://network.example/offer?aff_sub=dc_01K2A7M9X4

Сеть получает его в своём ключе aff_sub и сохраняет.

3. Сеть возвращает значение

В настройках постбека сети направление меняется:

https://track.example.com/p?click_id={aff_sub}&status={status}&payout={payout}&transaction_id={conversion_id}

Теперь click_id и transaction_id — ключи, которые понимает трекер-получатель. {aff_sub}, {status}, {payout} и {conversion_id} — макросы, которые понимает сеть-отправитель.

4. Трекер атрибутирует конверсию

Реальный callback может выглядеть так:

https://track.example.com/p?click_id=dc_01K2A7M9X4&status=ftd&payout=45.00&transaction_id=conv_7719

Трекер находит исходный клик, маппит ftd в нужный статус конверсии, добавляет payout и использует conv_7719, чтобы распознать буквальный повтор.

Это и есть весь контракт постбека: передать вперёд одно точное значение click ID, сохранить его без изменений и вернуть под ключом, который принимает трекер.

Почему синтаксис макросов в трекерах и сетях отличается

Универсального стандарта макросов нет. У каждого продукта свой шаблонизатор и словарь параметров.

В официальном гайде Keitaro для поиска клика используется subid и описаны псевдонимы входящих параметров. Документация Voluum показывает, как одно и то же значение меняет названия на маршруте: макрос Voluum {clickid} можно сохранить в поле сети s2, а затем вернуть в Voluum как cid={s2}. Affise документирует варианты {clickid} и {click_id} в зависимости от интеграции.

Практическое правило простое:

Слева используйте параметр, который принимает ваша система. Справа — точный синтаксис макроса из документации системы-отправителя.

Не копируйте целый шаблон постбека из другого трекера лишь потому, что концепции похожи. {click_id}, {clickid}, {subid}, ${click_subid} и {s2} где-то могут обозначать значение клика, но это не взаимозаменяемый синтаксис шаблонов.

Какие параметры постбека принимает DarkCore

DarkCore принимает распространённые псевдонимы, поэтому партнёру не всегда нужно переименовывать свои поля:

ЗначениеДопустимые входящие ключи
Click IDclick_id, clickid, cid, subid, sub_id
Статусstatus, goal, event
Payoutpayout, sum, amount, revenue
Transaction IDtransaction_id, txid, tx_id, transactionid, conversion_id, conv_id
Время конверсииevent_at, event_time

Это ключи входящего запроса, а не обещание, что каждая сеть понимает одноимённые макросы. Если сеть документирует {click_subid}, правильное маппирование может выглядеть так:

https://track.example.com/p?click_id={click_subid}&status={goal}&payout={commission}

Справа используйте точные макросы сети. Слева — один из ключей, которые принимает трекер.

Статус, payout и transaction ID маппятся отдельно

Вернуть click ID необходимо, но этого недостаточно для полной записи конверсии.

Статус

Сети могут отправлять lead, reg, registration, sale, deposit, dep или ftd. Замапьте сырые значения сети на статусы конверсий в вашем workspace. Даже правильно найденный клик с неверным статусом может уйти не по тому маршруту или не попасть в метрику оптимизации.

Payout

Передавайте числовую комиссию, а не форматированную строку вроде $45 USD. Отдельно проверьте, что означает макрос сети: валовую выручку, вашу комиссию или сумму заказа. Число может успешно распарситься, но всё равно оказаться не той бизнес-метрикой.

Transaction ID

Когда у сети есть уникальный ID конверсии, всегда передавайте его. В DarkCore наличие transaction ID делает идемпотентность отдельной для этой конверсии и статуса. Без него безопасный fallback — click ID плюс канонический статус. Разница критична, когда один клик может породить несколько реальных транзакций.

Журнал конверсий принимает первый токен, а защищённый боковой шлюз удерживает идентичный повтор

Pass/fail-проверка всей цепочки

Не завершайте тест словами «URL открылся» или «эндпоинт вернул 200». Зафиксируйте доказательство на каждом переходе:

ТестУсловие passPass?
Исходный кликТрекер записал новый клик и создал click ID
Исходящий URL оффераСеть получила точный click ID, в значении не осталось {click_id}
Хранение в сетиВ её логе кликов/конверсий видно то же значение в настроенном sub-поле
Сырой постбекВозвращённое значение побайтно совпадает и лежит в допустимом click-ключе
СтатусСырой статус замаплен в правильную каноническую конверсию
ТранзакцияЕсть уникальный ID конверсии, если сеть его предоставляет
ВыручкаPayout является числом и соответствует согласованной бизнес-величине
ПовторТот же transaction не дублирует конверсию или выручку
ОтчётностьКонверсия появилась на исходном клике, кампании и стриме

Используйте Postback URL Builder и S2S-тестер, чтобы собрать callback и получить безопасную тестовую команду. Затем проверьте сырой ingress-лог и финальную строку конверсии. 200 OK показывает только ответ эндпоинта; он не доказывает, что клик найден, статус верен, а payout означает именно то, что вы ожидали.

Полный пример от outbound link до callback есть в гайде по affiliate tracking link. Если click принадлежит Keitaro, используйте отдельную инструкцию по Keitaro postback для subid, status training, payout и tid.

Типичные поломки

  • В проде вернулись фигурные скобки. Отправитель не распознал макрос. Проверьте его документацию и поддерживает ли конкретное поле postback-макросы.
  • Click ID изменил регистр, длину или кодировку. Воспринимайте его как непрозрачную строку. Не парсьте, не обрезайте и не собирайте заново между системами.
  • Вместо click_id возвращается campaign ID. Тысячи кликов схлопываются в одно неуникальное значение, поэтому атрибуции доверять нельзя.
  • Передача вперёд работает, возврат — нет. Макросы URL оффера принадлежат трекеру, а макросы постбека — сети. Направление изменилось, значит изменился и шаблонизатор.
  • Видна только регистрация. Для депозита может быть отдельное поле URL или сырой статус, который никто не замаппил.
  • Каждый retry добавляет выручку. Передайте стабильный transaction ID и дважды повторите идентичный callback.
  • В sub ID записали чувствительные данные. Не передавайте email, телефон, имя или другой прямой идентификатор в query-параметрах. URL регулярно попадают в логи доступа и кабинеты партнёров.

FAQ

subid — это то же самое, что click_id?

Не по определению. click_id описывает роль значения — уникально определить один клик. subid описывает гибкое поле хранения. Sub ID становится носителем click ID только тогда, когда вы намеренно записали туда click ID.

Названия с обеих сторон = должны совпадать?

Нет. click_id={subid} корректен, если получатель ожидает click_id, а отправитель хранит ваше значение клика под subid. Важно совпадение подставленного значения.

Можно ли использовать один Postback URL для всех статусов?

Да, если сеть подставляет макрос статуса, а трекер маппит все нужные вам значения. Если сеть даёт отдельные callback-поля для разных целей, настройте каждое явно.

Почему постбек вернул 200, но конверсия не появилась?

Многие эндпоинты намеренно отвечают общим success даже на некорректный, неизвестный или дублированный callback — чтобы не создавать retry storm и не раскрывать внутреннее состояние. Проверьте ingress result, поиск клика, маппирование статуса и финальную запись конверсии.

Ментальная модель, которая не устаревает

Не запоминайте все варианты написания макросов. Вместо этого проследите владельцев:

  1. Кто создаёт значение click ID?
  2. Под каким ключом следующая система его принимает и хранит?
  3. Каким макросом эта система возвращает сохранённое значение?
  4. Какой входящий ключ принимает трекер?
  5. Какой transaction ID не даёт повтору превратиться в лишнюю выручку?

Когда эти пять ответов записаны, разный синтаксис трекеров перестаёт быть загадкой. Это лишь адаптеры вокруг одного инварианта: один и тот же идентификатор клика должен пройти весь цикл без изменений.

В PWA-воронке к этому циклу добавляются install intent, установка, повторный запуск и push-события. Полная схема показана в материале как PWA-приложения работают в арбитраже, а платформы для такого флоу собраны в сравнении PWA-сервисов для арбитража.

  • параметры postback url
  • макросы постбека
  • click id трекинг
  • sub id трекинг
  • трекинг арбитража