Вы отправляете клик в нативное приложение — Telegram-бота, тред Messenger, DM Instagram, чат WhatsApp — и хотите то же самое, что даёт postback в браузерном флоу: чтобы ваш click id ждал на другой стороне, готовый привязать конверсию обратно к точному клику, который её вызвал. Честный ответ — не «да» и не «нет». Это три ответа, и два из них, не являющиеся «да», — не одно и то же утверждение.
Три ответа, а не два
- Доходит — вендор документирует механизм, который его несёт.
- Не доходит — вендор прямо об этом говорит, или во всей опубликованной поверхности его API нет пути для этого.
- Неизвестно — механизм не найден, и заявления вендора, которое бы это исключало, тоже нет.
Свести «не доходит» к «неизвестно» вводит в заблуждение в обе стороны. Сказать байеру «WhatsApp, возможно, это передаёт, мы просто не нашли как» — значит пригласить его и дальше пробовать случайные названия параметров против механизма, для которого задокументировано, что его не существует. Сказать «никто не знает, так же как с WhatsApp» о канале, который действительно недокументирован, не отрицается, а просто не проверен, — значит выбросить канал, который на самом деле мог бы работать. Это различие и есть суть этого материала. Всё ниже раскладывается в одну из первых двух корзин, потому что именно за ними стоят доказательства.
Доходит
| Форма ссылки | Механизм | Условия |
|---|---|---|
https://t.me/<bot>?start=<payload> | доставляется боту как аргумент /start | payload до 64 символов base64url; посетитель должен тапнуть START |
https://m.me/<page>?ref=<payload> | messaging_postbacks для нового треда, messaging_referrals для возвращающегося | посетитель должен тапнуть CTA; приложение должно быть подписано на оба webhook-поля; ref ограничен 2083 символами и должен быть URL-encoded; Meta прямо заявляет, что не гарантирует, что referral сработает всегда |
https://ig.me/m/<user>?ref=<payload> | то же семейство, что и m.me | требуются настроенные Icebreakers, опубликованный аккаунт и версия приложения 235 или новее; ref допускает [A-Za-z0-9_=-], до 2083 символов |
Каждая строка здесь несёт условие, и это условие — не мелкий шрифт. Это разница между тем, сработает механизм или нет. Строка Telegram требует настоящего тапа по START, а не просто открытия приложения. Строка Messenger оговорена собственной документацией Meta как то, чего она не гарантирует, а это другое утверждение, чем «работает стабильно». У строки Instagram — три отдельные предпосылки, наложенные одна на другую, прежде чем механизм вообще становится живым для конкретного аккаунта.
Два варианта Telegram стоят вне этой таблицы, потому что ведут себя иначе. ?startapp= принимает до 512 символов, но доставляется на стороне клиента в init data Mini App. Он доходит до сервера только если собственный Mini App оператора сам пересылает и валидирует эти данные, а это делает механизм зависимым от кода, который вы можете не контролировать. ?startchannel вообще не принимает значения. Это голый флаг, в котором нечем нести ваш click id, даже если бы вы этого хотели.
Случай startapp стоит того, чтобы на нём задержаться, потому что это единственный пункт в этом материале, который выглядит так, будто относится к «доходит», а ведёт себя скорее как «доходит условно, и условие — ваша собственная инфраструктура». Payload действительно каждый раз доходит до клиента, внутри init data Mini App. Станет ли он когда-нибудь чем-то, что видит ваш сервер, зависит целиком от того, читает ли код Mini App, работающий внутри клиента Telegram, эти init data и передаёт ли их дальше. Если Mini App принадлежит партнёру, а не вам, click id может просидеть перед устройством посетителя всю сессию и так и не уйти дальше.
Не доходит
WhatsApp — тот канал, который байеры чаще всего считают рабочим, потому что wa.me/<phone>?text= выглядит точь-в-точь как ссылка, несущая payload. Это не так. Параметр text только предзаполняет поле сообщения. Посетитель должен нажать «отправить», может сначала отредактировать текст, а входящий webhook в любом случае не несёт никакого объекта referral для органической ссылки. У WhatsApp есть идентификатор клика, ctwa_clid, но его генерирует Meta после рекламного клика, а не устанавливает ссылка. wa.me-ссылка, которую байер строит и распространяет сам, не несёт ничего, что стало бы ctwa_clid по прибытии.
LINE прямо заявляет, что вы не можете определить, как пользователь пришёл подписаться на Official Account, — не недокументировано, а именно заявлено. Discord не показывает атрибуцию по отдельному приглашению и не имеет для этого никакого события, подтверждено в собственном issue-трекере. Список webhook-тем Threads охватывает replies, deletes, mentions и publishes. Никакого messaging-события в этом списке, которое могло бы что-то пронести.
Заявленное отсутствие стоит больше, чем может показаться на первый взгляд. Каждый пункт в этом разделе экономит время на тестировании именно потому, что закрывает поиск, а не оставляет его открытым. Здесь нет порога версии, которого стоит ждать, нет webhook-поля, которое могло бы заработать после изменения настроек, нет неоткрытого названия параметра, которое стоит и дальше пробовать. Собственное заявление LINE, собственный issue-трекер Discord и собственная webhook-документация Threads — каждый из них запирает дверь со стороны вендора, а это другая и более полезная вещь, чем «мы попробовали несколько названий параметров, и ни одно не сработало».
Афилейтские sub ID — совсем другой механизм
| Программа | Параметр | Требование | Где это действительно работает |
|---|---|---|---|
| Amazon | ascsubtag | одобренный афилейт-аккаунт; сама программа — только по приглашению, и механизм публично не задокументирован | ссылки Amazon Associates |
| Shopee | sub_id1–sub_id5 | одобренный афилейт-аккаунт | афилейт-ссылки Shopee |
| Uber | subId1–subId3 | одобренный афилейт-аккаунт, через партнёрскую сеть Impact | le.pxf.io, а не uber.com |
Значения во всех трёх следуют паттерну [A-Za-z0-9], до 255 символов. Они действительно несут значение для каждого клика сквозным образом, но это не тот же канал, что механизмы deep link выше, и путать их — ошибка в обе стороны. Строка Uber — самая острая иллюстрация: идентификатор существует только на ссылках, которые идут через домен le.pxf.io сети Impact. Ссылка, построенная напрямую против uber.com, как бы аккуратно вы ни дописали к ней subId, не несёт ничего, потому что механизм, читающий этот параметр, на этом домене вообще не слушает.
Если ваш трафик — это трафик афилейт-программы, а не органический deep link, именно этот механизм и применяется, и живёт он в совершенно другой части системы вендора, чем что-либо в таблицах выше. Байер, читающий «Amazon несёт sub id» как лицензию дописывать его к любой ссылке amazon.com, применяет механизм афилейт-программы к каналу, к которому тот никогда не относился.
Что это значит для того, как строить ссылку
Колонка «доходит» реальна, и ею стоит пользоваться, но каждый пункт в ней обусловлен чем-то, что вы не контролируете полностью: тапом по конкретной кнопке, правильно настроенной webhook-подпиской, порогом версии приложения или собственной явной негарантией вендора. Ничто из этого не ведёт себя как поле postback, возвращающее ваше значение при каждом хите. Атрибуция, построенная на допущении, что click id deep link доходит с надёжностью уровня postback, будет верной достаточно часто, чтобы выглядеть корректной на тестировании, и провалится именно тогда, когда кампания масштабируется за пределы условий, которые и делали тестирование чистым.
Click id, выживший в приложении, — настоящий сигнал, когда он доходит, а не запасной вариант, на который можно опираться так же, как на внутренний идентификатор собственного трекера. DarkCore трактует ref-параметры deep link как один вход среди нескольких, наряду с sub ID и platform click ID, именно потому, что ни один из них не гарантирован так, как internal click ID. О том, как распределена эта ответственность, — в Click ID vs Sub ID, fbclid, fbc and ttclid.
Практический вывод аккуратно ложится на то же деление на три, с которого начинался этот материал. Там, где ответ «доходит», проектируйте под условие, которое к нему прикреплено, а не в обход него. Там, где ответ «не доходит», перестаньте искать обходной путь, который вендор уже исключил. Там, где честный ответ — «неизвестно», так и скажите, вместо того чтобы округлять его до одного из двух других.
FAQ
Если Meta не гарантирует messaging_referrals, стоит ли на него полагаться вообще?
Относитесь к нему как к бонусному сигналу, а не первичному ключу. Он доходит при задокументированных условиях достаточно часто, чтобы его стоило фиксировать, но собственная документация Meta останавливается, не доходя до гарантии. Постройте атрибуцию так, чтобы отсутствующий referral ничего не ломал, а не так, будто он — источник истины.
Можно ли использовать ctwa_clid для органических ссылок WhatsApp?
Нет. Его генерирует Meta специально после рекламного клика. wa.me-ссылка, распространённая органически — в био, посте, сообщении, — не имеет за собой рекламного клика, поэтому ctwa_clid ей получить неоткуда.
Должен ли payload ref быть URL-encoded?
Для m.me — да, прямо: поле ограничено 2083 символами и должно быть URL-encoded. Постройте payload с этим кодированием ещё до того, как он попадёт в ссылку, а не трактуйте его как обычную строку в надежде, что платформа нормализует его при получении.
Даёт ли более длинный payload ref больше простора в Instagram, чем в Messenger?
Оба ограничены 2083 символами, так что потолок одинаков в обоих случаях. Отличается всё, что наложено вокруг: механизм Instagram дополнительно требует настроенных Icebreakers, опубликованного аккаунта и версии приложения 235 или новее, и ни одно из этих условий не ослабевает только потому, что payload короткий.