Генератор UTM-меток для Telegram (до 64 байт)
Создавайте и сжимайте диплинки (deep links) в формат URL-safe Base64 без превышения жесткого лимита в 64 байта для корректной работы Telegram-ботов. Включает контроль длины на лету и готовый скрипт сквозного проброса меток с сайта в бота.
Конструктор ссылок с контролем размера
Сформируйте диплинк за 3 простых шага: укажите целевой адрес, выберите рекламный источник и скопируйте готовый URL-safe Base64 код.
start передается в бот при нажатии кнопки «Запустить».
Скрипт сквозного проброса меток (Tilda / Web)
Если вы ведете платный трафик на лендинг, а целевым действием является переход в Telegram-бота, метки из адресной строки пользователя потеряются при клике по кнопке. Скрипт ниже автоматически подхватывает параметры страницы и дописывает их ко всем исходящим ссылкам на сайте.
<!-- Скрипт сквозного проброса UTM-меток (AiSAGE) -->
<script>
document.addEventListener('DOMContentLoaded', function() {
// 1. Получаем строку запроса из URL страницы
var queryString = window.location.search;
// 2. Если параметры существуют, обрабатываем ссылки
if (queryString) {
var allLinks = document.querySelectorAll('a');
allLinks.forEach(function(link) {
var href = link.getAttribute('href');
// Пропускаем якорные ссылки (#) и системные вызовы
if (href && !href.startsWith('#') && !href.startsWith('javascript:')) {
// Корректно объединяем через ? или &
if (href.indexOf('?') !== -1) {
link.href = href + '&' + queryString.substring(1);
} else {
link.href = href + queryString;
}
}
});
}
});
</script>
- Добавьте на страницу лендинга блок T123 (HTML-код) из категории «Другое».
- Вставьте скопированный скрипт в блок и нажмите «Сохранить и закрыть».
- Опубликуйте страницу. Теперь при переходе на
yoursite.ru/?utm_source=yandexвсе ссылки на странице автоматически получат этот параметр.
Почему Telegram ограничивает параметр 64 байтами?
В протоколе Telegram Bot API команда /start [payload] жестко ограничена спецификацией: длина параметра start не может превышать 64 байта (ASCII-символов). Если попытаться передать обычную строку utm_source=yandex&utm_medium=cpc&utm_campaign=brand, ссылка моментально превысит лимит, и Telegram просто отбросит параметр. Пользователь попадет в бота, но бот получит пустой старт.
Таблица сокращения ключей параметров
| Стандартный ключ | Короткий ключ | Назначение | Пример значения |
|---|---|---|---|
utm_source |
s |
Источник трафика | ya, tg, vk |
utm_medium |
m |
Тип рекламы / Канал | cpc, post, story |
utm_campaign |
c |
Название рекламной кампании | sale, web26 |
utm_content |
o |
Идентификатор креатива/баннера | b1, v2 |
utm_term |
t |
Ключевое слово / таргетинг | agent, vibe |
referralCode |
r |
ID партнера / Реферальный код | usr99, p12 |
Как Telegram-бот декодирует метки на сервере
При нажатии на кнопку «Запустить» бот получает событие с текстом команды, например: /start c315YSZtPWNwYyZjPXNhbGU. Бот берет полезную нагрузку, восстанавливает URL-safe Base64 и парсит querystring.
import base64
from urllib.parse import parse_qs
def decode_utm_payload(payload: str) -> dict:
"""Декодирует URL-safe Base64 payload из команды /start в Telegram боте"""
try:
# Восстанавливаем паддинг '=' до кратности 4
padded = payload + '=' * (-len(payload) % 4)
# Декодируем URL-safe Base64 (- на +, _ на /)
raw_bytes = base64.urlsafe_b64decode(padded)
decoded_query = raw_bytes.decode('utf-8')
# Парсим параметры s, m, c, o, t, r
parsed = parse_qs(decoded_query)
return {
'utm_source': parsed.get('s', [None])[0],
'utm_medium': parsed.get('m', [None])[0],
'utm_campaign': parsed.get('c', [None])[0],
'utm_content': parsed.get('o', [None])[0],
'utm_term': parsed.get('t', [None])[0],
'referral_code': parsed.get('r', [None])[0],
}
except Exception as e:
return {}
# Пример в aiogram 3:
# @dp.message(CommandStart(deep_link=True))
# async def start_handler(message: Message, command: CommandObject):
# utm = decode_utm_payload(command.args)
# print("Источник рекламы:", utm.get('utm_source'))
function decodeUtmPayload(payload) {
try {
// Восстанавливаем символы Base64 и выравнивание
let base64 = payload.replace(/-/g, '+').replace(/_/g, '/');
while (base64.length % 4) base64 += '=';
const decoded = Buffer.from(base64, 'base64').toString('utf-8');
const params = new URLSearchParams(decoded);
return {
utm_source: params.get('s'),
utm_medium: params.get('m'),
utm_campaign: params.get('c'),
utm_content: params.get('o'),
utm_term: params.get('t'),
referral_code: params.get('r')
};
} catch (err) {
return null;
}
}
// Пример в grammY:
// bot.command('start', async (ctx) => {
// const payload = ctx.match;
// const utm = decodeUtmPayload(payload);
// });
Вопросы и ответы о диплинках в Telegram
?start=ПАРАМЕТР. Знаки амперсанда (&) и вопроса внутри этого значения парсер Telegram игнорирует либо ломает. Кроме того, длина параметра жестко ограничена 64 байтами. Перевод в URL-safe Base64 решает обе проблемы: убирает спецсимволы и позволяет уместить до 5–6 сокращенных параметров в один компактный токен.
?start= окажется длиннее 64 байт, клиент Telegram просто проигнорирует параметр. Пользователь откроет бота, нажмет кнопку «Запустить», но бот получит только команду /start без хвоста с метками. Сквозная конверсия и источник трафика будут потеряны. Именно поэтому наш счетчик выделяет превышение красным цветом.
+ и /, а в конце добавляется знак равенства = для выравнивания. В URL адресной строки символ + заменяется на пробел, а / ломает структуру пути. В URL-safe Base64 (RFC 4648) плюсы заменяются на дефисы (-), слэши на подчеркивания (_), а концевые знаки = просто обрезаются. Это гарантирует 100% стабильность ссылки в любых мессенджерах.
c=direct_msk вместо c=директ_москва).
Получите персональный план и оценку задачи
за 1 день
Напишите, какую задачу нужно решить: запустить сервис, внедрить AI-агентов в отдел, прокачать команду или снять ограничения роста. Отвечу лично и предложу пошаговый план.