Реферальная программа для игроков — приведи друга
Половина новых игроков на нормальном сервере приходит не с топ-мониторингов и не из рекламы, а по совету друга. Проблема в том, что без учёта это невидимый канал — вы не знаете, кто кого привёл, не можете никого за это отблагодарить и не понимаете, работает ли сарафан вообще. Реферальная программа закрывает это: даёт каждому игроку свою ссылку или код, считает, кто по ней пришёл, и выдаёт награду обеим сторонам. Дальше — как это собрать технически, не изобретая велосипед и не открыв дыру для читеров с альт-аккаунтами.
Содержание
Как работает механика: коды, ссылки, начисление
Базовая схема одинаковая для любого движка — Minecraft, Rust, FiveM, что угодно с базой данных под капотом:
- Игрок получает уникальный код (или ссылку вида
play.yourserver.com?ref=CODE) — обычно короткий алфавитно-цифровой идентификатор, привязанный к его аккаунту. - Новый игрок при первом входе вводит код командой или переходит по ссылке, которая прокидывает параметр в форму заявки/whitelist.
- Сервер фиксирует связку «пригласивший → приглашённый» в базе.
- Награда выдаётся не сразу, а по условию — новый игрок должен продержаться на сервере какое-то время (например, набрать 2-3 часа онлайна за 7 дней) или дойти до определённого прогресса. Мгновенная выдача за сам факт регистрации — это то, что чаще всего и накручивают.
Для командных серверов (Minecraft, Rust) код обычно вводится в игровом чате командой вроде /ref CODE, для FiveM и RP-проектов — на этапе анкеты или whitelist-заявки в Discord, где всё равно есть текстовое поле. Ссылку с параметром ?ref= проще всего использовать на форме заявки на сайте, а не в самой игре — так код не потеряется при копировании и его видно в логах формы.
Технически: генерация кодов и хранение в MySQL
Код удобнее не хранить как случайную строку без смысла, а выводить из ID игрока — тогда не нужна отдельная таблица соответствий, и код всегда воспроизводим:
import hashlib
def make_ref_code(player_uuid: str) -> str:
h = hashlib.sha1(player_uuid.encode()).hexdigest()
return h[:8].upper() # например, "A3F9C1B2"
Дальше нужна таблица для связей и статусов — большинство игровых плагинов (EssentialsX, Vault-совместимые экономические плагины на Minecraft, Oxide/uMod на Rust) и так работают с MySQL, так что реферальную таблицу проще добавить рядом:
CREATE TABLE referrals (
id INT AUTO_INCREMENT PRIMARY KEY,
referrer_uuid VARCHAR(36) NOT NULL,
referred_uuid VARCHAR(36) NOT NULL UNIQUE,
referred_ip_hash CHAR(64) NOT NULL,
referrer_ip_hash CHAR(64) NOT NULL,
joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,
playtime_seconds INT DEFAULT 0,
status ENUM('pending', 'confirmed', 'rejected') DEFAULT 'pending',
reward_given_at DATETIME NULL
);
referred_uuid UNIQUE сразу закрывает базовый случай — один аккаунт нельзя засчитать рефералом дважды. IP хранится не в открытом виде, а хешем (SHA-256 от IP + соль) — этого достаточно для сравнения совпадений, и не тянет за собой лишние вопросы к хранению персональных данных (это стоит продумать заранее — детали в статье про хранение личных данных игроков и приватность). Если на сервере уже настроена своя база под плагины, дока по её базовой настройке есть в статье про MySQL для игровых плагинов.
На стороне игры код просто пишет в эту таблицу через плагин: для Minecraft — небольшой Java/Kotlin плагин или Skript-скрипт, вызывающий SQL-запрос при первом входе игрока с параметром; для Rust — Oxide/uMod C#-плагин, обрабатывающий OnPlayerConnected и проверяющий, вводил ли игрок код через чат-команду /ref CODE. Готовых плагинов именно под реферальную механику в публичных маркетах немного и они не всегда поддерживаются — рабочий вариант почти всегда самописный, благо логика простая.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверНаграды: что давать рефереру и приглашённому
Здесь легко скатиться в pay2win, если награда — игровое преимущество, которое нельзя получить иначе. Рабочие варианты, которые не ломают баланс:
| Тип награды | Кому | Комментарий |
|---|---|---|
| Внутриигровая валюта / донат-баллы | Обоим | Самый гибкий вариант, не даёт прямого преимущества |
| Косметика (частицы, титул, цвет ника) | Обоим | Не влияет на геймплей, хорошо мотивирует |
| Временный VIP/буст (например, +10% к добыче на 3 дня) | Приглашённому | Помогает освоиться, не критично для баланса |
| Слот в закрытой очереди / приоритет входа | Рефереру | Актуально для перегруженных серверов |
| Реальные скидки на донат | Рефереру | Требует аккуратного оформления — см. ниже |
Если награда — это донат-валюта или скидки, тема пересекается с юридическими нюансами доната в целом: как оформлять, что писать в правилах, чтобы не попасть под азартные игры или закон о рекламе, разобрано в статье про юридические аспекты донатов в России. Идея та же самая: реферальная награда — это, по сути, разновидность донат-системы, просто триггер не платёж, а приглашение. Полезно свериться и с общими принципами построения программы лояльности для постоянных игроков — реферальную механику логично встраивать в неё же, а не городить отдельную систему баллов.
Защита от альтов и самореференса
Это главная головная боль реферальных программ — без защиты через день у вас будет топ рефереров, состоящий из одного человека с двадцатью альт-аккаунтами. Меры, которые реально снижают накрутку (ни одна не даёт 100% гарантии, но вместе работают неплохо):
- Хеш IP при регистрации. Если
referrer_ip_hashиreferred_ip_hashсовпадают — заявка не отклоняется автоматически (люди правда играют с друзьями из одной квартиры или общаги), но помечается на ручную проверку. - Минимальный онлайн перед начислением. Награда выдаётся не за вход, а за подтверждённые часы игры — например, 3 часа за 7 дней. Альт-аккаунт, который зашёл на 2 минуты ради галочки, награду не получит.
- Возраст Steam/Microsoft-аккаунта. Для Steam-игр (Rust, ARK, CS2 и т.д.) можно дёргать Steam Web API и проверять
timecreated— свежесозданные аккаунты массово подозрительны, хотя сами по себе поводом для бана не являются. - Лимит на количество рефералов в сутки/неделю с одного аккаунта. Реальный игрок редко приводит больше 2-3 друзей за раз; резкий скачок — сигнал проверить вручную.
- Задержка выплаты + ручная модерация топа. Простое и рабочее решение: держите очередь
status = 'pending'и раз в неделю пробегайте её глазами перед тем как перевести вconfirmed.
Массовая проверка и бан подозрительных аккаунтов, если накрутка всё же прошла, делается тем же инструментарием, что и обычная модерация — см. массовый бан игроков: скрипты и инструменты. Стопроцентной защиты от VPN и мульти-аккаунтов не существует ни у одного проекта, и это стоит принять как данность — задача не исключить абьюз полностью, а сделать его дороже награды.
Интеграция с Discord: команды и автоматизация
У большинства сообществ основной трафик приглашений идёт не в игре, а через Discord — ссылку скидывают в личку или постят в чате. Отдельный бот-модуль под это удобнее делать через discord.py (или discord.js, если инфраструктура на Node), с командой, которая генерирует персональную ссылку и пишет её пользователю:
@bot.tree.command(name="ref", description="Получить свою реферальную ссылку")
async def ref(interaction: discord.Interaction):
code = make_ref_code(str(interaction.user.id))
link = f"https://play.yourserver.com/join?ref={code}"
await interaction.response.send_message(
f"Твоя ссылка: {link}\nНаграда придёт, когда друг наиграет 3 часа за неделю.",
ephemeral=True
)
Бот же может выдавать роль «Рефовод» после N подтверждённых приглашений и постить в канал-лог, когда реферал переходит в статус confirmed — это делает прогресс видимым и подстёгивает соревновательность без дополнительной панели. Если бот на сервере уже отвечает за рестарты или статус, логично дописать команду именно в него, а не заводить отдельного — общие практики по такой автоматизации есть в статье про Discord-бота для управления игровым сервером.
Аналитика: как понять, что программа работает
Мало запустить механику — нужно раз в месяц смотреть на цифры и решать, стоит ли она того. Минимальный набор метрик:
- Конверсия приглашения: сколько кодов было использовано / сколько выдано ссылок. Если конверсия ниже 10%, вероятно, награда неинтересна или процесс регистрации по ссылке слишком запутан.
- Retention приглашённых vs обычных новичков: приглашённые друзьями обычно задерживаются дольше — если разницы нет, программа не выполняет свою главную функцию (удержание), а просто раздаёт награды.
- Стоимость привлечения: сумма выданных наград / число подтверждённых рефералов. Сравните с тем, сколько стоит платное привлечение через рекламу на серверлистах — обычно рефералка выходит в разы дешевле.
- Доля отклонённых заявок (
status = 'rejected'): резкий рост — сигнал, что кто-то нашёл дыру в защите раньше, чем вы её закрыли.
Общие подходы к тому, какие метрики вообще стоит трекать по игрокам и как их читать, подробнее разобраны в статье про удержание игроков: метрики и аналитика. Реферальную статистику удобно выгружать туда же, где уже считается остальная аналитика сервера, а не держать в отдельной табличке, до которой руки доходят раз в квартал.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверЧастые вопросы
Можно ли обойтись без базы данных, просто вручную?
На маленьком сервере (до полусотни активных игроков) — да, через таблицу в Discord-канале или гугл-таблицу, куда админ вписывает пары вручную. С ростом это быстро становится неуправляемым, и лучше сразу закладывать хотя бы простую SQL-таблицу.
Как быть, если сервер на несколько игр (сеть проксирована через BungeeCord/Velocity)?
Таблицу referrals стоит держать на общей базе, а не на каждом суб-сервере отдельно, иначе один и тот же игрок будет засчитан рефералом на каждом из них по отдельности.
Стоит ли делать многоуровневую реферальную систему (награда за рефералов твоих рефералов)?
Технически несложно — достаточно рекурсивного запроса по таблице referrals. Но на практике это резко увеличивает риск накрутки и путаницу в правилах, поэтому для большинства игровых серверов одного уровня достаточно.
Что делать, если игрок вводит код после того как уже сыграл несколько дней?
Разумно ограничить окно — код принимается только при первом входе или в первые 24-48 часов существования аккаунта, иначе рефералкой начнут злоупотреблять задним числом.
Нужно ли уведомлять игроков, что их IP хранится для защиты от накрутки?
Да, стоит явно прописать это в правилах сервера или политике конфиденциальности — это несложно и снимает вопросы, если кто-то спросит, почему заявку отклонили.