Розробка програми лояльності криптобіржи
Програма лояльності утримує трейдерів на платформі через систему винагород за активність. У крипто-контексті це складніше, ніж традиційна роздрібна лояльність: токеноміка, знижки на комісії, стейкинг-награди — все це має бути збалансовано, щоб не створити інфляційного тиску на токен біржи.
Компоненти програми лояльності
Система рівнів (Tiers)
Класичний підхід: рівні визначаються за обсягом торгівлі за останні 30 днів або за кількістю застейканих токенів біржи:
| Tier | Обсяг/30d | Або стейкинг | Maker fee | Taker fee | Cashback |
|---|---|---|---|---|---|
| Bronze | < $10K | < 100 BNB | 0.10% | 0.10% | 0% |
| Silver | $10K+ | 100+ BNB | 0.08% | 0.09% | 5% |
| Gold | $100K+ | 500+ BNB | 0.06% | 0.08% | 10% |
| Platinum | $1M+ | 2000+ BNB | 0.04% | 0.06% | 15% |
| Diamond | $10M+ | 10000+ BNB | 0.02% | 0.04% | 20% |
Binance BNB — класичний приклад: холдинг BNB дає 25% знижку на всі комісії плюс використовується для визначення рівня.
Токен біржі як механізм лояльності
// Упрощена схема знижки на комісії через холдинг токена
contract FeeDiscountCalculator {
address public exchangeToken;
mapping(address => uint256) public stakedBalance;
function getFeeDiscount(address trader) external view returns (uint256) {
uint256 staked = stakedBalance[trader];
if (staked >= 10_000 * 1e18) return 50; // 50% знижка
if (staked >= 2_000 * 1e18) return 40;
if (staked >= 500 * 1e18) return 30;
if (staked >= 100 * 1e18) return 20;
if (staked >= 10 * 1e18) return 10;
return 0;
}
function getEffectiveFee(
address trader,
uint256 baseFee
) external view returns (uint256) {
uint256 discount = this.getFeeDiscount(trader);
return baseFee * (100 - discount) / 100;
}
}
Система балів
Накопичувальні бали (loyalty points) за торговельну активність, які можна обмінювати на награди:
class LoyaltyPointsService:
# Базові правила нарахування
EARN_RATES = {
'spot_trading': 1, # 1 бал за $1 обсяг
'futures_trading': 0.5, # 0.5 балів за $1 (нижча маржа)
'deposit': 100, # 100 балів за перший депозит
'kyc_complete': 500, # 500 балів за KYC
'mobile_app_trade': 1.5, # бонус за торгівлю мобільним додатком
}
async def add_points_for_trade(self, user_id: str, trade: Trade):
base_points = trade.volume_usd * self.EARN_RATES['spot_trading']
# Множник за рівень
tier = await self.get_user_tier(user_id)
tier_multiplier = {'bronze': 1.0, 'silver': 1.2, 'gold': 1.5, 'platinum': 2.0}
multiplier = tier_multiplier.get(tier, 1.0)
# Бонус активності (streak)
streak_bonus = await self.get_streak_bonus(user_id)
total_points = int(base_points * multiplier * streak_bonus)
await self.db.add_points(user_id, total_points, 'trade', trade.id)
await self.check_tier_upgrade(user_id)
Механіка серій (Streaks)
Щоденні серії торгівлі заохочують утримання:
async def update_trading_streak(self, user_id: str, trade_date: date):
profile = await self.db.get_loyalty_profile(user_id)
last_trade_date = profile.last_trade_date
if last_trade_date == trade_date:
return # вже торгували сьогодні
if last_trade_date == trade_date - timedelta(days=1):
new_streak = profile.current_streak + 1
else:
new_streak = 1 # серія порвана
max_streak = max(profile.max_streak, new_streak)
# Milestone rewards
milestones = {7: 500, 30: 3000, 90: 15000, 365: 100000}
if new_streak in milestones:
await self.award_milestone(user_id, milestones[new_streak])
await self.db.update_streak(user_id, new_streak, max_streak, trade_date)
Обмін (Reward Redemption)
Бали можна обмінювати на:
- Кредити на комісії: оплата наступних комісій балами
- Токени біржи: покупка за фіксованим курсом
- NFT бейджі: цифрові ачівменти на основі досягнень
- Апаратний гаманець: фізичні призи для великих накопичень
- Доступ до закритих функцій: ранній доступ до нових торговельних пар, підвищені ліміти
class RewardRedemption:
CATALOG = {
'fee_credit_10': {'points': 1000, 'value_usd': 10, 'type': 'fee_credit'},
'exchange_token_100': {'points': 8000, 'value_usd': 90, 'type': 'token'},
'hardware_wallet': {'points': 150_000, 'value_usd': 70, 'type': 'physical'},
}
async def redeem(self, user_id: str, reward_id: str):
reward = self.CATALOG.get(reward_id)
if not reward:
raise InvalidReward
balance = await self.db.get_points_balance(user_id)
if balance < reward['points']:
raise InsufficientPoints
async with self.db.transaction():
await self.db.deduct_points(user_id, reward['points'])
await self.fulfill_reward(user_id, reward)
Запобігання зловживанню
Програми лояльності привлекають зловживання: wash trading ради балів, множинні аккаунти. Захисти:
- Бали нараховуються лише за нетто-обсяг (не за саморизику)
- Виявлення wash trading: одночасні bid/ask з подібних пристроїв
- Капс на максимальні бали на день незалежно від обсягу
- KYC потрібен для будь-якого обміну вище порога
Добре спроектована програма лояльності збільшує утримання на 20-40% та обсяг на 15-30%. Погано спроектована створює дренаж P&L через зловживання.







