Ви відправляєте клік у нативний застосунок — 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 короткий.