Розробка реферальної програми криптобіржи
Реферальна програма — один із найефективніших каналів залучення користувачів для криптобіржи. Механіка проста: користувач A приводить користувача B, отримує % від торговельної комісії B. Але в реалізації є кілька нетривіальних аспектів: багаторівневі структури, розрахунок комісій у реальному часі, запобігання шахрайству та прозорі дашборди.
Структура реферальної програми
Одноуровнева проти багаторівневої
Одноуровнева: рефер отримує % лише від прямих рефералів. Проста у реалізації.
Багаторівнева: рефер отримує % від рефералів рефералів (дерево). 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% від зібраної комісії
# Бонус за обсяг реферальної мережі
volume_bonus = get_volume_tier_bonus(referrer.referral_network_volume_30d)
# Ставка може бути налаштована для партнерів
effective_rate = referrer.custom_referral_rate or (base_rate + volume_bonus)
# Розмір вознаграження = комісія трейдера × ставка рефералу
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)
Запобігання шахрайству
Типові зловживання
Саморефераль: користувач реєструє другий аккаунт за своїм посиланням, торгує на ньому та отримує реферальний % з себе. Виявлення: перевірка збігу fingerprint пристрою, IP та способів оплати при реєстрації та 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 для вбудовування даних у свої продукти.
Дашборд та аналітика
Реферальний дашборд користувача повинен показувати:
- Кількість рефералів (всього, активних за 30 днів)
- Накопилені доходи за періодами
- Таблицю топ-рефералів за обсягом (без розкриття email/імені)
- Лічильник доходів у реальному часі сьогодні
- Історію виплат з можливістю експорту в CSV
interface ReferralDashboard {
stats: {
totalReferrals: number;
activeReferrals30d: number;
totalEarned: Record<string, string>; // валюта → сума
earnedToday: Record<string, string>;
pendingPayout: Record<string, string>;
};
topReferees: {
rank: number;
userId: string; // замаскований: "user***1234"
volume30d: string;
yourEarnings30d: string;
}[];
earningsHistory: {
date: string;
amount: string;
currency: string;
tradeId: string;
}[];
}
Прозорість нарахувань — ключовий фактор довіри. Користувач повинен бачити кожне нарахування з привязкою до конкретної торгівлі рефера.
Виплати та податкові наслідки
Реферальні виплати нараховуються у реальному часі на торговельний баланс. Виведення — стандартний процес виведення з біржи. Деякі біржи додають мінімальний поріг для виведення реферального доходу.
У деяких юрисдикціях (США, ЄС) реферальні виплати кваліфікуються як оподатковуваний дохід. Біржа повинна зберігати історію виплат та при перевищенні порогів (наприклад, $600/рік у США) надавати податкові форми. Це вимагає збирання TIN/податкового номера від партнерів з високим доходом.







