307 lines
11 KiB
Markdown
307 lines
11 KiB
Markdown
|
|
# 📋 Краткая выжимка: План реализации тарифов с локациями
|
|||
|
|
|
|||
|
|
**Дата**: 8 февраля 2026
|
|||
|
|
**Статус**: ✅ Анализ завершен, готово к реализации
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 Цель
|
|||
|
|
|
|||
|
|
Реализовать систему покупки VPN с:
|
|||
|
|
1. ✅ Выбором тарифа (Start/Plus/Max)
|
|||
|
|
2. ✅ Выбором периода (1м/3м/6м/год) с показом скидок
|
|||
|
|
3. ✅ Выбором локаций (нод) из Marzban
|
|||
|
|
4. ✅ Оплатой через payment gateway
|
|||
|
|
5. ✅ Автоматическим созданием пользователя с выбранными нодами
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 Итоги анализа
|
|||
|
|
|
|||
|
|
### ✅ Что работает:
|
|||
|
|
- Тарифы (Start/Plus/Max) - UI готов
|
|||
|
|
- SetupWizard с выбором локаций - UI готов
|
|||
|
|
- API создания пользователей - работает
|
|||
|
|
- Реферальная система - полностью реализована (+7 дней за друга, +30 за milestone)
|
|||
|
|
|
|||
|
|
### ❌ Что НЕ работает:
|
|||
|
|
- Выбор локаций не сохраняется в Marzban
|
|||
|
|
- Нет скидок за период оплаты
|
|||
|
|
- Нет связи между UI выбора локаций и реальными нодами
|
|||
|
|
|
|||
|
|
### ⚠️ Что отклонено:
|
|||
|
|
- ❌ Динамическое ценообразование (премиум локации дороже)
|
|||
|
|
- ⏸️ Семейные планы (отложены на V2.0, требуют Device Monitor Service)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 MVP Roadmap (2 недели)
|
|||
|
|
|
|||
|
|
### Week 1: Backend API (8-10 часов)
|
|||
|
|
```typescript
|
|||
|
|
1. [3h] Создать /api/nodes
|
|||
|
|
- Получить список нод из Marzban API
|
|||
|
|
- Форматировать для фронтенда (id, name, country, ping)
|
|||
|
|
- Фильтровать только connected ноды
|
|||
|
|
|
|||
|
|
2. [5h] Обновить /api/create-user
|
|||
|
|
- Добавить параметры: period, locationIds
|
|||
|
|
- Получить список inbounds для выбранных нод
|
|||
|
|
- Создать пользователя с кастомными inbounds
|
|||
|
|
- Добавить функцию getPlanConfig(planType, period) с расчетом скидок
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Week 2: Frontend UI (10-12 часов)
|
|||
|
|
```typescript
|
|||
|
|
3. [8h] Переработать /app/plans/page.tsx
|
|||
|
|
- Шаг 1: Выбор тарифа (Start/Plus/Max)
|
|||
|
|
- Шаг 2: Выбор периода (1м/3м/6м/год)
|
|||
|
|
- Показать экономию: "💰 Экономия 297₽ при оплате на год"
|
|||
|
|
- Шаг 3: Выбор локаций
|
|||
|
|
- Загрузить из /api/nodes
|
|||
|
|
- Ограничить по тарифу (Start=1, Plus=3, Max=все)
|
|||
|
|
- Шаг 4: Кнопка "Оплатить"
|
|||
|
|
|
|||
|
|
4. [2h] Добавить компоненты
|
|||
|
|
- PeriodSelector - карточки периодов со скидками
|
|||
|
|
- LocationSelector - чекбоксы локаций с флагами
|
|||
|
|
- PriceSummary - итоговая цена с экономией
|
|||
|
|
|
|||
|
|
5. [2h] Стилизация под Telegram Mini App
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💰 Скидки за период
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1 месяц: 0% (базовая цена)
|
|||
|
|
3 месяца: -10% (экономия ~270₽ на Plus)
|
|||
|
|
6 месяцев: -15% (экономия ~540₽ на Plus)
|
|||
|
|
1 год: -20% (экономия ~720₽ на Plus)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Примеры**:
|
|||
|
|
- Plus (299₽/мес):
|
|||
|
|
- 1 месяц: 299₽
|
|||
|
|
- 3 месяца: 807₽ (вместо 897₽) → экономия 90₽
|
|||
|
|
- 6 месяцев: 1523₽ (вместо 1794₽) → экономия 271₽
|
|||
|
|
- 1 год: 2870₽ (вместо 3588₽) → экономия 718₽
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Техническая реализация
|
|||
|
|
|
|||
|
|
### 1. API: GET /api/nodes
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// Возвращает список доступных локаций
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"locations": [
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"name": "🇳🇱 Нидерланды",
|
|||
|
|
"address": "193.168.175.128",
|
|||
|
|
"ping": "15ms",
|
|||
|
|
"country": "NL"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": 2,
|
|||
|
|
"name": "🇺🇸 США",
|
|||
|
|
"address": "194.113.210.187",
|
|||
|
|
"ping": "120ms",
|
|||
|
|
"country": "US"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. API: POST /api/create-user (обновленный)
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// Принимает:
|
|||
|
|
{
|
|||
|
|
"planType": "plus",
|
|||
|
|
"period": "3months",
|
|||
|
|
"locationIds": [1, 2, 5], // NEW
|
|||
|
|
"telegramId": 12345,
|
|||
|
|
"telegramUsername": "john_doe"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Логика:
|
|||
|
|
1. Получить список нод по locationIds
|
|||
|
|
2. Получить список inbounds для этих нод
|
|||
|
|
3. Создать mapping:
|
|||
|
|
{
|
|||
|
|
vless: ["VLESS TCP Node1", "VLESS Reality Node2"],
|
|||
|
|
vmess: ["VMess WS Node1"],
|
|||
|
|
trojan: ["Trojan TCP Node1"]
|
|||
|
|
}
|
|||
|
|
4. Создать пользователя с этими inbounds
|
|||
|
|
5. Рассчитать expire с учетом period:
|
|||
|
|
- 1month: +30 дней
|
|||
|
|
- 3months: +90 дней
|
|||
|
|
- 6months: +180 дней
|
|||
|
|
- 1year: +365 дней
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. Frontend: Мультишаговый выбор
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────┐
|
|||
|
|
│ Шаг 1: Тариф │
|
|||
|
|
│ ⭕ Start (1 локация) │
|
|||
|
|
│ ⭕ Plus (3 локации) ← выбран │
|
|||
|
|
│ ⭕ Max (все локации) │
|
|||
|
|
└─────────────────────────────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────────────┐
|
|||
|
|
│ Шаг 2: Период │
|
|||
|
|
│ ⭕ 1 месяц - 299₽ │
|
|||
|
|
│ ⭕ 3 месяца - 807₽ (экономия 90₽) │ ← выбран
|
|||
|
|
│ ⭕ 6 мес - 1523₽ (экономия 271₽)│
|
|||
|
|
│ ⭕ 1 год - 2870₽ (экономия 718₽)│
|
|||
|
|
└─────────────────────────────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────────────┐
|
|||
|
|
│ Шаг 3: Локации (выберите 3) │
|
|||
|
|
│ ☑ 🇳🇱 Нидерланды (15ms) │ ← выбран
|
|||
|
|
│ ☐ 🇩🇪 Германия (20ms) │
|
|||
|
|
│ ☑ 🇺🇸 США (120ms) │ ← выбран
|
|||
|
|
│ ☐ 🇸🇬 Сингапур (180ms) │
|
|||
|
|
│ ☑ 🇯🇵 Япония (160ms) │ ← выбран
|
|||
|
|
│ ☐ 🇬🇧 UK (35ms) │
|
|||
|
|
│ │
|
|||
|
|
│ [Перейти к оплате 807₽ →] │
|
|||
|
|
└─────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎁 Реферальная система (уже работает!)
|
|||
|
|
|
|||
|
|
**Текущая реализация**:
|
|||
|
|
```typescript
|
|||
|
|
// Endpoints:
|
|||
|
|
POST /api/referral/track // Записать реферала
|
|||
|
|
GET /api/referral/stats // Получить статистику
|
|||
|
|
|
|||
|
|
// Бонусы:
|
|||
|
|
+7 дней за каждого друга
|
|||
|
|
+30 дней milestone за каждые 5 друзей
|
|||
|
|
|
|||
|
|
// Формула:
|
|||
|
|
bonusDays = (referralCount * 7) + (Math.floor(referralCount / 5) * 30)
|
|||
|
|
|
|||
|
|
// Примеры:
|
|||
|
|
1 друг: +7 дней
|
|||
|
|
5 друзей: +65 дней (35 + 30 milestone)
|
|||
|
|
10 друзей: +130 дней (70 + 60 milestone)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что можно улучшить в V1.1**:
|
|||
|
|
- Визуальные badges (Bronze/Silver/Gold)
|
|||
|
|
- Leaderboard на странице /referral
|
|||
|
|
- Уведомления в Telegram при milestone
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚫 Семейные планы - Почему отложены?
|
|||
|
|
|
|||
|
|
**Проблема**: Marzban **НЕ имеет** встроенного механизма ограничения устройств.
|
|||
|
|
|
|||
|
|
**Что НЕ доступно**:
|
|||
|
|
```json
|
|||
|
|
// В UserCreate API нет:
|
|||
|
|
{
|
|||
|
|
"device_limit": 5, // ❌
|
|||
|
|
"ip_limit": 5, // ❌
|
|||
|
|
"max_connections": 5 // ❌
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Что есть**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"online_at": "2026-02-08T10:30:00Z", // ✅ Последняя активность
|
|||
|
|
"sub_last_user_agent": "v2rayNG" // ✅ User agent
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Варианты решения**:
|
|||
|
|
|
|||
|
|
| Вариант | Точность | Сложность | Время |
|
|||
|
|
|---------|----------|-----------|-------|
|
|||
|
|
| 1. Мониторинг `online_at` | ❌ Низкая | Средняя | 8h |
|
|||
|
|
| 2. IP-based мониторинг | ❌ Низкая | Низкая | 4h |
|
|||
|
|
| 3. Xray патчи | ✅ Высокая | Очень высокая | 80h+ |
|
|||
|
|
| 4. Sub-users (5 аккаунтов) | ✅ Высокая | Средняя | 12h |
|
|||
|
|
| 5. **Без ограничений + ToS** | N/A | Нулевая | 0h |
|
|||
|
|
| 6. **Log monitor (V2.0)** | ✅ Высокая | Высокая | 40h |
|
|||
|
|
|
|||
|
|
**Решение для MVP**: Отложить на V2.0, для MVP - полагаться на ToS и честность пользователей.
|
|||
|
|
|
|||
|
|
**Решение для V2.0**: Разработать Device Monitor Service с парсингом Xray логов в реальном времени.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📅 Timeline
|
|||
|
|
|
|||
|
|
### Неделя 1 (Backend):
|
|||
|
|
- [ ] День 1-2: Создать /api/nodes (3 часа)
|
|||
|
|
- [ ] День 3-5: Обновить /api/create-user с period + locationIds (5 часов)
|
|||
|
|
|
|||
|
|
### Неделя 2 (Frontend):
|
|||
|
|
- [ ] День 1-3: Переработать /app/plans/page.tsx (8 часов)
|
|||
|
|
- [ ] День 4: Компоненты PeriodSelector + LocationSelector (2 часа)
|
|||
|
|
- [ ] День 5: Стилизация + тестирование (2 часа)
|
|||
|
|
|
|||
|
|
### Неделя 3-4 (Payment + Testing):
|
|||
|
|
- [ ] Интеграция YooKassa/Stripe
|
|||
|
|
- [ ] Webhook для обработки оплат
|
|||
|
|
- [ ] E2E тесты полной воронки
|
|||
|
|
- [ ] n8n bot updates
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 KPI успеха
|
|||
|
|
|
|||
|
|
**Метрики для отслеживания**:
|
|||
|
|
1. Конверсия выбора периода:
|
|||
|
|
- Сколько % выбирают 1м/3м/6м/год?
|
|||
|
|
- Какой период дает наибольший LTV?
|
|||
|
|
|
|||
|
|
2. Выбор локаций:
|
|||
|
|
- Топ-3 популярных локации
|
|||
|
|
- Сколько % пользователей меняют дефолтный выбор?
|
|||
|
|
|
|||
|
|
3. Реферальная программа:
|
|||
|
|
- % пользователей с рефералами
|
|||
|
|
- Average referral count per user
|
|||
|
|
- Impact на retention
|
|||
|
|
|
|||
|
|
4. Revenue:
|
|||
|
|
- ARPU (Average Revenue Per User)
|
|||
|
|
- LTV (Lifetime Value)
|
|||
|
|
- Churn rate
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 Следующие действия
|
|||
|
|
|
|||
|
|
1. ✅ Анализ завершен
|
|||
|
|
2. ✅ Feedback учтен:
|
|||
|
|
- ❌ Динамическое ценообразование отклонено
|
|||
|
|
- ⏸️ Семейные планы отложены на V2.0
|
|||
|
|
- ✅ Реферальная система работает
|
|||
|
|
3. ⏳ **Начать разработку MVP** (2 недели)
|
|||
|
|
4. ⏳ Выбрать payment gateway (YooKassa?)
|
|||
|
|
5. ⏳ Setup Telegram bot webhook для уведомлений
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Полная документация**: См. `PRICING-LOCATION-ANALYSIS.md` (1400+ строк детального анализа)
|
|||
|
|
|
|||
|
|
**Готов к старту!** 🚀
|