Legan Studio
Все статьи
~ 12 мин чтения

Реферальная программа в Telegram-боте

Как сделать рабочую реферальную программу в Telegram-боте: deep links через start-параметр, начисления, антифрод и интеграция с платежами.

  • Telegram
  • продажи
  • конверсия

Реферальная программа — самый дешёвый канал привлечения для бота, потому что приводят пользователей сами клиенты. Telegram даёт удобный механизм через start-параметр в ссылке: t.me/your_bot?start=ref123. Разберём, как собрать программу, которая работает и не уходит в минус из-за фрода — от схемы БД до антифрода, метрик и юридической обвязки.

Зачем вообще реферал

Маркетинг через таргет в РФ дорожает: средний CAC в нишах SaaS, EdTech и e-commerce — 1500–8000 ₽ за активного. Реферальная программа стабильно даёт CAC в 2–5 раз ниже paid, потому что приглашение — это рекомендация от знакомого, а не холодный креатив.

Главные плюсы:

  • CAC ниже — платите фиксированный бонус, а не аукцион.
  • Конверсия в платёж выше — приглашённый идёт с социальным доказательством.
  • Viral coefficient k — если каждый пользователь приводит больше одного активного, рост экспоненциальный (см. метрики ниже).
  • LTV приглашённых часто выше — пришли осознанно через знакомого, а не через клик по баннеру.

Минусы — фрод, дополнительная нагрузка на саппорт и юридические нюансы. Решаемо, но игнорировать нельзя.

Механики вознаграждения

МеханикаКомуКогда использовать
Bring-a-friendОбоим скидка/бонусРазовые покупки, e-commerce
Revshare% с покупок рефералаПодписки, SaaS
PointsБаллы за каждого активногоГеймификация, лояльность
Tier-systemУровни (бронза/серебро/золото)Сообщества, статусные продукты
Milestone«Приведи 5 друзей — премиум на месяц»Boost старта, сезонные кампании
StarsНаграда в Telegram StarsКонтент, подписки внутри Telegram

Двусторонняя награда (и рефереру, и приглашённому) работает в среднем на 30–80% лучше односторонней — у приглашённого есть осязаемый стимул нажать «Начать», а не закрыть бот.

Лучший выбор зависит от продукта. Для подписочного сервиса — revshare. Для разового продукта — bring-a-friend. Для сообществ — tier и points. Начинайте с одной простой механики и одного уровня вознаграждения.

Когда пользователь открывает ссылку t.me/your_bot?start=ref_USER_ID и нажимает «Начать», бот получает /start ref_USER_ID. В апдейте это первый текст сообщения. Парсим payload — это и есть код реферера.

Фиксируем связь: новый пользователь B пришёл от A. Запись хранится в БД на всё время — связь не должна теряться.

Важно:

  • Payload приходит только при первом /start. Если пользователь уже общался с ботом, его реферал засчитан раньше.
  • Длина payload — до 64 символов, только латиница, цифры, _, -.
  • Не передавайте чувствительное — payload виден всем, кто откроет ссылку.

Генерация ссылки:

def make_ref_link(bot_username: str, user_id: int, source: str = "share") -> str:
    payload = f"ref_{user_id}_{source}"
    # ограничение Telegram — 64 символа на payload
    assert len(payload) <= 64
    return f"https://t.me/{bot_username}?start={payload}"

Парсинг /start с payload

import re
from aiogram import Router, types

router = Router()
PAYLOAD_RE = re.compile(r"^ref_(\d+)(?:_([a-zA-Z0-9-]+))?$")

@router.message(commands=["start"])
async def on_start(message: types.Message):
    parts = message.text.split(maxsplit=1)
    payload = parts[1] if len(parts) > 1 else None

    user_id = message.from_user.id
    referrer_id, source = None, None

    if payload:
        m = PAYLOAD_RE.match(payload)
        if m:
            referrer_id = int(m.group(1))
            source = m.group(2) or "direct"

    await register_user(
        user_id=user_id,
        referrer_id=referrer_id if referrer_id != user_id else None,
        source=source,
    )

Проверка referrer_id != user_id — базовая защита от самореферала через свою же ссылку.

Модель данных

Минимальная схема:

CREATE TABLE referrals (
    id           BIGSERIAL PRIMARY KEY,
    referrer_id  BIGINT NOT NULL,
    invitee_id   BIGINT NOT NULL UNIQUE,
    source       TEXT,
    status       TEXT NOT NULL DEFAULT 'pending',
    reward_paid  NUMERIC(10,2) DEFAULT 0,
    created_at   TIMESTAMPTZ DEFAULT now(),
    activated_at TIMESTAMPTZ,
    paid_at      TIMESTAMPTZ
);

CREATE INDEX ON referrals (referrer_id);
CREATE INDEX ON referrals (status);

Статусы: pending (просто пришёл), activated (сделал ключевое действие), paid (бонус начислен), rejected (фрод/возврат).

UNIQUE на invitee_id гарантирует, что один и тот же пользователь не может быть «приведён» дважды.

Атрибуция: first-touch vs last-touch

Если пользователь открыл бот по ссылке A, не нажал «Начать», через неделю открыл по ссылке B и активировался — кому засчитывать?

  • First-touch — кто привёл первым, тот и получает бонус. Логика проще, но у новичков может теряться payload.
  • Last-touch — кто привёл последним перед активацией. Сложнее технически (нужно хранить все «касания»), зато справедливее к тому, кто реально дожал.

Чаще используют first-touch с окном атрибуции 30 дней: если за 30 дней с момента первого /start пользователь не активировался — связь обнуляется, считаем органикой.

Антифрод

Реферальная программа всегда привлекает любителей крутить. Минимум защиты:

  • Активация после действия. Не платим за сам факт /start, платим только если приглашённый сделал ключевое действие (оплата, регистрация компании, прохождение онбординга).
  • Один аккаунт на устройство. По телефону, IP, fingerprint браузера в Mini App. Эвристика: если за час с одного IP пришло 10 «приглашённых» — флаг.
  • Лимит N приглашений в день. До 10–50 рефералов в сутки на аккаунт. Защищает от ботоводов.
  • Запрет самореферала. referrer_id != invitee_id плюс проверка по cookie/устройству.
  • Запрет круговых рефералов. A пригласил B, B «приглашает» A — бан обоих.
  • Холд-период. Бонусы начисляются через 7–14 дней — успеваем отловить возвраты и накрутки.

Пример проверки на фрод перед начислением:

async def can_pay_reward(referrer_id: int, invitee_id: int) -> tuple[bool, str]:
    if referrer_id == invitee_id:
        return False, "self_referral"

    # лимит в сутки
    today_count = await db.fetchval(
        "SELECT count(*) FROM referrals "
        "WHERE referrer_id = $1 AND created_at > now() - interval '1 day'",
        referrer_id,
    )
    if today_count > 50:
        return False, "daily_limit"

    # круговой реферал
    reverse = await db.fetchval(
        "SELECT 1 FROM referrals WHERE referrer_id = $1 AND invitee_id = $2",
        invitee_id, referrer_id,
    )
    if reverse:
        return False, "circular"

    # проверка ключевого действия
    activated = await db.fetchval(
        "SELECT activated_at FROM referrals WHERE invitee_id = $1",
        invitee_id,
    )
    if not activated:
        return False, "not_activated"

    return True, "ok"

Оставлять программу полностью открытой — гарантированно слить бюджет на ботоводов из условного Telegram-чата «лёгкие деньги».

Уведомления рефереру

Сразу после события — короткое сообщение в бот:

  • «Ваш друг присоединился» — при /start с payload.
  • «Друг прошёл онбординг» — при активации.
  • «Вам начислено 300 ₽ / 50 баллов» — при выплате после холда.

Это ключевой триггер вирального цикла: пользователь видит, что система работает, и шарит ссылку дальше.

Mini App с дашбордом

Реферальный экран лучше делать в Mini App — там удобнее показывать статистику и кнопки шеринга.

БлокСодержимое
Личная ссылкаt.me/bot?start=ref_USER_ID + кнопка «Поделиться»
Статистикаприглашено / активировано / на холде
Выплатызаработано всего, история начислений
Leaderboardтоп-100 рефереров недели/месяца
Условияразмер награды, холд, ограничения

Leaderboard добавляет геймификации: люди соревнуются за позиции, особенно если топ-3 получают бонус сверху.

Шеринг ссылки

В Telegram удобный нативный шеринг через switch_inline_query или t.me/share/url:

const link = `https://t.me/${botUsername}?start=ref_${userId}`;
const text = "Залетай в бот, тут полезно. По моей ссылке нам обоим бонус.";

Telegram.WebApp.openTelegramLink(
  `https://t.me/share/url?url=${encodeURIComponent(link)}` +
  `&text=${encodeURIComponent(text)}`
);

Для офлайна — QR-код прямо в Mini App: пользователь показывает экран, друг сканирует камерой и попадает в бот с уже подставленным payload. Работает на конференциях, в офисе, в кофейне.

A/B-тесты

Что тестируется чаще всего:

  • Размер награды — 100 ₽ vs 300 ₽ vs 10% от чека. Дороже не всегда лучше: на больших суммах включается фрод.
  • Формулировка инвайта — «приглашаю в крутой бот» vs «дам тебе скидку 500 ₽».
  • Дизайн реферального экрана — большая кнопка «Поделиться» vs ссылка с copy-кнопкой.
  • Шеринг через QR vs только ссылка.
  • Двусторонняя vs односторонняя награда.

Минимальная выборка для значимости — 1000+ пользователей в каждой группе. Меньше — не делайте выводов.

Метрики

МетрикаФормулаЦелевое значение
Viral coefficient kinvites_sent × conversion_ratek > 1 — рост экспоненциальный
CAC рефераловсумма выплат / активированныев 2–5 раз ниже paid
LTV рефераловсредний доход с приглашённогосравнить с органикой
PaybackCAC / месячная маржаменее 3 месяцев
Доля рефералов в воронкеактивированные через ref / всегоот 15% — программа жива

Часто 80% рефералов приходят от 5% пользователей — закон Парето в чистом виде. Этих топ-рефереров стоит выделять в отдельный VIP-сегмент: повышенный процент, ранний доступ к фичам, прямой канал связи.

Если k менее 0.3 — программа неинтересна, поднимайте награду или меняйте механику. Если k больше 1 — поздравляем, у вас вирусный продукт, но проверьте, не ботоводы ли это.

Кейсы

  • Dropbox в 2008 — классика. «Пригласи друга — оба получают по 500 МБ к диску». Выросли с 100 тыс. до 4 млн пользователей за 15 месяцев почти без paid.
  • Tinkoff (Т-Банк) — «Приведи друга, получи 500 ₽ на счёт». Десятки миллионов выплат, программа работает уже больше 10 лет.
  • ВкусВилл — «Приведи друга, получи 300 баллов». Двусторонняя, бонусы тратятся внутри.

Общий паттерн: двусторонняя награда, понятный для пользователя бенефит, простой шеринг.

Юридическая обвязка

В пользовательском соглашении нужны:

  • Условия программы и право их изменить.
  • Запрет накрутки и определение того, что считается накруткой.
  • Право заблокировать аккаунт и обнулить бонусы при нарушении.
  • Налоговые обязательства получателя выплат.

Налогообложение бонусов (РФ, ст. 213 НК и подзаконные акты):

  • Если награда — деньги (вывод на карту/счёт), это доход физлица. Платформа удерживает НДФЛ 13% или получатель должен оформить самозанятость / ИП.
  • Если награда — внутренние баллы или скидка, доход не возникает до момента, когда баллы обмениваются на товар/услугу. Скидка не облагается НДФЛ.
  • Stars — Telegram сам разруливает, для бизнеса проще.

Согласие на ПДн друга: когда пользователь шарит ссылку с подставленным контактом друга (например, через автоматический инвайт по номеру), нужно подтверждение, что у него есть согласие. Безопаснее — давать только ссылку, а не отправлять автоинвайт за пользователя.

Многоуровневые программы (MLM) — если структура напоминает финансовую пирамиду, это риск по 172.2 УК РФ. Консультируйтесь с юристом до запуска схемы 3+ уровней.

Многоуровневая программа

Если хотите MLM-схему «реферал моего реферала тоже мне платит», заведите уровни. Стандартно — 2–3 уровня:

  • 1-й уровень — 20% от платежа.
  • 2-й уровень — 5%.
  • 3-й уровень — 2%.

Технически — рекурсивная функция, обходящая дерево рефералов вверх до N уровней. Внимательно с производительностью: при глубине 10+ запросов БД растёт лавинообразно. Кешируйте дерево или храните денормализованно.

Платежи и выплаты

Если реферальные бонусы — реальные деньги, нужен механизм вывода:

  • На карту через ЮMoney, ЮKassa, СБП — потребуется самозанятость или ИП у получателя.
  • На баланс в боте — внутренние бонусы, тратятся внутри сервиса. Самый простой и юридически чистый вариант.
  • Stars — Telegram автоматически переводит с вашего бота на пользователя.

Не делайте «выводимый кэш» без юридической обвязки — это уже работа с физлицами как с подрядчиками, и за ней следят налоговая и ЦБ.

Итого

Реферальная программа в Telegram-боте — это start-параметр, БД с привязкой реферера, начисления после ключевого действия, антифрод и понятная юридическая обвязка. Размер вознаграждения подбирайте под маржу продукта; начинайте с одной механики и одного уровня. Двусторонняя награда работает лучше односторонней. Защита от накруток — обязательна. Метрики k, CAC, LTV, payback покажут, живёт ли программа. И не забывайте: 80% результата принесут 5% топ-рефереров — выделяйте их в VIP.

Частые вопросы

Как технически работает реферальная ссылка в Telegram?

Когда пользователь открывает ссылку t.me/your_bot?start=ref_USER_ID и нажимает «Начать», бот получает /start ref_USER_ID. В апдейте это первый текст сообщения. Парсим payload — это и есть код реферера. Фиксируем связь: новый пользователь B пришёл от A. Запись хранится в БД на всё время. Важно: payload приходит только при первом /start (если пользователь уже общался с ботом, его реферал засчитан раньше); длина payload до 64 символов, только латиница, цифры, _, -; не передавайте чувствительное — он виден всем, кто откроет ссылку.

Какие модели вознаграждения за рефералов работают лучше всего?

Шесть основных механик. Bring-a-friend — скидка обоим, для разовых покупок. Revshare — процент с покупок реферала, для подписочных сервисов. Points — баллы за каждого активного, для геймификации. Tier-системы — уровни бронза/серебро/золото для статусных продуктов. Milestone «приведи 5 друзей — премиум на месяц» для буста старта. Stars — награда в Telegram Stars для контента и подписок внутри Telegram. Двусторонняя награда (и рефереру, и приглашённому) в среднем на 30–80% эффективнее односторонней. Начинайте с одной простой механики и одного уровня, потом усложняйте.

Как защитить реферальную программу от накруток и фрода?

Минимум защиты: активация после действия — не платим за сам /start, только за оплату или прохождение онбординга. Один аккаунт на устройство — по телефону, IP, fingerprint в Mini App. Лимит 10–50 приглашений в сутки. Запрет самореферала — referrer_id не равен invitee_id плюс проверка по cookie. Запрет круговых рефералов — A пригласил B, B «приглашает» A — бан. Холд-период 7–14 дней до начисления. Эвристика по IP: если за час с одного адреса пришло 10 «приглашённых» — флаг на ручной разбор. Без антифрода программа уйдёт в минус за неделю.

Какие метрики смотреть у реферальной программы?

Пять ключевых. Viral coefficient k = invites_sent × conversion_rate; если k больше 1 — рост экспоненциальный. CAC рефералов — сумма выплат делёная на активированных, должен быть в 2–5 раз ниже paid. LTV рефералов — средний доход с приглашённого, сравниваем с органикой. Payback — CAC делённый на месячную маржу, цель менее 3 месяцев. Доля рефералов в воронке — от 15% значит программа жива. Дополнительно: топ-100 рефереров и их вклад. Часто 80% рефералов приходят от 5% пользователей — этих VIP стоит выделять отдельно.

Как сделать атрибуцию: first-touch или last-touch?

First-touch — кто привёл первым, тот и получает бонус. Логика проще, payload фиксируется при первом /start. Last-touch — кто привёл последним перед активацией; справедливее к тому, кто дожал, но сложнее технически: нужно хранить все «касания» и переписывать привязку при каждом новом payload. Чаще выбирают first-touch с окном атрибуции 30 дней: если за 30 дней с первого /start пользователь не активировался — связь обнуляется, считаем органикой. В обоих случаях храните полный лог касаний, чтобы можно было пересчитать задним числом если поменяете правила.

Какие юридические нюансы у реферальных программ в РФ?

Налогообложение зависит от типа награды. Деньги — это доход физлица: платформа удерживает НДФЛ 13% или получатель оформляет самозанятость/ИП. Внутренние баллы или скидка — доход не возникает до момента обмена баллов на товар; скидка НДФЛ не облагается (ст. 213 НК). Stars — Telegram сам разруливает. Согласие на ПДн друга нужно при автоматических инвайтах по контактам — безопаснее давать только ссылку, без автоотправки. Многоуровневые программы 3+ уровней — риск по 172.2 УК РФ если структура напоминает пирамиду. В пользовательское соглашение добавьте условия программы, право их изменить, определение накрутки, право блокировать аккаунт и налоговые обязательства получателя.

Как организовать выплаты по реферальной программе бота?

Три варианта. На карту через ЮMoney, ЮKassa, СБП — потребуется самозанятость или ИП у получателя, бизнес удерживает НДФЛ или работает по договору ГПХ. На баланс в боте — внутренние бонусы, тратятся внутри сервиса; самый простой и юридически чистый вариант. Stars — Telegram автоматически переводит с вашего бота пользователю, для контента и подписок внутри платформы. Не делайте «выводимый кэш» без юридической обвязки — это работа с физлицами как с подрядчиками, за ней следят налоговая и ЦБ. Холд 7–14 дней даёт время отловить возвраты и фрод до выплаты.