Контракт из двух шагов
- Принять
click_idв адресе посадочной страницы и сохранить его рядом с заказом — так, чтобы он пережил закрытие вкладки. - В момент целевого действия отправить серверный запрос с этим
click_id, идентификатором заказа и подписью.
Больше от рекламодателя ничего не требуется. Адрес приёмника, секрет и список целей выдаёт кабинет сети — они разные у разных сетей, поэтому здесь их нет.
Два метода на выбор
POST телом запроса:
POST https://<приёмник сети>/cpa/postback/<offer_id>
Content-Type: application/json
{
"click_id": "clk_01HXVB...",
"external_id": "order-10245",
"status": "sale",
"sum": 12000,
"goal": "sale",
"signature": "<hex(HMAC-SHA256(secret, canonical))>"
} GET параметрами — если CRM умеет только «дёрнуть ссылку»:
GET https://<приёмник сети>/cpa/postback/<offer_id>?click_id=clk_01HXVB...&external_id=order-10245&status=sale&sum=12000&signature=... Оба пути ведут в один приёмник и дают одинаковый результат. Метод фиксируется в журнале попыток, поэтому при разборе видно, каким именно способом пришёл запрос.
Параметры
| Параметр | Обязателен | Что означает |
|---|---|---|
click_id | да | Идентификатор перехода — пришёл в адресе вашей посадочной страницы. |
external_id | да | Ваш идентификатор заказа. По нему считается идемпотентность: повтор не создаёт вторую конверсию. |
status | да | Статус действия на вашей стороне. Сопоставление со статусами сети настраивается в кабинете. |
sum | зависит | Сумма заказа. Обязательна для моделей, где вознаграждение считается процентом. |
goal | нет | Код цели воронки. Без него конверсия относится к цели по умолчанию. |
signature | да | Подпись запроса секретом оффера. |
Подпись
Запрос подписывается секретом оффера, который выдаётся в кабинете и может быть заменён без переустановки интеграции. Подпись, а не список разрешённых адресов: адрес меняется при каждом переезде инфраструктуры, а секрет переживает переезд.
Цели воронки
Внутри одного оффера может быть несколько шагов — регистрация,
промежуточная веха, оплата. Каждый приходит своим постбэком с параметром
goal; дедупликация считается по тройке «сеть — заказ — цель»,
поэтому оплата не перетирает регистрацию, а порядок прихода не важен.
Веха — цель за ноль. Она не создаёт вознаграждения и не расходует лимит, но показывает доходимость: где именно ломается воронка, видно до того, как рекламодатель начнёт массово отклонять конверсии.
Коды ответа
| Код | Что произошло |
|---|---|
400 | Не хватает обязательного параметра или он не разобрался. |
401 | Подпись не сошлась: чаще всего секрет от другого оффера или изменён порядок полей при подписании. |
404 | Переход с таким идентификатором не найден. Строка сохраняется в журнале как «не найден» и обновится при повторном постбэке с валидным идентификатором. |
409 | Заказ с этим идентификатором уже принят. Это не ошибка интеграции: повторная отправка безопасна и намеренно не создаёт вторую конверсию. |
410 | Окно атрибуции истекло — с момента перехода прошло больше, чем допускают условия оффера. |
Проверка до запуска трафика
В кабинете есть тестер: он отправляет настоящий постбэк через настоящий приёмник с настоящей подписью, то есть проверяет ровно тот путь, по которому пойдут боевые запросы. Строки, созданные тестером, помечаются тестовыми и не попадают ни в статистику, ни в рейтинг оффера.
Запускать трафик до успешной проверки не стоит: первые переходы уйдут в никуда, а восстанавливать доверие партнёров дороже, чем потратить час на тест.
Если конверсия не засчиталась
Журнал попыток хранит каждый запрос — включая отклонённые — с методом, параметрами и кодом ошибки, и доступен обеим сторонам. Разбор «мы шлём, вы не получаете» сводится к чтению одной строки.
Полная инструкция с примерами под конкретные CRM — в справке кабинета, раздел о постбэках. Обзор того, как это устроено со стороны сети, — приём конверсий по S2S; что происходит с конверсией дальше — холд и подтверждение.