# WL Partner Onboarding — Playbook

> Что делать когда кто-то оплатил **White Label Partner Program** на Whop.
> Тариф Старт ($29/мес или $290/год) — выдать субдомен `‹brand›.guardlabs.online`.
> Тариф Агентство ($99/мес или $990/год) — настроить свой `.com`-домен.

## Триггер
- Whop webhook (`https://nexus-bot.pro/webhook/whop`) принимает event `membership.went_valid`
- plan_id одно из:
  - `plan_9582MxDTZzeHL` — 🎁 Старт 7-day trial ($0 → $29/мес)
  - `plan_Jm5AutMVkv4gC` — Старт ($29/мес, 30d trial)
  - `plan_UQrGivv8Go0FM` — Старт ($290/год)
  - `plan_UteWVjXccln7w` — Агентство ($99/мес)
  - `plan_YLx7BsdmcY5zR` — Агентство ($990/год)
  - `plan_8PEb2LPUl6Yxs` — Try $1 first month, then $29/mo

## Алекс/Stas — реакция на алерт

### 1. Открыть Whop chat с партнёром (через dashboard) и задать 3 вопроса:
```
Привет! Спасибо за подключение White Label. Чтобы выдать тебе сайт для перепродажи, нужны:

1. Название бренда (как тебя видит твой клиент)
2. Slug для субдомена — латиница, без пробелов, например «agency1» → agency1.guardlabs.online
3. Логотип PNG/SVG (или скажи «используй наш дефолт пока, потом пришлю»)

Можешь скинуть прямо сюда.
```

### 2. Получив ответы — provision (≈10 мин ручной работы):

#### 2a. Добавить CNAME в Porkbun (через API):
```bash
SLUG="agency1"   # ← из ответа партнёра
curl -X POST "https://api.porkbun.com/api/json/v3/dns/create/guardlabs.online" \
  -H "Content-Type: application/json" \
  -d "$(cat <<EOF
{
  "secretapikey": "$(jq -r .secret /root/.porkbun_api_key)",
  "apikey": "$(jq -r .key /root/.porkbun_api_key)",
  "type": "CNAME",
  "name": "$SLUG",
  "content": "guardlabs.online",
  "ttl": "300"
}
EOF
)"
```

#### 2b. Создать nginx vhost (subdomain → партнёрский каталог):
```bash
sudo tee /etc/nginx/sites-available/partner-$SLUG.conf <<NGINX
server {
    listen 443 ssl http2;
    server_name $SLUG.guardlabs.online;
    ssl_certificate /etc/letsencrypt/live/guardlabs.online/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/guardlabs.online/privkey.pem;
    root /var/www/partners/$SLUG;
    index index.html;
    location / { try_files \$uri \$uri/ /index.html; }
}
server {
    listen 80;
    server_name $SLUG.guardlabs.online;
    return 301 https://\$host\$request_uri;
}
NGINX
sudo ln -s /etc/nginx/sites-available/partner-$SLUG.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```

#### 2c. Создать каталог с белым лейблом (копия /affiliate/ с заменой brand-имени):
```bash
sudo mkdir -p /var/www/partners/$SLUG
sudo cp -r /var/www/html/affiliate/* /var/www/partners/$SLUG/
# заменить «GuardLabs» на бренд партнёра + добавить его логотип
sudo sed -i "s/GuardLabs/$BRAND_NAME/g" /var/www/partners/$SLUG/index.html
# (логотип партнёра кладёшь в /var/www/partners/$SLUG/logo.png)
```

#### 2d. Привязать ref-ID к субдомену (для трекинга комиссий):
Добавить редирект на checkout с `?ref=$SLUG` для всех "Купить" кнопок:
```bash
sudo sed -i "s|whop.com/checkout/\(plan_[A-Za-z0-9]\+\)|whop.com/checkout/\1?ref=$SLUG|g" /var/www/partners/$SLUG/index.html
```

### 3. Отправить партнёру URL:
```
Готово!

Твой каталог: https://agency1.guardlabs.online/
Это твой сайт — клиенты заходят, выбирают продукт, оплачивают на Whop. 50% с каждой оплаты падает на твой Whop-аккаунт автоматически (видно в /me/affiliates).

Что дальше:
1. Прогоняй трафик: HARO/Telegram/LinkedIn/email — мы дадим playbook (`/partner/playbook`)
2. Хочешь свой .com вместо субдомена — переходи на тариф «Агентство» ($99/мес)
3. Вопросы / запросы — пиши прямо сюда в Whop chat
```

## 7-day trial — как работает технически

- Whop checkout с `plan_9582MxDTZzeHL`:
  - `trial_period_days = 7`
  - `initial_price = $29` (списывается только после триала)
- При оплате (вернее активации триала): webhook `membership.went_valid` приходит **сразу** на день 0
  - → онбординг (этот документ) запускается **в день 0**, не в день 7
- День 7: Whop автоматически списывает $29, webhook `payment.succeeded` приходит
  - → ничего делать не надо, у партнёра уже есть сайт
- Если партнёр отменил до day-7:
  - Whop отправляет `membership.cancelled` или `membership.went_invalid`
  - → нужно отключить субдомен (вручную или скриптом — см. TODO ниже)

## Checkout-ссылки (прямые)

| Тариф | Цена | trial | direct_link |
|---|---|---|---|
| 🎁 Старт TRIAL | $0 → $29/мес | 7 дней | https://whop.com/checkout/plan_9582MxDTZzeHL |
| Try $1 first | $1 → $29/мес | 30 дней | https://whop.com/checkout/plan_8PEb2LPUl6Yxs |
| Старт месяц | $29/мес | 30 дней | https://whop.com/checkout/plan_Jm5AutMVkv4gC |
| Старт год | $290/год | 365 дней | https://whop.com/checkout/plan_UQrGivv8Go0FM |
| Агентство мес | $99/мес | 30 дней | https://whop.com/checkout/plan_UteWVjXccln7w |
| Агентство год | $990/год | 365 дней | https://whop.com/checkout/plan_YLx7BsdmcY5zR |

## TODO — автоматизация (когда наберётся 5-10 партнёров)

1. **Slack/TG alert** на onboarding-канал когда webhook `membership.went_valid` для WL prod → сейчас алертит, но не в отдельный канал
2. **Скрипт `/root/scripts/provision_partner_subdomain.sh`** инкапсулирующий шаги 2a-2d, на входе SLUG+BRAND_NAME
3. **Скрипт `/root/scripts/deprovision_partner.sh`** на membership.cancelled — убирает CNAME + nginx + каталог
4. **Self-service форма** на /affiliate/ — партнёр сам вводит slug/brand/логотип, всё провижится автоматически. Реализация: Flask route на nexus-bot.pro :8170 принимает форму, дёргает Porkbun + nginx reload.

Пока **меньше 5 партнёров** — ручной onboarding по этому документу быстрее, чем строить автоматизацию.

## Журнал

- **2026-05-16** — playbook создан. Триггер: Стас попросил «объяснить + реализовать 7-дневный trial для WL». Описание WL продукта PATCHнуто через v1 API (containing «свой сайт», «субдомен», «7 дней»). Stock на plan_9582MxDTZzeHL поправлен (unlimited_stock=true). Автоматизация субдомена — отложена до 5+ партнёров (sane MVP, ручной onboarding 10 мин).
