<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Андрей Грач</title>
    <description>The latest articles on DEV Community by Андрей Грач (@__2679865e1c07c).</description>
    <link>https://dev.to/__2679865e1c07c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4206272%2Fba5cc59d-8661-4aa3-b263-6baf57583e04.png</url>
      <title>DEV Community: Андрей Грач</title>
      <link>https://dev.to/__2679865e1c07c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__2679865e1c07c"/>
    <language>en</language>
    <item>
      <title>Ссылки на Telegram-бота с параметром start: считаем источники пользователей на aiogram 3</title>
      <dc:creator>Андрей Грач</dc:creator>
      <pubDate>Sun, 25 Oct 2026 09:10:41 +0000</pubDate>
      <link>https://dev.to/__2679865e1c07c/ssylki-na-telegram-bota-s-paramietrom-start-schitaiem-istochniki-polzovatieliei-na-aiogram-3-4jc7</link>
      <guid>https://dev.to/__2679865e1c07c/ssylki-na-telegram-bota-s-paramietrom-start-schitaiem-istochniki-polzovatieliei-na-aiogram-3-4jc7</guid>
      <description>&lt;p&gt;Бот получает пользователей из рекламы, постов в каналах, партнёрских ссылок и поиска Telegram. Если не размечать эти источники, через месяц непонятно, что из них работает, а что просто съедает бюджет. В Telegram для этого есть встроенный механизм — ссылки с параметром &lt;code&gt;start&lt;/code&gt;. Разберём, как их генерировать, принимать в боте на aiogram 3, хранить и считать, и на каких мелочах легко ошибиться.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как устроена ссылка с параметром start
&lt;/h2&gt;

&lt;p&gt;Обычная ссылка на бота выглядит как &lt;code&gt;https://t.me/your_bot&lt;/code&gt;. Если добавить к ней параметр, получится deep link:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://t.me/your_bot?start=src_dzen_oct
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Когда человек открывает такую ссылку и нажимает «Запустить», бот получает сообщение &lt;code&gt;/start src_dzen_oct&lt;/code&gt;. Всё, что после пробела, — ваша метка.&lt;/p&gt;

&lt;p&gt;Ограничения у параметра такие:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;не длиннее 64 символов;&lt;/li&gt;
&lt;li&gt;только латиница, цифры, &lt;code&gt;_&lt;/code&gt; и &lt;code&gt;-&lt;/code&gt; — без пробелов, кириллицы, точек и &lt;code&gt;=&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если в метку нужно положить что-то сложнее, её кодируют в base64url. aiogram умеет делать это сам, но помните: после кодирования строка становится длиннее примерно на треть, и лимит в 64 символа применяется уже к закодированному значению.&lt;/p&gt;

&lt;p&gt;Подробно про форматы ссылок, &lt;code&gt;startgroup&lt;/code&gt; для групп и отдельные ссылки для рекламы мы писали в статье &lt;a href="https://boosttelega.online/blog/kak-sdelat-ssylku-na-telegram-bota" rel="noopener noreferrer"&gt;как сделать ссылку на Telegram-бота с параметром Start&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Генерируем ссылки
&lt;/h2&gt;

&lt;p&gt;Для простых меток кодирование не нужно — читаемые значения удобнее разбирать в отчётах:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiogram&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Bot&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiogram.utils.deep_linking&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_start_link&lt;/span&gt;

&lt;span class="n"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dzen_oct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tg_ads_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;partner_ivan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seo_blog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_links&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;create_start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SOURCES&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если метка содержит недопустимые символы, передайте &lt;code&gt;encode=True&lt;/code&gt; — aiogram закодирует её в base64url:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;create_start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;promo:october/2026&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Принимаем параметр в боте
&lt;/h2&gt;

&lt;p&gt;В aiogram 3 для этого есть фильтр &lt;code&gt;CommandStart(deep_link=True)&lt;/code&gt; и объект &lt;code&gt;CommandObject&lt;/code&gt;, в котором лежит сам параметр:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiogram&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiogram.filters&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CommandObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CommandStart&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiogram.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@router.message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CommandStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deep_link&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_with_source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CommandObject&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;save_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет! Рад, что вы здесь.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@router.message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CommandStart&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_plain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;save_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет! Рад, что вы здесь.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Порядок важен: обработчик с &lt;code&gt;deep_link=True&lt;/code&gt; должен стоять раньше обычного &lt;code&gt;/start&lt;/code&gt;, иначе метки до него не дойдут. Если вы кодировали метку, раскодируйте её через &lt;code&gt;decode_payload&lt;/code&gt; из &lt;code&gt;aiogram.utils.deep_linking&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Храним первый источник пользователя
&lt;/h2&gt;

&lt;p&gt;Для начала хватит SQLite. &lt;code&gt;INSERT OR IGNORE&lt;/code&gt; сохраняет только первый источник — так вы не перезапишете метку, если человек потом откроет бота по другой ссылке:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bot.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CREATE TABLE IF NOT EXISTS users (&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; user_id INTEGER PRIMARY KEY,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; source TEXT,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; first_seen TEXT DEFAULT CURRENT_TIMESTAMP)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSERT OR IGNORE INTO users (user_id, source) VALUES (?, ?)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;direct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Считаем, какой источник работает
&lt;/h2&gt;

&lt;p&gt;Сколько пользователей пришло из каждого источника за последний месяц:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;first_seen&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'now'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-30 days'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Число запусков — только половина картины. Добавьте таблицу целевых действий (оплата, заявка, подписка на канал) и считайте конверсию по источникам: часто дешёвый источник приводит много людей, которые ничего не делают дальше. Какие ещё показатели стоит смотреть, мы разобрали в статье про &lt;a href="https://boosttelega.online/blog/statistika-telegram-bota" rel="noopener noreferrer"&gt;статистику Telegram-бота&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Подводные камни
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Метку видит пользователь.&lt;/strong&gt; Не кладите в неё ID заказов, промокоды и любые данные, которые нельзя показывать.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Одна ссылка — один источник.&lt;/strong&gt; Если одну и ту же ссылку поставить и в рекламу, и в пост, данные смешаются.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Не все приходят по ссылке.&lt;/strong&gt; Часть людей найдёт бота через поиск Telegram или по имени — они попадут в &lt;code&gt;direct&lt;/code&gt;, и это нормально.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Лимит считают после кодирования.&lt;/strong&gt; Длинная метка с &lt;code&gt;encode=True&lt;/code&gt; легко вылезает за 64 символа.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Метрика, которую видят все: monthly users
&lt;/h2&gt;

&lt;p&gt;В профиле бота Telegram показывает, сколько людей пользовались им за месяц. Эту цифру видит каждый, кто открывает бота, и по ней судят, живой ли он. По наблюдениям владельцев ботов, активная аудитория помогает и в поиске Telegram, где боты конкурируют за те же ключевые слова, что и каналы. Пошаговый план мы собрали в статье &lt;a href="https://boosttelega.online/blog/kak-prodvigat-telegram-bota" rel="noopener noreferrer"&gt;как продвигать Telegram-бота&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Когда нужно поднять этот счётчик под конкретный ключ, используют &lt;a href="https://boosttelega.online/order/bot-start-premium" rel="noopener noreferrer"&gt;Premium Bot Start&lt;/a&gt; — запуски бота аккаунтами с Telegram Premium. Удобная деталь для разработчика: заказ принимает ссылку с параметром &lt;code&gt;start&lt;/code&gt;. Дайте такому заказу отдельную метку, например &lt;code&gt;?start=src_premium_test&lt;/code&gt;, — и эти пользователи будут в вашей аналитике отдельной строкой, их легко сравнить с остальными источниками. Для простого первого объёма есть обычные &lt;a href="https://boosttelega.online/order/bot-start" rel="noopener noreferrer"&gt;старты бота&lt;/a&gt;, а прикинуть, сколько Premium-аудитории нужно под ваш ключ, помогает &lt;a href="https://boosttelega.online/telegram-search-calculator" rel="noopener noreferrer"&gt;калькулятор поиска Telegram&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Чек-лист
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Для каждого источника — своя ссылка &lt;code&gt;?start=src_...&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Метки из латиницы, цифр, &lt;code&gt;_&lt;/code&gt; и &lt;code&gt;-&lt;/code&gt;, не длиннее 64 символов; сложные — через &lt;code&gt;encode=True&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Обработчик &lt;code&gt;CommandStart(deep_link=True)&lt;/code&gt; стоит раньше обычного &lt;code&gt;/start&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;В базе хранится первый источник пользователя.&lt;/li&gt;
&lt;li&gt;Источники сравниваются по конверсии в целевое действие, а не только по числу запусков.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Больше материалов про продвижение каналов и ботов в Telegram — в блоге &lt;a href="https://boosttelega.online/" rel="noopener noreferrer"&gt;BoostTelega&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>telegram</category>
      <category>python</category>
      <category>bot</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
