Найти в Дзене
Записки High-Risk CMO

S2S-постбэк из Adjust в Кейтаро.

В Keitaro 11 для записи конверсии обязательны два параметра: subid и status. Если в запросе нет status=..., Keitaro автоматически игнорирует конверсию и пишет в лог.
То же самое — если пришёл неизвестный status, и вы не настроили маппинг/тренировку. Keitaro 11 “из коробки” понимает и отображает:
lead, sale, rejected, registration, deposit, trash + custom conversion types. То есть тезис “в Keitaro только lead/sale/rejected/rebill” для Keitaro 11 уже неактуален (rebill как отдельный тип убрали). В Keitaro 11: если два постбэка приходят с одинаковым status подряд, предыдущая конверсия может быть перезаписана. Чтобы записывать отдельные конверсии — передавайте уникальный tid. В официальной документации Adjust — это ровно то, что нужно: ⚠️ В Adjust нет «официального» синтаксиса вида label[1][2] для этой задачи — используется один label и плейсхолдер {label}. В Keitaro (Offer URL / Redirect) ставим: https://app.adjust.com/TRACKER_TOKEN?label={subid} Но в Keitaro 11 subid в новом формате со
Оглавление

1) Как это должно работать по цепочке

  1. Keitaro принимает клик и генерит свой click id = subid.
  2. Пользователь уходит на Adjust link (https://app.adjust.com/...).
  3. В этот Adjust link мы докидываем label=<keitaro_subid> — чтобы Adjust «запомнил», какой именно клик у нас был.
  4. Когда Adjust фиксирует install или in-app event, он шлёт server callback на URL Keitaro:
    https://ваш-домен/<postback_key>/postback?subid=...&status=...
  5. Keitaro по subid находит клик и записывает конверсию.

В Keitaro 11 для записи конверсии обязательны два параметра: subid и status.

2) Что важно именно в Keitaro 11 (чтобы не “не работает”)

2.1. Keitaro 11 теперь игнорирует постбэки без status

Если в запросе нет status=..., Keitaro автоматически игнорирует конверсию и пишет в лог.
То же самое — если пришёл неизвестный status, и вы не настроили маппинг/тренировку.

2.2. Набор “дефолтных” статусов/типов конверсий в Keitaro 11

Keitaro 11 “из коробки” понимает и отображает:
lead, sale, rejected, registration, deposit, trash +
custom conversion types.

То есть тезис “в Keitaro только lead/sale/rejected/rebill” для Keitaro 11 уже неактуален (rebill как отдельный тип убрали).

2.3. Если хотите несколько покупок/депозитов — нужен tid

В Keitaro 11: если два постбэка приходят с одинаковым status подряд, предыдущая конверсия может быть перезаписана. Чтобы записывать отдельные конверсии — передавайте уникальный tid.

3) Как правильно передать click id из Keitaro в Adjust

3.1. Используем label (стандартный параметр Adjust)

В официальной документации Adjust — это ровно то, что нужно:

  • вы задаёте label в ссылке,
  • а потом в коллбэках используете плейсхолдер {label}.

⚠️ В Adjust нет «официального» синтаксиса вида label[1][2] для этой задачи — используется один label и плейсхолдер {label}.

3.2. Пример Adjust ссылки, которую ставим в оффер Keitaro

В Keitaro (Offer URL / Redirect) ставим:

https://app.adjust.com/TRACKER_TOKEN?label={subid}

Но в Keitaro 11 subid в новом формате содержит точки. Keitaro сам рекомендует при необходимости передавать subid с _ вместо . через плейсхолдер {subid:_}.

Поэтому на практике часто лучше так:

https://app.adjust.com/TRACKER_TOKEN?label={subid:_}

4) Как сделать S2S callback из Adjust в Keitaro без слива всего трафика рекламодателя

4.1. Почему нельзя “просто вставить в Global callbacks”

Потому что Global callbacks в Adjust — это коллбэк, который может “покрывать каждый datapoint, который измеряет Adjust”.
Если рекламодатель вставит туда ваш Keitaro URL без фильтров — вы реально получите тонны мусора (органика/другие источники), а рекламодатель — утечку.

4.2. Правильный вариант №1 (рекомендуемый): прикрепить callbacks к конкретной ссылке

Adjust позволяет динамически прикреплять callback URLs прямо к link URL — и тогда коллбэк срабатывает, когда пользователь, атрибутированный к этой ссылке, совершает нужное действие.

Практически это делают через Adjust Encoding Tool (он генерит корректно закодированную ссылку).

Важно: если у тебя нет доступа к Adjust — это делает владелец приложения, потому что “только клиенты Adjust могут создавать ссылки в Adjust dashboard”.

4.3. Правильный вариант №2 (если почему-то упёрлись в глобальные): Conditional callbacks

Adjust поддерживает условные коллбэки:
структура:
method, prefix, {placeholder}, value, callback URL[, body]

Тогда рекламодатель может оставить коллбэк “в общем месте”, но добавить условие, например только для конкретного tracker token ({tracker}) — и вы не получите органику/другие сети.

5) Конкретные URL’ы для Keitaro 11

5.1. Базовый endpoint Keitaro

Keitaro postback URL содержит домен + Postback key (это security/auth) и параметры.

Выглядит так (пример):

https://YOUR-KEITARO-DOMAIN/POSTBACK_KEY/postback

5.2. Install ➜ Keitaro (как “регистрация/инсталл”)

Самый простой и логичный вариант под Keitaro 11:

https://YOUR-KEITARO-DOMAIN/POSTBACK_KEY/postback?subid={label}&status=registration

Почему registration? Потому что это валидный тип/статус в Keitaro 11.
(Если хочешь, можешь слать lead, но registration обычно удобнее для мобайла.)

5.3. Purchase / revenue event ➜ Keitaro (как sale)

Keitaro принимает сумму в payout (или revenue) и валюту в currency.

В Adjust для revenue в callbacks есть плейсхолдеры дохода; пример в документации партнёров показывает revenue={revenue_usd}.

Пример для события покупки:

https://YOUR-KEITARO-DOMAIN/POSTBACK_KEY/postback?subid={label}&status=sale&payout={revenue_usd}&currency=USD&tid={event}_{created_at}

  • {event} — event token (можно использовать для “разведения” разных событий)
  • {created_at} — timestamp события
  • tid=... — чтобы Keitaro записывал каждую покупку отдельно, а не перезаписывал предыдущую.

Да, это уже не “tid={created_at}”, это значительно менее коллизионно, но идеал — см. следующий пункт.

5.4. “Правильный” tid по-взрослому (без коллизий и без дублей от retry)

Лучшее решение — чтобы приложение передавало transaction_id / order_id как event callback parameter (или partner parameter) в Adjust: Adjust прямо пишет, что для события покупки может понадобиться callback-параметр вроде transaction_id.

Дальше два варианта:

  • Вариант A: рекламодатель добавляет transaction_id как callback parameter → Adjust добавит &transaction_id=... в запрос →
    в Keitaro ты в
    Settings → Postback URL → Parameters настраиваешь alias, чтобы transaction_id воспринимался как tid (Keitaro поддерживает алиасы параметров).
  • Вариант B: если это partner parameters → они придут JSON’ом, это менее удобно, обычно выбирают вариант A.

6) Как это реально настроить в Adjust (что просить у рекламодателя)

6.1. Минимум, что должен сделать рекламодатель в Adjust

  1. Создать/выдать тебе Adjust link (tracker token).
  2. В этот link добавить label={subid} (ты это делаешь на стороне Keitaro, если link отдаётся “как есть”).
  3. Прикрепить callbacks к link (лучше через Encoding tool).
  4. Для events — настроить callbacks по каждому event token отдельно.

7) Готовый текст рекламодателю (под Keitaro 11)

Можно отправлять почти дословно:

Привет! Для S2S интеграции Adjust ➜ Keitaro 11 нужно:

  1. Мы передаём click id в Adjust через параметр label в трекинг-ссылке: ... ?label={subid} (значение на клике).
  2. Просьба настроить callbacks на уровне нашей ссылки (не глобально), чтобы коллбэки уходили только по атрибуции на наш tracker token (иначе Global callbacks покрывают все datapoints).
  3. Install callback:
    https://YOUR-KEITARO-DOMAIN/POSTBACK_KEY/postback?subid={label}&status=registration
  4. Event callback(и) по нужным event token (пример purchase):
    https://YOUR-KEITARO-DOMAIN/POSTBACK_KEY/postback?subid={label}&status=sale&payout={revenue_usd}&currency=USD&tid={event}_{created_at}
  5. Если возможно, добавьте transaction_id как callback parameter к purchase-событиям — мы используем его как tid для корректного учёта повторных покупок/ретраев.

8) Быстрый чек-лист “почему не летит”

  • В коллбэке есть status? Без него Keitaro 11 игнорит конверсию.
  • status — один из известных (lead/sale/rejected/registration/deposit/trash) или вы создали custom type / сделали training?
  • subid реально приходит в Keitaro как {label}? (Если label пустой — значит click не ваш или label не передаётся.)
  • Для повторных покупок/депозитов есть уникальный tid?
  • Не воткнули ли ваш URL в global callbacks без фильтра?