Skip to content

Модуль MLM (Партнеры, Рефералы, Комиссии, Ранги)

Обзор

Модуль MLM (Multi-Level Marketing) является основным бизнес-движком платформы IWM. Он управляет партнерской сетью, отслеживанием рефералов, расчетом комиссий, продвижением по рангам и обработкой выплат. Этот модуль реализует унилевел-структуру компенсации, где партнеры зарабатывают комиссии от своих прямых рефералов и нижестоящей сети.

Зоны ответственности

  • Регистрация партнеров и управление жизненным циклом
  • Генерация реферальных ссылок и отслеживание атрибуции
  • Управление структурой сетевого дерева (closure table)
  • Квалификация и продвижение по рангам
  • Расчет и распределение комиссий
  • Управление балансом (ожидающий, доступный)
  • Обработка запросов на выплату

Доменные сущности

Partner

Центральная сущность, представляющая участника MLM сети.

ПолеТипОписание
idUUIDИдентификатор партнера
user_idUUIDСсылка на core.users
sponsor_idUUIDПрямой спонсор (вышестоящий партнер)
referral_codeVARCHAR(20)Уникальный реферальный код
statusENUMСтатус партнера
current_rank_idUUIDТекущий ранг
highest_rank_idUUIDНаивысший достигнутый ранг
direct_referrals_countINTКоличество прямых рефералов
total_network_sizeINTОбщий размер сети
tree_depthINTГлубина в дереве от корня
joined_atTIMESTAMPВремя регистрации
activated_atTIMESTAMPПервое квалификационное действие

PartnerTreePath

Closure table для эффективных запросов к дереву.

ПолеТипОписание
ancestor_idUUIDВышестоящий партнер
descendant_idUUIDНижестоящий партнер
depthINTРасстояние между узлами

Отслеживаемые реферальные ссылки для атрибуции.

ПолеТипОписание
idUUIDИдентификатор ссылки
partner_idUUIDПартнер-владелец
codeVARCHAR(20)Уникальный код ссылки
nameVARCHAR(100)Название ссылки (Instagram, YouTube)
target_urlVARCHAR(500)Целевая страница
utm_sourceVARCHAR(100)UTM source параметр
utm_mediumVARCHAR(100)UTM medium параметр
utm_campaignVARCHAR(100)UTM campaign параметр
clicks_countINTВсего кликов
registrations_countINTРегистраций по ссылке
conversions_countINTКонверсий (покупки/инвестиции)
is_activeBOOLEANСтатус активности ссылки
expires_atTIMESTAMPОпциональное время истечения

ReferralAttribution

Отслеживает источник реферала для пользователей.

ПолеТипОписание
idUUIDИдентификатор атрибуции
user_idUUIDПриглашенный пользователь
partner_idUUIDПриглашающий партнер
link_idUUIDИсходная ссылка (опционально)
attribution_typeENUMFIRST_TOUCH или LAST_TOUCH
first_touch_atTIMESTAMPПервое взаимодействие
last_touch_atTIMESTAMPПоследнее взаимодействие
converted_atTIMESTAMPВремя конверсии
cookie_idVARCHAR(100)ID отслеживающей cookie

Rank

Определения рангов MLM.

ПолеТипОписание
idUUIDИдентификатор ранга
nameVARCHAR(100)Отображаемое название
codeVARCHAR(50)Уникальный код
levelINTУровень ранга (1 = низший)
descriptionTEXTОписание ранга
badge_urlVARCHAR(500)Изображение значка ранга
color_codeVARCHAR(20)Цвет бренда
is_activeBOOLEANРанг доступен

CommissionPlan

Правила расчета комиссий.

ПолеТипОписание
idUUIDИдентификатор плана
nameVARCHAR(100)Название плана
codeVARCHAR(50)Уникальный код
source_typeENUMINVESTMENT, PRODUCT, ALL
max_levelsINTМаксимальная глубина для комиссий
is_activeBOOLEANПлан активен
valid_fromTIMESTAMPНачало действия
valid_toTIMESTAMPОкончание действия

CommissionTransaction

Индивидуальная запись о комиссии.

ПолеТипОписание
idUUIDИдентификатор транзакции
partner_idUUIDПолучающий партнер
source_typeENUMORDER, INVESTMENT, BONUS, RANK_BONUS
source_idUUIDID сущности-источника
source_partner_idUUIDПартнер, сгенерировавший комиссию
level_depthINTУровень сети
plan_idUUIDПримененный план комиссий
gross_amountDECIMALСумма до вычетов
net_amountDECIMALИтоговая сумма
career_pointsDECIMALЗаработанные очки
statusENUMСтатус транзакции
period_idVARCHAR(20)Учетный период
idempotency_keyVARCHAR(255)Предотвращение дубликатов

PartnerBalance

Финансовое состояние партнера.

ПолеТипОписание
idUUIDИдентификатор баланса
partner_idUUIDСсылка на партнера
available_balanceDECIMALСумма для вывода
pending_balanceDECIMALОжидает одобрения
total_earnedDECIMALЗаработано за все время
total_withdrawnDECIMALВыведено за все время
career_points_totalDECIMALОчки за все время
career_points_periodDECIMALОчки текущего периода
currencyVARCHAR(3)Валюта баланса
versionINTВерсия для оптимистичной блокировки

PayoutRequest

Запрос на вывод средств от партнера.

ПолеТипОписание
idUUIDИдентификатор запроса
partner_idUUIDЗапрашивающий партнер
amountDECIMALЗапрошенная сумма
currencyVARCHAR(3)Код валюты
payout_method_typeENUMBANK_CARD, BANK_TRANSFER, EWALLET
payout_detailsJSONBЗашифрованная платежная информация
statusENUMСтатус запроса
rejection_reasonTEXTПричина отклонения
processed_byUUIDАдминистратор, обработавший запрос
external_referenceVARCHAR(255)Ссылка платежного провайдера

Жизненный цикл партнера

Процесс регистрации

Поток статусов партнера

Критерии активации

Партнер активируется (PENDING -> ACTIVE) при:

  • Первой покупке продукта (минимальная сумма заказа)
  • Первом участии в инвестиции
  • Ручной активации администратором

Реферальная система

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

Партнеры могут создавать множество реферальных ссылок для разных каналов:

Отслеживание UTM параметров

Ссылки поддерживают полное UTM отслеживание:

ПараметрПримерНазначение
utm_sourceinstagramИсточник трафика
utm_mediumsocialМаркетинговый канал
utm_campaignsummer_2024Идентификатор кампании

Правила атрибуции:

  • Время жизни cookie: 30 дней
  • Тип атрибуции: Last-touch (побеждает последний реферер)
  • Переопределение: Новый клик по реферальной ссылке обновляет атрибуцию
  • Сохранение: Атрибуция фиксируется при конверсии (покупка/инвестиция)

Структура дерева

Паттерн Closure Table

Партнерская сеть использует closure table для эффективных иерархических запросов:

Ключевые запросы

Получить прямых рефералов (Уровень 1):

sql
SELECT descendant_id FROM partner_tree_paths
WHERE ancestor_id = :partner_id AND depth = 1

Получить всю нижестоящую сеть:

sql
SELECT descendant_id, depth FROM partner_tree_paths
WHERE ancestor_id = :partner_id AND depth > 0
ORDER BY depth

Получить вышестоящую цепочку:

sql
SELECT ancestor_id, depth FROM partner_tree_paths
WHERE descendant_id = :partner_id AND depth > 0
ORDER BY depth

Получить сеть на определенных уровнях (для комиссий):

sql
SELECT descendant_id FROM partner_tree_paths
WHERE ancestor_id = :partner_id AND depth BETWEEN 1 AND 10

Система рангов

Иерархия рангов

Правила квалификации

Ранги имеют несколько типов требований:

Тип требованияОписание
CAREER_POINTS_TOTALКарьерные очки за все время
CAREER_POINTS_PERIODОчки в текущем периоде
PERSONAL_VOLUMEЛичные покупки/инвестиции
GROUP_VOLUMEОбщий объем сети
DIRECT_REFERRALSКоличество прямых рефералов
ACTIVE_REFERRALSАктивные прямые рефералы
TEAM_SIZEОбщий размер сети
REFERRALS_AT_RANKПрямые рефералы определенного ранга

Пример квалификации (Ранг Gold)

ТребованиеПорогПериод
Карьерные очки50,000LIFETIME
Личный объем10,000 RUBMONTHLY
Групповой объем100,000 RUBMONTHLY
Прямые рефералы10LIFETIME
Активные рефералы5MONTHLY

Поддержание ранга

  • Ранги необходимо поддерживать ежемесячно
  • Невыполнение требований приводит к понижению
  • Наивысший достигнутый ранг сохраняется для расчета бонусов
  • Льготный период: предупреждение за 1 месяц до понижения

Преимущества рангов

РангБонус к комиссииЭксклюзивные преимущества
Bronze+2% на уровнях 1-3Доступ к базовому обучению
Silver+3% на уровнях 1-5Ежемесячные вебинары
Gold+5% на всех уровняхКвартальные мероприятия
Platinum+7% на всех уровняхЕжегодный ретрит
Diamond+10% на всех уровняхСовет лидеров

Расчет комиссий

Унилевел модель

Комиссии распределяются вверх по сети от партнера-источника:

Уровни комиссий

УровеньБазовый процентС рангом Gold
15%10%
23%6%
32%4%
41%2%
5-100.5%1%

Процесс расчета

Триггеры комиссий

ТриггерТип источникаОписание
Order CompletedORDERПокупка продукта доставлена
Investment ActivatedINVESTMENTИнвестиция профинансирована
Rank AchievementRANK_BONUSЕдиновременный бонус за повышение ранга
Period BonusBONUSМесячный/квартальный бонус за результаты

Поток статусов комиссии


Управление балансом

Типы баланса

Ожидающий vs Доступный

БалансОписаниеМожно вывести
PendingКомиссии, ожидающие одобренияНет
AvailableОдобрено, доступно для выводаДа

Заморозки

Комиссии могут быть заморожены для:

  • Расследования мошенничества
  • Разрешения споров
  • Проверки соответствия

Безопасность параллелизма

Операции с балансом используют оптимистичную блокировку с номерами версий:

typescript
// Example: Withdraw from balance
const result = await updateBalanceOptimistic(
  partnerId,
  amount,
  'WITHDRAW',
  expectedVersion
);

if (!result.success) {
  if (result.error_message.includes('Version mismatch')) {
    // Retry with fresh version
  }
}

Система выплат

Процесс запроса выплаты

Правила выплат

  1. Минимальная сумма: Минимальный вывод 100 RUB
  2. Один ожидающий: Только один ожидающий запрос на партнера
  3. Требуется KYC: Требуется уровень STANDARD KYC
  4. Списание баланса: Сумма списывается сразу при запросе
  5. Возврат при ошибке: Баланс восстанавливается при неудачном платеже

Методы выплат

МетодПровайдерВремя обработки
Bank CardStripe/YooKassa1-3 рабочих дня
Bank TransferВручную3-5 рабочих дней
E-WalletРазличныеВ тот же день

Рабочий процесс одобрения


Публикуемые события

СобытиеТриггерPayload
PartnerRegisteredСоздан новый партнерpartnerId, userId, sponsorId
PartnerActivatedПервое квалификационное действиеpartnerId, activationType
PartnerStatusChangedПереход статусаpartnerId, fromStatus, toStatus
ReferralLinkCreatedСоздана новая ссылкаlinkId, partnerId, code
ReferralLinkClickedПереход по ссылкеlinkId, partnerId, visitorInfo
ReferralAttributedПользователь привязан к партнеруuserId, partnerId, linkId
CommissionCalculatedСоздана комиссияtransactionId, partnerId, amount
CommissionApprovedКомиссия одобренаtransactionId, partnerId, amount
CommissionPaidКомиссия переведена в доступный балансtransactionId, partnerId, amount
CommissionReversedКомиссия отмененаtransactionId, partnerId, reason
BalanceUpdatedИзменение балансаpartnerId, type, amount, newBalance
PayoutRequestedПодан запрос на выплатуpayoutId, partnerId, amount
PayoutApprovedВыплата одобренаpayoutId, partnerId
PayoutCompletedВыплата обработанаpayoutId, partnerId, reference
PayoutRejectedВыплата отклоненаpayoutId, partnerId, reason
RankChangedПовышение/понижение рангаpartnerId, fromRank, toRank, type
RankAchievedНовый наивысший рангpartnerId, rankId, isFirst

Потребляемые события

СобытиеИсточникОбработчик
UserRegisteredCoreСоздать партнера, если есть реферальный код
OrderCompletedCommerceРассчитать комиссии
OrderRefundedCommerceОтменить комиссии
InvestmentActivatedInvestmentРассчитать комиссии
InvestmentWithdrawnInvestmentОбработать штрафы за досрочный вывод

Бизнес-правила и инварианты

Правила партнеров

  1. Один партнер на пользователя (связь 1:1)
  2. Партнер не может быть своим спонсором
  3. Спонсор не может быть изменен после регистрации
  4. Только партнеры со статусом ACTIVE получают комиссии
  5. Партнеры со статусом TERMINATED не могут быть реактивированы

Правила комиссий

  1. Комиссии рассчитываются только для вышестоящих партнеров со статусом ACTIVE
  2. Максимальная глубина комиссий: 10 уровней
  3. Ключ идемпотентности предотвращает дублирование комиссий
  4. Комиссии требуют одобрения администратора (настраиваемый порог)
  5. Отмена/возврат источника отменяет все связанные комиссии

Правила баланса

  1. Доступный баланс не может быть отрицательным
  2. Ожидающий баланс не может быть отрицательным
  3. Версия должна совпадать для обновления (оптимистичная блокировка)
  4. Всего заработано >= всего выведено + доступный + ожидающий

Правила выплат

  1. Только один ожидающий/обрабатываемый запрос на партнера
  2. Минимальная сумма вывода обязательна
  3. Требуется верификация KYC
  4. Партнер должен быть в статусе ACTIVE для запроса выплаты

Точки интеграции

Предоставляет другим модулям

ИнтерфейсПотребителиНазначение
IPartnerLookupServiceCommerce, InvestmentПолучить партнера по реферальному коду
ICommissionServiceCommerce, InvestmentЗапустить расчет комиссий
IAttributionServiceCommerce, InvestmentПолучить реферальную атрибуцию для пользователя

Потребляет от других модулей

ИнтерфейсПровайдерНазначение
IUserLookupServiceCoreПолучить данные профиля пользователя
IKycStatusServiceCoreПроверить уровень KYC для выплат

Связанные документы