Skip to content

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

Обзор

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

Ключевые особенности

ХарактеристикаОписание
Модель комиссийДифференциальная (не Унилевел)
ГлубинаНеограниченная
Типы дохода7 (3 Активных + 3 Пассивных + 1 Лидерский Пул)
Основная валютаUSD
Ранги21 (Консультант 0-11 с PRO вариантами)
Поддержание ранговБессрочные (ранги никогда не понижаются)

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

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

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

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Глубина в дереве от корня
total_structure_turnover_usdDECIMALОбщий оборот структуры в USD
personal_turnover_usdDECIMALЛичный оборот в USD
is_activatedBOOLEANСовершена личная покупка на $1,100
joined_atTIMESTAMPВремя регистрации
activated_atTIMESTAMPВремя активации Ранга 1

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 (21-уровневая система).

ПолеТипОписание
idUUIDИдентификатор ранга
codeVARCHAR(20)Уникальный код (0, 1, 2, ..., 11, 4_PRO, ..., 11_PRO)
nameVARCHAR(100)Отображаемое название (Консультант 0, Консультант 1 и т.д.)
levelINTУровень ранга (0-21)
is_proBOOLEANФлаг PRO варианта
turnover_requirement_usdDECIMALТребуемый общий оборот структуры
personal_sales_rateDECIMALСтавка для активного дохода (3%-20%)
entrance_fee_rateDECIMALСтавка для комиссий со вступительных взносов (10.5%-20%)
passive_income_rateDECIMALСтавка для пассивного дохода (0%-20%)
leadership_pool_eligibleBOOLEANПраво на участие в лидерских пулах
descriptionTEXTОписание ранга
badge_urlVARCHAR(500)Изображение значка ранга
color_codeVARCHAR(20)Цвет бренда
is_activeBOOLEANРанг доступен

CommissionTransaction

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

ПолеТипОписание
idUUIDИдентификатор транзакции
partner_idUUIDПолучающий партнер
income_typeENUM7 типов дохода
source_typeENUMORDER, INVESTMENT, INVESTMENT_PROFIT, POOL_DISTRIBUTION
source_idUUIDID сущности-источника
source_partner_idUUIDПартнер, инициировавший эту комиссию
own_rateDECIMALПрименимая ставка партнера
source_rateDECIMALСтавка партнера-источника
differential_rateDECIMALРазница между ставками
gross_amount_usdDECIMALСумма до вычетов
net_amount_usdDECIMALИтоговая сумма
currencyVARCHAR(3)Валюта (USD)
statusENUMСтатус транзакции
period_idVARCHAR(20)Учетный период
idempotency_keyVARCHAR(255)Предотвращение дубликатов

PartnerBalance

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

ПолеТипОписание
idUUIDИдентификатор баланса
partner_idUUIDСсылка на партнера
available_balance_usdDECIMALСумма для вывода
pending_balance_usdDECIMALОжидает периода удержания
total_earned_usdDECIMALЗаработано за все время
total_withdrawn_usdDECIMALВыведено за все время
income_personal_sales_usdDECIMALДоход Типа 1 за все время
income_team_sales_usdDECIMALДоход Типа 2 за все время
income_repeat_sales_usdDECIMALДоход Типа 3 за все время
income_portfolio_returns_usdDECIMALДоход Типа 4 за все время
income_client_profits_usdDECIMALДоход Типа 5 за все время
income_network_profits_usdDECIMALДоход Типа 6 за все время
income_leadership_pool_usdDECIMALДоход Типа 7 за все время
currencyVARCHAR(3)Валюта баланса (USD)
versionINTВерсия для оптимистичной блокировки
last_calculated_atTIMESTAMPПоследний расчет комиссий

LeadershipPool

Конфигурация лидерского пула.

ПолеТипОписание
idUUIDИдентификатор пула
pool_codeVARCHAR(20)Уникальный код (POOL_5, POOL_6 и т.д.)
eligible_ranksVARCHAR[]Ранги, имеющие право на этот пул
percentage_of_turnoverDECIMALПроцент от оборота компании
distribution_frequencyENUMWEEKLY или MONTHLY
qualification_volumesJSONBТребуемые объемы по рангам
is_activeBOOLEANСтатус активности пула

PoolDistribution

Запись о событии распределения пула.

ПолеТипОписание
idUUIDИдентификатор распределения
pool_idUUIDСсылка на лидерский пул
period_startTIMESTAMPДата начала периода
period_endTIMESTAMPДата окончания периода
total_turnover_usdDECIMALОбщий оборот компании
pool_amount_usdDECIMALОбщая сумма пула
qualified_participantsINTКоличество квалифицированных партнеров
per_person_amount_usdDECIMALСумма на участника
statusENUMPROCESSING, DISTRIBUTED
distributed_atTIMESTAMPВремя завершения распределения

PayoutRequest

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

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

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

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

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

Активация с Ранга 0 на Ранг 1

Переход с Ранга 0 на Ранг 1 открывает полный маркетинговый план:

ТребованиеДетали
Личная покупкаМинимальная личная покупка $1,100
Квалифицирующие продуктыАкции Si14 AG ИЛИ любой инвестиционный продукт
ОткрываетПолный маркетинговый план со всеми 7 типами дохода

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

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

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

Отслеживание 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
    p.id as partner_id,
    p.status,
    r.code as rank_code,
    r.personal_sales_rate,
    r.passive_income_rate,
    r.entrance_fee_rate,
    ptp.depth
FROM partner_tree_paths ptp
JOIN partners p ON p.id = ptp.ancestor_id
JOIN ranks r ON r.id = p.current_rank_id
WHERE ptp.descendant_id = :partner_id AND ptp.depth >= 1
ORDER BY ptp.depth ASC

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

21-уровневая иерархия рангов

Ставки комиссий по рангам

РангОборот ($)Личные продажиВступительный взносПассивный доход
003%10.5%0%
11,1005%11%5%
210,0008%11.5%8%
350,00010%12%10%
4100,00012%12.5%12%
4_PRO200,00013%13%13%
5400,00014%13.5%14%
5_PRO700,00015%14%15%
61,000,00016%14.5%16%
6_PRO1,500,00016.5%15%16.5%
72,000,00017%15.5%17%
7_PRO3,000,00017.5%16%17.5%
85,000,00018%16.5%18%
8_PRO7,000,00018.5%17%18.5%
910,000,00019%17.5%19%
9_PRO15,000,00019.25%18%19.25%
1025,000,00019.5%18.5%19.5%
10_PRO50,000,00019.75%19%19.75%
11100,000,00020%19.5%20%
11_PRO800,000,00020%20%20%

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

ПравилоОписание
Автоматическое продвижениеРанги повышаются немедленно при достижении порога оборота
БессрочныеОднажды достигнутые ранги никогда не истекают и не понижаются
Без поддержанияНет ежемесячных требований по поддержанию
Мгновенные преимуществаСтавки комиссий применяются немедленно при изменении ранга

Ранг 0 vs Ранг 1+

ВозможностьРанг 0Ранг 1+
Реферальная ссылкаДаДа
Комиссия за личные продажи3%5%-20%
Командные продажи (дифференциальные)НетДа
Пассивный доходНетДа
Лидерские пулыНетРанг 5+

7 типов дохода

Обзор

Активный доход (Типы 1-3)

ТипНазваниеТриггерРасчет
1Личные продажиПрямая продажа своему клиентуставка_личных_продаж × сумма
2Командные продажиНижестоящий партнер совершает продажуДифференциал от суммы продажи
3Повторные продажиСуществующий клиент делает повторную покупкуКак Личные продажи

Пассивный доход (Типы 4-6)

ТипНазваниеТриггерРасчет
4Доходы портфеляСобственная инвестиция генерирует прибыльДоходность по стратегии
5Прибыль клиентовЛичный клиент получает прибыльпассивная_ставка × прибыль_клиента
6Прибыль сетиКлиент нижестоящего получает прибыльДифференциал от суммы прибыли

Лидерский доход (Тип 7)

ТипНазваниеТриггерРасчет
7Лидерский пулЕженедельное/ежемесячное распределениеРавная доля среди квалифицированных

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

Дифференциальная модель комиссий

Основная формула для Командных продаж и Прибыли сети:

ЕСЛИ ранг_консультанта > ранг_партнера_источника:
    комиссия = (ставка_консультанта - ставка_источника) × сумма
ИНАЧЕ:
    комиссия = 0  // Нет комиссии при равном или меньшем ранге

Процесс дифференциального расчета

Пример комиссии

Сценарий: Партнер на Ранге 2 (ставка 8%) совершает продажу на $10,000

Вышестоящий партнерРангСтавкаДифференциалКомиссия
Партнер-источник28%Н/Д (Личные продажи)$800
Прямой спонсор412%12% - 8% = 4%$400
Уровень 2514%14% - 12% = 2%$200
Уровень 3616%16% - 14% = 2%$200
Уровень 4616%16% - 16% = 0%$0
Уровень 51120%20% - 16% = 4%$400
Уровень 6+ЛюбойЛюбаяВесь остаток$0 (достигнут максимум)

Всего распределено: $800 + $400 + $200 + $200 + $400 = $2,000 (20% от продажи)

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

ТриггерТип источникаТипы дохода
Заказ выполненORDERЛичные продажи, Командные продажи, Повторные продажи
Инвестиция активированаINVESTMENTЛичные продажи (вступительный взнос), Командные продажи
Прибыль инвестицииINVESTMENT_PROFITПрибыль клиентов, Прибыль сети
Распределение пулаPOOL_DISTRIBUTIONЛидерский пул

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

СтатусОписаниеВлияние на баланс
PENDINGРассчитана, ожидает период удержания+ожидающий_баланс
APPROVEDПериод удержания завершеножидающий → доступный
PAIDВ доступном балансе партнераУже в доступном
REVERSEDЗаказ возвращен до выплаты-ожидающий_баланс
CLAWBACKЗаказ возвращен после выплаты-доступный_баланс

Лидерские пулы

Конфигурация пулов

ПулДопустимые ранги% от оборотаЧастотаКвалификация
POOL_55, 5_PRO1%Еженедельно$5,000 / $10,000 недельный объём
POOL_66, 6_PRO0.5%Еженедельно$20,000 / $30,000 недельный объём
POOL_77, 7_PRO0.5%Еженедельно$45,000 / $60,000 недельный объём
POOL_88, 8_PRO0.5%Еженедельно$90,000 / $120,000 недельный объём
POOL_99, 9_PRO1%ЕжемесячноТолько достижение ранга
POOL_1010, 10_PRO1%ЕжемесячноТолько достижение ранга
POOL_1111, 11_PRO1%ЕжемесячноТолько достижение ранга

Примечание: Пулы 9-11 не требуют отдельного квалификационного объёма. Партнёры, достигшие и поддерживающие эти ранги, автоматически участвуют в ежемесячном распределении. Требование ранга по обороту ($10M-$800M) служит квалификационным порогом.

Правило 50% от ветки (только для пулов 5-8)

Ни одна ветка (прямая нижестоящая линия) не может вносить более 50% квалификационного объема:

Пример:
- Требуемая квалификация: $10,000
- Объем ветки A: $80,000 → засчитывается максимум $5,000 (лимит 50%)
- Объем ветки B: $15,000 → засчитывается $5,000+ (необходимый остаток)
- Результат: Квалифицирован (диверсифицированная структура)

Процесс распределения


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

Типы баланса

Период удержания по источнику

Тип источникаПериод удержанияПричина
Заказ продукта14 днейОкно возврата/обмена
Инвестиция7 днейВерификация средств
Пассивный доход7 днейПодтверждение прибыли
Лидерский пул0 днейНемедленно при распределении

Разбивка дохода

Баланс отслеживает заработок по типам дохода:

ПолеТип дохода
income_personal_sales_usdТип 1: Личные продажи
income_team_sales_usdТип 2: Командные продажи
income_repeat_sales_usdТип 3: Повторные продажи
income_portfolio_returns_usdТип 4: Доходы портфеля
income_client_profits_usdТип 5: Прибыль клиентов
income_network_profits_usdТип 6: Прибыль сети
income_leadership_pool_usdТип 7: Лидерский пул

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

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

typescript
// Пример: Обновление баланса с проверкой версии
const result = await tx.partnerBalance.update({
  where: {
    partnerId: partner.id,
    version: expectedVersion,
  },
  data: {
    pendingBalanceUsd: { increment: amount },
    version: { increment: 1 },
    updatedAt: new Date(),
  },
});

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

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

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

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

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

МетодПровайдерВремя обработки
Банковская картаStripe/YooKassa1-3 рабочих дня
Банковский переводВручную3-5 рабочих дней
КриптовалютаРазличныеВ тот же день
Электронный кошелекРазличныеВ тот же день

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

СобытиеТриггерPayload
PartnerRegisteredСоздан новый партнерpartnerId, userId, sponsorId
PartnerActivatedПокупка на $1,100 (Ранг 0→1)partnerId, activationType
PartnerStatusChangedПереход статусаpartnerId, fromStatus, toStatus
ReferralLinkCreatedСоздана новая ссылкаlinkId, partnerId, code
ReferralLinkClickedПереход по ссылкеlinkId, partnerId, visitorInfo
ReferralAttributedПользователь привязан к партнеруuserId, partnerId, linkId
CommissionCalculatedСоздана комиссияtransactionId, partnerId, incomeType, 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
PoolDistributedЛидерский пул выплаченpoolId, amount, participants

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

СобытиеИсточникОбработчик
UserRegisteredCoreСоздать партнера, если есть реферальный код
OrderCompletedCommerceРассчитать Личные/Командные/Повторные продажи
OrderRefundedCommerceОтменить комиссии
InvestmentActivatedInvestmentРассчитать комиссии со вступительного взноса
InvestmentProfitDistributedInvestmentРассчитать Прибыль клиентов/сети

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

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

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

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

  1. Комиссии рассчитываются только для вышестоящих со статусом ACTIVE
  2. Неограниченная глубина для дифференциальных комиссий
  3. Дифференциал останавливается при достижении ставки 20%
  4. Ключ идемпотентности предотвращает дублирование комиссий
  5. Отмена/возврат источника отменяет все связанные комиссии
  6. Распределения лидерских пулов немедленные (без периода удержания)

Правила рангов

  1. Ранги бессрочные (никогда не понижаются)
  2. Продвижение по рангам автоматическое при достижении порога оборота
  3. Ранг 0→1 требует личной покупки на $1,100
  4. Все последующие ранги квалифицируются по Общему обороту структуры
  5. Ставки комиссий применяются немедленно при изменении ранга

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

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

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

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

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

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

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

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

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

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