Разработка реферальной программы криптобиржи
Реферальная программа — один из самых эффективных каналов привлечения пользователей для криптобиржи. Механика проста: пользователь A приводит пользователя B, получает % от trading fee B. Но в реализации есть несколько нетривиальных аспектов: многоуровневые структуры, расчёт комиссий в реальном времени, антифрод и прозрачный дашборд.
Структура реферальной программы
Одноуровневая vs многоуровневая
Одноуровневая: рефер получает % только от прямых рефералов. Просто в реализации.
Многоуровневая: рефер получает % с рефералов рефералов (дерево). Binance использует двухуровневую: 20% от tier-1, 10% от tier-2.
CREATE TABLE referrals (
referrer_id UUID NOT NULL,
referee_id UUID NOT NULL UNIQUE, -- каждый пользователь имеет одного реферера
created_at TIMESTAMPTZ DEFAULT NOW(),
PRIMARY KEY (referrer_id, referee_id)
);
-- Для многоуровневой: рекурсивный CTE для получения дерева
WITH RECURSIVE referral_tree AS (
-- Базовый случай: прямые рефералы
SELECT referrer_id, referee_id, 1 AS level
FROM referrals
WHERE referrer_id = $user_id
UNION ALL
-- Рекурсия: рефералы рефералов
SELECT r.referrer_id, r.referee_id, rt.level + 1
FROM referrals r
JOIN referral_tree rt ON r.referrer_id = rt.referee_id
WHERE rt.level < 3 -- Ограничиваем глубину
)
SELECT * FROM referral_tree;
Реферальные ссылки и коды
Реферальный код — уникальная строка (6-8 символов), ассоциированная с пользователем. Пользователь может иметь несколько кодов (для разных кампаний, разных ставок).
import secrets
import string
def generate_referral_code(user_id: str) -> str:
alphabet = string.ascii_uppercase + string.digits
code = ''.join(secrets.choice(alphabet) for _ in range(8))
# Проверяем уникальность в базе
while self.db.code_exists(code):
code = ''.join(secrets.choice(alphabet) for _ in range(8))
return code
# Реферальная ссылка: https://exchange.com/register?ref=ABCD1234
# UTM параметры для аналитики: ?ref=ABCD1234&utm_source=referral&utm_medium=link
Расчёт и начисление комиссий
Формула начисления
При каждом трейде:
def calculate_referral_reward(trade: Trade, referrer: User) -> Decimal:
# Базовая ставка реферальной программы
base_rate = Decimal('0.20') # 20% от собранного fee
# Бонус за объём реферальной сети
volume_bonus = get_volume_tier_bonus(referrer.referral_network_volume_30d)
# Ставка может быть кастомизирована для партнёров
effective_rate = referrer.custom_referral_rate or (base_rate + volume_bonus)
# Размер reward = fee трейдера × ставка реферала
taker_fee = trade.fee_amount # уже рассчитан при исполнении
reward = taker_fee * effective_rate
return reward.quantize(Decimal('0.00000001')) # 8 знаков
Асинхронное начисление
Реферальные начисления не должны блокировать исполнение трейда. Паттерн: трейд завершается, событие публикуется в Kafka, реферальный сервис потребляет асинхронно:
# referral_worker.py
async def process_trade_event(self, trade_event: dict):
trade_id = trade_event['trade_id']
user_id = trade_event['user_id']
fee_amount = Decimal(trade_event['fee_amount'])
fee_currency = trade_event['fee_currency']
# Находим реферера пользователя
referrer = await self.db.get_referrer(user_id)
if not referrer:
return
reward = self.calculate_reward(referrer, fee_amount)
if reward <= 0:
return
# Атомарно: создаём запись + начисляем баланс
async with self.db.transaction():
await self.db.create_referral_earning(
referrer_id=referrer.id,
referee_id=user_id,
trade_id=trade_id,
amount=reward,
currency=fee_currency
)
await self.db.credit_balance(referrer.id, reward, fee_currency)
Антифрод
Типичные злоупотребления
Self-referral: пользователь регистрирует второй аккаунт по своей же ссылке, торгует на нём и получает реферальный % с себя. Обнаружение: проверка совпадения device fingerprint, IP, payment methods при регистрации и KYC.
Wash trading: два аккаунта торгуют между собой, генерируя объём ради реферальных выплат. Обнаружение: анализ контрагентов — если % трейдов между двумя аккаунтами аномально высокий → подозрительно.
Фарм рефералов: массовая регистрация аккаунтов с одного источника. Решение: CAPTCHA, SMS верификация, требование KYC для получения реферальных выплат.
def check_self_referral_risk(referrer_id: str, new_user: NewUser) -> RiskScore:
referrer = db.get_user(referrer_id)
score = 0
# Один IP при регистрации
if referrer.registration_ip == new_user.registration_ip:
score += 50
# Один device fingerprint
if referrer.device_fingerprint == new_user.device_fingerprint:
score += 40
# Один номер телефона или email домен
if referrer.phone_prefix == new_user.phone_prefix and same_carrier(referrer, new_user):
score += 20
return RiskScore(score, 'block' if score >= 70 else 'flag')
Партнёрская программа (субаффилиаты)
Крупные биржи выделяют "партнёров" — KOL-ов, инфлюенсеров, крипто-каналы — с повышенными ставками и отдельным управлением:
| Уровень | Требования | Ставка |
|---|---|---|
| Стандарт | Нет | 20% |
| Silver | 50 рефералов + $10K объём/мес | 25% |
| Gold | 200 рефералов + $50K объём/мес | 30% |
| Партнёр | Договор + $500K объём/мес | 40-50% |
Партнёры получают кастомный дашборд с детальной аналитикой по их реферальной сети, API доступ к данным для встраивания в собственные продукты.
Дашборд и аналитика
Реферальный дашборд пользователя должен показывать:
- Количество рефералов (total, active за 30 дней)
- Накопленные earnings по периодам
- Таблицу топ-рефералов по объёму (без раскрытия email/имени)
- Real-time счётчик earnings сегодня
- Историю выплат с возможностью export в CSV
interface ReferralDashboard {
stats: {
totalReferrals: number;
activeReferrals30d: number;
totalEarned: Record<string, string>; // currency → amount
earnedToday: Record<string, string>;
pendingPayout: Record<string, string>;
};
topReferees: {
rank: number;
userId: string; // masked: "user***1234"
volume30d: string;
yourEarnings30d: string;
}[];
earningsHistory: {
date: string;
amount: string;
currency: string;
tradeId: string;
}[];
}
Прозрачность начислений — ключевой фактор доверия. Пользователь должен видеть каждое начисление с привязкой к конкретному трейду реферала.
Выплаты и налоговые последствия
Реферальные выплаты начисляются в реальном времени на trading balance. Вывод — стандартный процесс вывода с биржи. Некоторые биржи добавляют минимальный порог для вывода реферального дохода.
В ряде юрисдикций (US, EU) реферальные выплаты квалифицируются как taxable income. Биржа должна хранить историю выплат и при превышении порогов (например, $600/год в США) предоставлять налоговые формы. Это требует сбора TIN/налогового номера у партнёров с высоким доходом.







