Есть одна боль, знакомая почти всем, кто ведёт рекламу и общается с клиентами через Telegram.
Реклама работает.
Переходы есть.
Люди пишут в бота.
А вот понять, какая именно кампания привела человека — невозможно.
Пользователь ушёл с сайта в Telegram — и всё, источник потерян.
Ни Яндекс, ни Telegram «по умолчанию» эту задачу не решают.
Мы столкнулись с этим ровно в таком виде — и решили вопрос простым, но надежным способом.
В чём вообще проблема
Если говорить простыми словами, то utm метки telegram не сохраняются автоматически.
Пока пользователь на сайте — всё прекрасно:
- utm_source есть,
- utm_campaign есть,
- аналитика работает.
Но как только происходит переход в Telegram — цепочка рвётся.
А вместе с ней пропадает и utm source telegram.
В результате:
- заявки есть,
- диалоги есть,
- а управлять рекламой приходится почти «на ощупь».
Что мы хотели получить
Нам было важно решить задачу без избыточной сложности:
- сохранить utm telegram при переходе в бот
- понимать источник каждого диалога
- использовать данные в CRM
- обойтись без серверов и API
- сделать решение универсальным — под любой сайт
И главное — чтобы всё это работало незаметно для пользователя.
Какое решение в итоге используем
Мы пошли самым прямым путём.
На сайт добавляется небольшой JavaScript-код, который:
- считывает utm метки telegram из URL
- находит ссылки на Telegram-бота
- автоматически добавляет к ним параметр start
- передаёт utm source telegram в момент первого запуска бота
Для пользователя это выглядит как обычный переход в Telegram.
Никаких форм, кликов или «магии» — просто работает.
Как это выглядит на практике
Допустим, человек пришел на сайт по рекламной ссылке:
site.ru/?utm_source=telegram&utm_medium=yandex&utm_campaign=promo
Скрипт сам преобразует ссылку на бота в формат:
https://t.me/имя_бота?start=s_telegram-m_yandex-c_promo
Когда пользователь запускает бота, Telegram передаёт команду:
/start s_telegram-m_yandex-c_promo
И вот тут происходит главное:
utm telegram попадает в бота в явном виде.
Дальше с этим параметром можно делать что угодно:
- сохранить в базе,
- передать в CRM,
- использовать для аналитики,
- связать диалог с рекламной кампанией.
Важный нюанс, о котором часто забывают
Параметр start передается только при первом запуске бота.
Если пользователь потом вернётся в диалог напрямую —
utm метки telegram не перезапишутся, и это нормально.
Так Telegram и задуман, и именно так данные остаются корректными.
Что нужно сделать на сайте
На самом деле — минимум:
- Вставить JavaScript-код на страницу
Оставить обычную ссылку на Telegram-бота
https://t.me/имя_бота
Скрипт сам:
- найдёт нужные ссылки,
- добавит utm source telegram,
- обновит их даже при динамической вёрстке.
Работает в:
- Tilda
- WordPress
- Webflow
- самописных сайтах
Когда это решение действительно работает
Всё корректно отрабатывает, если:
- пользователь приходит с utm telegram
- на странице есть ссылка на бота
- бот поддерживает /start
- используются допустимые символы
- нужна нормальная аналитика, а не догадки
Что мы в итоге получили
После внедрения:
- каждый диалог в Telegram имеет источник
- реклама перестает быть «черным ящиком»
- появляется нормальная аналитика
- управленческие решения принимаются по данным
Принцип простой:
UTM → сайт → Telegram → /start → сохранение источника.
Для агентства или бизнеса это не «фишка», а базовый уровень контроля маркетинга.
Вот сам код, неизменно вставляйте его и наслаждайтесь еще более точными данными в аналитике.
Этот скрипт сам найдет все ссылки на телеграм бота и добавит к ним данные из UTM меток
- в <head>
- перед </body>
- в кастомный HTML/JS-блок (Tilda, WordPress, Webflow, самописные сайты)
<script>
(function () {
const params = new URLSearchParams(location.search);
const src = params.get('utm_source') || '';
const med = params.get('utm_medium') || '';
const cmp = params.get('utm_campaign') || '';
if (!src && !med && !cmp) return;
const clean = (v, max) =>
v.toString()
.trim()
.replace(/\s+/g,'-')
.replace(/[^A-Za-z0-9_-]/g,'')
.slice(0, max);
const payload = (
`s_${clean(src,12)}-m_${clean(med,12)}-c_${clean(cmp,24)}`
).slice(0,64).replace(/-$/,'');
const buildHref = (href) => {
try {
const url = new URL(href);
if (!/^(t\.me|telegram\.me)$/.test(url.hostname)) return null;
const parts = url.pathname.split('/').filter(Boolean);
if (!parts[0]) return null;
return `https://t.me/${parts[0]}?start=${payload}`;
} catch {
return null;
}
};
const updateLinks = () => {
document.querySelectorAll('a[href*="t.me/"], a[href*="telegram.me/"]').forEach(a => {
const newHref = buildHref(a.href);
if (newHref && a.href !== newHref) {
a.href = newHref;
}
});
};
updateLinks();
const observer = new MutationObserver(updateLinks);
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true
});
})();
</script>
Бонус
Для тех, кто не хочет собирать UTM вручную, мы сделали онлайн-генератор UTM-меток для Telegram — бесплатный и уже готовый к работе:
👉 https://utm.dfaktor.ru
#seo #маркетинг