PRD v1: Affiliate-программа для Obmenka
Версия: 1.0 (черновик для критики)
Дата: 2026-05-16
Автор: AI assistant (синтез из 3 источников — см. docs/affiliate-research/)
Статус: на внутренней критике, до v2
1. Executive Summary
Запускаем модуль аффилиатной программы: партнёры (туристы-блогеры, крипто-TG-каналы, локальные инфлюенсеры в Анталье) приводят клиентов и получают комиссию с каждой их сделки в виде USDT.
Базовая модель (E7.1 MVP): - 1 уровень партнёров (без sub-affiliate в MVP) - Комиссия: 30% от нашей маржи (profit_usdt) на каждой сделке приведённого клиента - Lifetime-привязка после первой сделки - Cookie window 30 дней до первой сделки - Минимум выплаты 50 USDT, hold 7 дней, USDT-TRC20 - Регистрация через admin (нет self-signup)
Бизнес-цель: дешевый канал привлечения новых клиентов с предсказуемой unit-экономикой. Платим только за результат (профит-shared), а не за лиды.
Ожидаемые метрики через 6 месяцев: - 15–30 активных партнёров - ≥20% новых клиентов приведены партнёрами - LTV/CAC через партнёров > 5× (т.к. CAC = % от их же сделок)
Объём работы: - E7.1 MVP: 3–4 недели - E7.2 (multi-level + 2FA + автоплатежи): 2–3 недели
2. Бизнес-обоснование
2.1. Почему запускаем сейчас
После E1–E6 у нас есть рабочая CRM с реальными сделками и блокчейн-сверкой. Появилась стабильная база, на которую можно «накручивать» канал привлечения. Без партнёрки CAC через рекламу в Анталье в туристический сезон = $30–100/клиент. Партнёрка платит только когда клиент уже принёс деньги.
2.2. Почему именно крипто-обменник нуждается в affiliate
Из research: - Binance/Bybit/OKX/MEXC — все делают по 30–50% от торговой комиссии, это стандарт индустрии 2025–2026. - Bestchange (агрегатор) — 30% Level 1 + 10% Level 2 + lifetime. - Coinsfera (прямой конкурент в Стамбуле) имеет partner-программу, детали закрыты.
Без affiliate — мы единственные в Анталье без партнёрки. Это упускаемый рост.
2.3. Метрики успеха модуля (через 3 / 6 месяцев)
| Метрика | 3 мес | 6 мес |
|---|---|---|
| Активных партнёров | 5–10 | 15–30 |
| Клиенты, приведённые партнёрами | ≥10% | ≥20% |
| Доля комиссий партнёрам от валовой прибыли | 5–10% | 10–15% |
| Средний оборот клиента партнёра | ≥ $5k за период активности | ≥ $10k |
| Кол-во кейсов self-referral fraud | < 3% от партнёров | < 1% |
| Скорость выплаты (запрос → перевод) | < 48 часов | < 24 часов |
| Чистый прирост валовой прибыли с учётом комиссий | положительный | ≥ +15% к baseline |
3. Целевая аудитория партнёров и сценарии использования
3.1. Сегменты партнёров
| Сегмент | Объём | Канал | Что нужно от системы |
|---|---|---|---|
| Туристы-блогеры в Анталье | 5–15 чел | Instagram/YouTube/TG | Visa-friendly реф-код, QR на флайере, лендинг на турецком/русском |
| Крипто-TG-каналы (RU/EN) | 5–20 каналов | Telegram, тематические чаты | Реф-ссылка, статистика real-time, кастомные баннеры |
| Локальные инфлюенсеры (TR) | 3–10 чел | Instagram TR, TikTok TR | Турецкий лендинг, поддержка lira-операций |
| Сами клиенты (word-of-mouth) | 20–50 чел | Личные знакомства | Простой код «скажи на кассе», маленький порог выплаты |
| B2B/корпораты (фаза 2+) | 1–3 партнёра | Прямые контракты | Override-ставки, ручной payout, оптимизация под объём |
3.2. Ключевые user stories
Партнёр-блогер: 1. Регистрируется через admin (на MVP), получает ref-код и QR. 2. Постит сторис «Меняю крипту у [ссылка/QR]». 3. Клиент переходит, обращается в Telegram/приходит в офис. 4. Менеджер/кассир видит «есть привязка к партнёру по cookie/коду», оформляет сделку. 5. Партнёр в кабинете видит — «+15 USDT начислено, доступно через 7 дней». 6. Запрашивает выплату при 50+ USDT → получает USDT-TRC20 в течение 48 часов.
Кассир в Лиман-точке: 1. Турист говорит «у меня код от Анны: ANNA-IST». 2. Кассир в CRM открывает форму новой сделки. 3. В поле «Партнёр» — autocomplete по коду или имени партнёра. 4. Создаёт сделку как обычно → система сама начислит комиссию.
Admin:
1. Получает заявку от потенциального партнёра в TG.
2. Создаёт Affiliate в /affiliates/new (имя, контакты, payout-адрес).
3. Подписывает партнёрский договор (вне CRM, в PDF).
4. Раз в неделю проверяет /payouts на ожидающие запросы.
5. Одобряет, выбирает Operation с фактической on-chain транзакцией выплаты.
4. Модель вознаграждения
4.1. Базовая формула (E7.1)
commission_amount_usdt = (deal.profit_usdt × tier1_pct) − fixed_overhead
где:
- deal.profit_usdt — уже считаемая прибыль = (indicative_rate − applied_rate) × give_amount × FX_to_USDT[get_asset]
- tier1_pct = 30% для default-программы
Почему от profit_usdt, а не от volume:
| Подход | За | Против |
|---|---|---|
| % от profit (наш выбор) | Защищает экономику: партнёр получит больше когда наша маржа больше; естественный hedge | Партнёр не видит «своей» цифры заранее, может казаться непрозрачным |
| % от volume | Простая коммуникация: «1% с каждой сделки» | На сделках с минимальной маржой мы платим больше чем зарабатываем |
| Фикс per deal | Понятно партнёру | Не масштабируется, мотивирует фрод-малые сделки |
| Hybrid | Гибкость | Сложно объяснить, легко переплатить |
Решение для MVP: profit-based с возможностью переключения программы на volume-based для отдельных партнёров (отдельная программа).
4.2. Примеры расчёта
| Сделка | profit_usdt | tier1_pct | Партнёру | Чистая прибыль нам |
|---|---|---|---|---|
| 1000 USD → 970 USDT (markup 3%) | 30 | 30% | 9 USDT | 21 USDT |
| 5000 USD → 4900 USDT (markup 2%) | 100 | 30% | 30 USDT | 70 USDT |
| 50000 USD → 49600 USDT (markup 0.8%) | 400 | 30% | 120 USDT | 280 USDT |
4.3. Multi-level (E7.2)
- Tier 1 (прямой партнёр клиента) = 30% от profit
- Tier 2 (партнёр, который привёл Tier 1) = 5% от profit (НЕ от Tier 1)
- Tier 3 = не реализуем даже в фазе 2
Защита от каскадной мотивации к sub-affiliate fraud: tier2 существенно ниже tier1 (5% vs 30%), чтобы партнёру было невыгодно создавать «фейкового sub-партнёра» ради 5% (учитывая, что эти sub-партнёры должны пройти admin-approval и KYC).
4.4. Tier'ы по объёму (E7.2)
Опционально, если оправдает себя: - Bronze (default): 30% Tier1 / 5% Tier2 - Silver (≥ $500 заработанной партнёром маржи за 30 дней): 35% / 5% - Gold (≥ $2000): 40% / 7%
Переоценка ежемесячно, protection period 2 месяца при downgrade (Binance-стиль).
4.5. Исключения
- Сделки в UAH/RUB (опционально, по решению admin) — комиссия 50% от стандартной (т.к. эти валюты у нас прокси-каналы, маржа меньше)
- Сделки внутрениие переводы (
op_type=internal) — комиссия 0 - Cancelled сделки — 0
- Cделки в
excluded_assetsпрограммы — 0 - Cap на одну сделку — 200 USDT (защита от «one shot fraud»)
5. Tracking и Attribution
5.1. Способы привязки клиента к партнёру
3 канала:
-
Реферальная ссылка
https://obmenka.felix.nohumaninside.me/r/{code}- Публичный endpoint без auth - Инкрементитref_codes.clicks_count- Ставит cookieobm_ref(signed, TTL 30 дней) - 302-redirect на main landing - При создании нового Client → cookie →client.referrer_affiliate_id -
Manual ввод менеджером/кассиром - В форме новой сделки или карточке клиента — поле «Партнёр» с autocomplete - Кассир выбирает по ref-коду (клиент сказал устно) или имени партнёра - Запись в
client_affiliationsсsource='manual',reasonобязателен -
Self-claim через TG-бот (фаза 3) - Клиент пишет боту «у меня код TGTR2026» - Бот резолвит и привязывает
5.2. Attribution window
- До первой сделки: cookie 30 дней (стандарт e-commerce)
- После первой сделки клиента: lifetime-привязка (как Bybit/Binance)
- Lifetime означает: все будущие сделки клиента → партнёру, пока админ не перепривяжет вручную
5.3. Перепривязка
- Менеджер может переключить клиента на другого партнёра (требует
reason) - Старая запись в
client_affiliationsпомечаетсяdetached_at - Уже начисленные комиссии не меняются (snapshot в
commission_entries.affiliate_id) - Новые сделки идут новому партнёру
5.4. Anti-conflict правило
Если cookie cтавит partner A, а менеджер хочет привязать к partner B (например, клиент пришёл по знакомству) — это требует подтверждения admin или явного указания «cookie перекрыта» в форме с причиной.
6. Anti-fraud
6.1. Обязательный минимум (E7.1)
| Проверка | Где | Действие |
|---|---|---|
| Self-referral (partner и client совпадают по tg_username/phone) | accrue_for_deal | commission_entry.status='voided' |
| Партнёр заблокирован | accrue_for_deal | Не начисляем |
| Сделка cancelled | hold-cron | Не переводим в available |
| Минимальная сделка (профит ≥ $5 USDT) | accrue | Меньше — voided: too_small |
| Cap на сделку (200 USDT/комиссия) | accrue | Cap |
| KYC партнёра обязателен до payout | approve_payout | Reject если нет |
6.2. Anti-wash-trading (E7.2)
Правило Paxful: если у одной сделки обе стороны — рефералы одного партнёра, комиссия снижается до 50% от стандартной. Например, 30% → 15%.
Реализация: при accrue смотрим, есть ли в другой стороне сделки клиент с тем же referrer_affiliate_id. Сложно для крипто-on-chain стороны (там анонимный wallet), но для cash↔crypto в обменнике — обе стороны имеют клиента.
6.3. Velocity limits (E7.2)
- Не больше 5 новых рефералов в день от одного партнёра без admin review
- Не больше 50 в месяц без upgrade tier
6.4. Что НЕ делаем в MVP
- Device fingerprinting (30–40% false match per research)
- ML/rule-based fraud detection (нет данных для обучения)
- IP-кластеризация (можно проще через self-referral check)
7. Lifecycle комиссии и выплат
7.1. Состояния commission_entry
[создан в момент Deal → done]
↓
pending
↓ (hold_days=7 истекли AND сделка не cancelled)
available
↓ (партнёр запросил payout, admin одобрил)
paid
↓ (опционально, через reconcile)
linked to raw_blockchain_tx
Альтернативные пути:
- voided — при failure-проверке (self-referral, too_small, asset excluded)
- reversed — при отмене сделки уже после paid (баланс может уйти в минус, ручной разбор)
7.2. Hold период
7 дней для MVP. Обоснование: - Стандарт индустрии для крипто без card-chargebacks = 7–14 дней - Достаточно для AML-проверки реферальной сделки - Не слишком долго для UX партнёра
Программа может настраивать это поле (по умолчанию 7).
7.3. Выплаты
Триггер (MVP): manual — партнёр сам запрашивает в кабинете.
Условие: balance_available ≥ 50 USDT (минимум программы).
Approval flow:
1. Partner → POST /aff/payouts/request (если ≥ min) → создаётся payout_request(status=pending)
2. Admin видит в /payouts, в pending
3. Admin делает USDT-TRC20 перевод (вручную из cold wallet или через систему)
4. Admin в админке нажимает «Одобрить» → вводит/выбирает Operation(op_type=crypto_out) (та самая Operation выплаты)
5. Все commission_entries.available партнёра до суммы запроса → paid
6. reconcile.py автоматически свяжет payout_request.matched_raw_tx_id с реальной on-chain транзакцией
Periodicity: на MVP — по запросу. В E7.2 — опция «каждую среду авто» / «при threshold».
7.4. Запрос-вывод vs автомат
| Подход | MVP | Фаза 2 |
|---|---|---|
| Партнёр сам кнопкой | ✅ | ✅ |
| Авто при threshold (например, 200 USDT) | ❌ | ✅ опционально per affiliate |
| Scheduled (каждый вторник) | ❌ | ✅ опционально |
8. Модель данных (краткая сводка)
Детали в docs/affiliate-research/03-architecture-plan.md.
Новые таблицы:
- affiliate_programs — настройки программы (ставки, hold, min_payout, attribution)
- affiliates — партнёры (с FK на users для auth)
- ref_codes — реф-коды (несколько на партнёра)
- client_affiliations — история привязок (partial UNIQUE на одну активную)
- commission_entries — начисления (UNIQUE (deal_id, affiliate_id, tier))
- payout_requests — запросы выплат + связь с Operation
Изменения существующих:
- clients += referrer_affiliate_id, referrer_ref_code_id, referrer_set_at
- deals += affiliate_snapshot_id, commission_calculated_at
- users += totp_secret, totp_enabled, affiliate_id
- roles += новая запись affiliate
Размер: - На 150 сделок/мес × 1 партнёр в среднем = 150 commission_entries/мес = ~1800/год - При 30 партнёрах и 10k сделок/мес (далёкая перспектива) — 30k/мес = 360k/год. Тоже нормально для Postgres.
9. UX / Экраны
9.1. Партнёрский кабинет — отдельный layout aff_base.html
Зачем отдельный: визуально отличается от админки (другой цвет/брендинг), партнёр и админ не путаются. Под URL'ом /aff/*, не на отдельном subdomain в MVP (потому что Caddy config + cert hassle).
Экраны:
| Путь | Содержание |
|---|---|
/aff |
3 KPI карточки: «Доступно к выплате» / «В hold-периоде» / «Всего заработано»; кнопка «Запросить выплату» (disabled если меньше min); последние 10 начислений; реферальная ссылка с QR |
/aff/links |
Список ref-кодов: code, label, clicks, signups, deals, status. Кнопка «+ Создать ссылку» (modal) |
/aff/clients |
Псевдонимизированный список: C-XXXX, дата привязки, кол-во сделок, объём в USDT, моя комиссия |
/aff/earnings |
Журнал commission_entries с фильтрами, экспорт CSV |
/aff/payouts |
История запросов и выплат, TXID кликабельный на TronScan |
/aff/settings |
Профиль, payout-адрес (с валидацией формата TRC20), пароль, 2FA (фаза 2) |
9.2. Админская часть — под существующим сайдбаром
Добавляется новая группа в base.html:
Партнёры
├── /affiliates — Список партнёров
├── /affiliate-programs — Программы (ставки, hold, min_payout)
└── /payouts — Ожидающие выплаты
Изменения существующих экранов:
- /clients/{id} — блок «Привязка к партнёру» (manager может менять, history-табличка)
- /clients — колонка «Партнёр» + фильтр
- /deals/{id} — блок «Комиссии партнёрам» (read-only список начислений)
- / (dashboard для admin/manager) — виджет «Аффилиатная программа» (активных партнёров / комиссии за сегодня / pending выплат)
9.3. Привязка клиента к партнёру (для кассира)
В форме новой сделки /deals/new добавляется опциональное поле «Реф-код / Партнёр» — autocomplete по активным ref_codes.code + affiliates.display_name. Если поле заполнено и client.referrer_affiliate_id IS NULL — привязываем клиента к этому партнёру (с source='manual').
10. RBAC и privacy
10.1. Новая роль affiliate
Может:
- Видеть свой кабинет (все /aff/* пути)
- Видеть свою статистику (агрегаты)
- Запрашивать выплату
- Менять payout-адрес и пароль
НЕ может:
- Видеть других партнёров
- Видеть детали клиентов (только псевдоним C-XXXX + агрегаты)
- Видеть детали сделок (только дата + тип + сумма комиссии)
- Видеть, кто его upline (parent_affiliate_id скрыт)
- Создавать сделки или изменять клиентов
10.2. Обновлённая NAV_BY_ROLE
"admin": {..., "affiliates", "affiliate_programs", "payouts"},
"manager": {..., "affiliates"}, # видит список, может привязывать клиентов
"accountant": {..., "affiliates", "payouts"}, # read-only для отчётов
"cashier": {...}, # без affiliate в сайдбаре, только в форме сделки
"viewer": {...}, # без изменений
"affiliate": {"aff_dashboard", "aff_links", "aff_clients", "aff_earnings", "aff_payouts", "aff_settings"},
10.3. Privacy
Партнёр в кабинете видит:
- ✅ Псевдоним клиента C-XXXX
- ✅ Дата привязки
- ✅ Количество и совокупный объём сделок клиента
- ❌ ФИО / телефон / email / Telegram-username клиента
- ❌ Детали отдельных сделок (валюты, контрагенты)
Это критично для: - Защиты от утечки клиентской базы (если у партнёра скомпрометирован пароль) - GDPR-минимизации - Защиты от перехвата клиентов конкурентами (если партнёр станет нелояльным)
10.4. 2FA
На MVP: опционально. Партнёр включает в /aff/settings. По умолчанию выключено.
В фазе 2: обязательно для: - Изменения payout-адреса (req re-auth) - Запроса выплаты > 500 USDT
11. Юридический контекст (Турция)
Из research: - MASAK 2024: KYC обязателен для каждой crypto-операции > 15 000 TRY (~$425). У нас это всё равно есть для клиентов. - С 1 января 2025: 1% withholding tax на платежи intermediary/e-commerce service providers. Затрагивает выплаты партнёрам. - CMB регулирует криптообменники как CASPs. Минимальный капитал 150M TRY (~$4.1M) для получения лицензии. На MVP не требуется (мы не подаём заявку), но через 6–12 месяцев — нужно обсудить. - Без лицензии CASP — уголовка 3–5 лет. Делаем минимум видимости в Турции, реклама партнёров на турецком — только с расчётом на это.
11.1. Партнёрский договор (обязательно перед первой выплатой)
Документ вне CRM, в PDF/Doc. Обязательные пункты:
1. Commission structure (rate, attribution, qualification)
2. Cookie duration (30 дней до первой сделки, lifetime после)
3. Payment terms (USDT-TRC20, мин 50, hold 7 дней)
4. Запрещённые активности (cookie stuffing, brand bidding, спам, self-referral)
5. KYC/AML compliance аффилиата
6. Tax responsibility (аффилиат сам декларирует доход)
7. 1% withholding tax — кто платит (мы удерживаем; в договоре обозначить)
8. Termination, IP rights, конфиденциальность клиентских данных
9. FTC disclosure (для US-audience) — #ad обязательно
10. Jurisdiction — Турция, dispute resolution
11.2. KYC партнёра
Минимум: - Имя, контакты (TG + email + phone) - Tax-ID (TR — TC Kimlik для резидентов, foreign tax-ID для нерезидентов) - Payout-кошелёк (TRC20 address) + screening через AMLBot/Chainalysis - Страна резидентства
Требуется до: - Первой выплаты > 50 USDT (опционально на MVP) - Любого payout в фазе 2 (обязательно) - Для физических партнёров с monthly payout > €1000 — расширенный KYC (паспорт + селфи)
12. Фазы реализации
E7.1 — MVP (3–4 недели)
Цель: запустить программу с 3–5 ручными партнёрами, плоская комиссия от profit, ручные выплаты.
В scope:
- Миграции: 6 новых таблиц + ALTER 4 существующих
- 1 программа default (profit_usdt × 30%, hold 7 дней, min 50 USDT)
- БЕЗ multi-level (max_tier_depth=1)
- attribution = lifetime после первой сделки + cookie 30 дней до
- Партнёрский кабинет (без 2FA)
- Tracking /r/{code} + cookie + auto-attach при создании клиента
- Manual attach менеджером в карточке клиента или в форме сделки
- Accrual в момент deal.status → done (модификация routes/deals.py)
- Hold-cron job каждый час
- Admin: CRUD affiliates, программа (одна default), approve payouts
- Audit пишется через существующий record_audit()
Не в scope:
- Multi-level (tier2_parent_id)
- Automatic payouts по threshold
- 2FA TOTP
- Self-signup партнёра
- Fraud detection кроме базовых проверок
- Отдельный subdomain
- Webhooks/нотификации
Готово когда: партнёр может зарегистрироваться (через admin), получить ref-код, привести клиента, увидеть свою комиссию в кабинете, запросить выплату, admin её одобрить.
E7.2 — Multi-level + автоматизация (2–3 недели)
В scope:
- parent_affiliate_id + tier2_parent_id + tier3_parent_id (denorm)
- affiliate_programs.tier2_pct (5% от profit), max_tier_depth ≤ 2
- Override per affiliate (override_tier1/2_pct)
- attribution_mode = first_n_days, first_deal_only опции
- 2FA TOTP для роли affiliate
- Anti-self-referral check (tg_username/phone match)
- Anti-wash-trading правило Paxful
- Velocity limits (5 рефералов/день)
- Automatic payout creation при threshold ≥ 200 USDT
- Scheduled payouts (weekly/monthly opt-in)
- UI: дерево даунлайна в карточке партнёра
- Tier-bonus (Bronze/Silver/Gold)
E7.3 — Advanced (отложено)
- Smart-contract выплаты (USDT-TRC20 авто, с приватным ключом)
- Self-signup партнёра (с модерацией)
- ML/rule fraud detection
- Отдельный subdomain
partners.obmenka.felix... - Webhooks для партнёров (когда у их клиента сделка)
- Email-уведомления партнёрам (digest)
- A/B-тесты программ (когорта получает другую ставку)
- Tax reporting export (для бухгалтерии)
- Multi-currency payouts (TRY/USD cash в офисе)
13. Открытые вопросы для согласования
13.1. Бизнес-вопросы (требуют ответа от пользователя/руководителя)
-
Базовая ставка 30% от profit_usdt — приемлемо? Это даёт партнёру 30% от нашей прибыли. На сделке с 100 USDT профита → 30 USDT партнёру. Если хочется 20% или 40% — скажи.
-
Cap 200 USDT на одну сделку — нужен для защиты от «один раз привёл VIP-клиента с миллионной сделкой и получил пожизненную полу-прибыль». Альтернатива: убрать cap (доверять рынку). Что выбираем?
-
Lifetime-привязка после первой сделки — стандарт индустрии (Binance/Bybit), но это значит платить вечно. Альтернатива: limited window (например, 12 месяцев с момента первой сделки). Через 12 мес клиент «отвязывается».
-
Tier 2 (sub-affiliate) в фазе 2 — оставляем 5%, или предпочитаешь не делать multi-level вообще?
-
Минимум payout 50 USDT — низковато для нашего рынка (50$ это нормально для турецкого бизнес-сегмента), или поднять до 100?
-
Withholding tax 1% — мы удерживаем при выплате (как Турция требует с 2025) или платим сами и закладываем в комиссию?
-
Список запрещённых стран для рефералов — будут ли санкционные ограничения? RU/BY/Иран — пускаем партнёров оттуда или нет?
13.2. Open для архитектуры (могу решить сам, но хочу подтверждения)
-
base_modelper program: оставляемprofit_usdtкак основу или добавляемvolume_usdtкак опцию для отдельных программ? Я бы сделал обе доступны, но default =profit_usdt. -
2FA для партнёра — опционально на MVP, обязательно в фазе 2. Согласен?
-
Партнёрский кабинет под
/aff/*или на отдельном subdomain? Я бы оставил под основным — Caddy уже настроен, экономит 1 день инфры.
14. Что НЕ делаем в первой версии и почему
| Что | Почему |
|---|---|
| Multi-level | Нет ещё достаточного количества партнёров для каскада |
| 4+ уровней tier | MLM-территория, фрод-магнит |
| Self-signup партнёра | Barrier против fraud-аккаунтов |
| Device fingerprinting | 30–40% false match, не оправдывает сложность |
| CPA-only модель | Гарантированный приток ботов |
| Несколько программ | Одна default достаточно |
| Smart-contract выплаты | Хранение приватных ключей — отдельный domain ответственности |
| Webhooks | Нет инфры для outgoing webhooks |
| ML fraud detection | Нет данных для обучения |
| Edit/Delete сделки админом | Источник истины — append-only audit log |
| Custom landing pages под каждого партнёра | На MVP — один лендинг, partner customization через UTM-параметры |
| Bonus за первый депозит реферала | Не делаем CPA — только revenue share |
15. Связь с существующей системой
Модуль интегрируется минимально-инвазивно:
| Точка интеграции | Что меняется |
|---|---|
models.py |
+6 новых классов + ALTER в 4 существующих |
routes/deals.py |
Добавить вызов commission_engine.accrue_for_deal(deal) в 2 точках done-перехода (в той же транзакции) |
routes/clients.py |
Добавить поля «Партнёр» в форму нового клиента (опционально) и в карточку клиента |
auth.py |
Добавить роль affiliate в NAV_BY_ROLE |
main.py |
Подключить новые router'ы (affiliates, aff_dashboard, payouts) |
templates/base.html |
Добавить группу «Партнёры» в сайдбар |
templates/aff_base.html |
НОВЫЙ — layout для партнёрского кабинета |
| Существующие cron-таймеры | Добавить obmenka-commission-release.timer (hourly) |
reconcile.py |
Расширить — может линковать payout_request → raw_blockchain_tx |
audit_log |
Действия: affiliate_created, commission_accrued, commission_voided, payout_requested, payout_approved, payout_rejected |
Принцип: не переписывать сделочный flow, а добавить «модуль рядом» с явными точками вызова.
16. Приложение: сравнительная таблица моделей (для обоснования)
| Биржа | Базовая % | Max % | Sub-tier | Lifetime | Min withdraw | Что берём |
|---|---|---|---|---|---|---|
| Binance | 41% spot | 50% | 2-tier (промо) | да | 0 | модель квартального review |
| Bybit | 30% | 50% | +10% override, cap 50% | да | 0 | daily payouts (фаза 2) |
| OKX | 30% | 50% | да, % настраиваемая | нет | n/a | hourly settlement (фаза 2) |
| WhiteBIT | 40% | 60% | 6 volume-tier | да | n/a | tier-система (фаза 2) |
| MEXC | 50% | 70% (с MX) | +10% | да | n/a | агрессивный starter |
| ChangeNOW | 0.4% | custom | n/a | да | n/a | fee markup как опция |
| BestChange | 30% | 30% + CPL | 2-tier (30%/10%) | да | $1 | главный референс |
| Paxful (historical) | 50% | 50% | 10% sub | да | 0 | anti-wash правило 25% |
| Наша программа | 30% от profit | 30% (MVP) → 40% (Gold) | +5% Tier 2 (фаза 2) | да после 1 сделки | 50 USDT | синтез BestChange + Paxful |
Конец PRD v1. Следующий шаг — критика и переработка в v2.