# Flujo Reseller End-to-End — BewPro

> Actualizado: 2026-04-13
> Documenta el proceso completo desde que un reseller solicita un producto hasta que el cliente lo usa.

---

## Resumen del modelo

```
BewPro (plataforma)          → Provisiona producto, cobra suscripción mensual
Reseller (ej. Compañía Digital) → Recopila data, carga contenido, capacita cliente
Cliente (negocio)             → Usa su sitio, paga suscripción a BP
```

**Regla clave:** Transcurrido el período de gracia (15 días), el proyecto debe tener suscripción activa en BewPro o se pausa automáticamente.

---

## Pipeline completo

```
1. SOLICITUD     → CD llena form-reseller (/form-reseller)
                   → Airtable: Projects.Required + Grace_Period_End
                   → Email a CD: "Solicitud registrada"

2. PROVISIÓN     → BP cron detecta Required (cada 5-10 min)
                   → cPanel + DB + DNS + SSL + bewpro:new --clean
                   → Airtable: Projects.On Development
                   → Email a CD: credenciales + deadline onboarding
                   → Email a CLIENTE: credenciales + "tu reseller te acompaña"

3. ONBOARDING    → CD accede al admin con credenciales
                   → Carga data del cliente (bewpro:seed o admin panel)
                   → Capacita al cliente
                   → Gestiona suscripción (Stripe, transferencia, lo que arregle)
                   → Plazo: 15 días máximo

4. ACTIVACIÓN    → Suscripción activa en Airtable
                   → Airtable: Projects.Active
                   → Si no hay suscripción al vencer gracia → Projects.Paused

5. VIDA ACTIVA   → Stripe cobra mensualmente
                   → Pago OK → todo bien
                   → Pago falla → email al cliente + 3 reintentos
                   → 3 fallos → sitio pausado
```

---

## Airtable: Pipeline_Status

| Estado | Significado | Quién lo setea |
|--------|------------|----------------|
| Required | Solicitud nueva, pendiente de provisión | form-reseller / Stripe webhook |
| Processing | BP está provisionando (evita duplicados) | process-airtable.sh |
| On Development | Sitio provisionado, CD cargando data | process-airtable.sh |
| Onboarding | CD capacitando al cliente | Manual (CD) |
| Active | Cliente usando el sitio, suscripción activa | Automático (check-grace / webhook) |
| Paused | Sitio suspendido (falta pago o gracia vencida) | Automático |
| Archived | Proyecto cancelado/cerrado | Webhook subscription.deleted |
| Failed | Error en provisión | process-airtable.sh |

---

## Emails automatizados

### Para el RESELLER (CD):

| Email | Cuándo | Contenido |
|-------|--------|-----------|
| ResellFormSubmittedMail | Al submitear form-reseller | Confirmación + detalles del pedido |
| ProjectProvisionedNotifyResellerMail | Al completar provisión | Credenciales + URL + deadline onboarding |
| GracePeriodWarningMail | Al vencer gracia sin suscripción | Aviso de pausa inminente/efectiva |

### Para el CLIENTE:

| Email | Cuándo | Contenido |
|-------|--------|-----------|
| SiteProvisionedMail | Al completar provisión | Credenciales + "tu reseller te acompaña" |
| PaymentFailedMail | Pago recurrente falla | Aviso con contador de intentos |
| SubscriptionSuspendedMail | 3 pagos fallidos | Sitio pausado + instrucciones |

---

## Campos clave en Airtable

### Tabla Projects (tblzCgJZCbbt5j13Q)
- `Name`, `Email`, `Domain`, `Product` (linked), `Reseller` (linked)
- `Pipeline_Status`, `Cpanel_User`, `Provisioned_DB`, `Provisioned_Password`
- `Stripe_Customer_ID`, `Stripe_Session_ID`
- `Grace_Period_End` — fecha límite para activar suscripción
- `Notes` — opciones de provisión (CLEAN=true, COLORS=#...)

### Tabla Subscriptions (tblnpr52JhFBBi2Mg)
- `Project` (linked), `Status`, `Plan`, `Amount_USD`, `Payment_Method`
- `Stripe_Customer_ID`, `Stripe_Subscription_ID`
- `Payment_Status` (Paid / Past Due / Failed / Suspended)
- `Failed_Attempts`, `Last_Failure_Date`, `Suspended_Date`
- `Grace_Period_End`

---

## Comandos útiles

```bash
# Listar productos disponibles
php artisan bewpro:products

# Provisionar limpio (para reseller)
php artisan bewpro:new EMAIL "NOMBRE" CORE --clean --colors="#..." --db=bp-xxx --skip-assets --no-email

# Cargar contenido del cliente
php artisan bewpro:seed database/seeders/project-data/templates/template-law-firm.json --db=bp-xxx

# Enviar emails de bienvenida
php artisan bewpro:send-welcome EMAIL "NOMBRE" URL PASSWORD --product=CORE --reseller-email=CD_EMAIL

# Verificar grace periods vencidos
php artisan bewpro:check-grace
php artisan bewpro:check-grace --dry-run
```

---

## Archivos técnicos

| Archivo | Función |
|---------|---------|
| `app/Http/Controllers/FormResellerController.php` | Form-reseller → Airtable |
| `app/Services/AirtableService.php` | CRUD Airtable + lookups |
| `app/Http/Controllers/StripeWebhookController.php` | Webhooks de pago |
| `scripts/bewpro/process-airtable.sh` | Cron: Required → Provisión |
| `scripts/bewpro/setup_cd_project2.sh` | Setup cPanel + bewpro:new |
| `app/Console/Commands/SendWelcomeEmail.php` | Emails post-provisión |
| `app/Console/Commands/CheckGracePeriods.php` | Enforcement de gracia |
| `config/provision_demo_cores.php` | Catálogo demos/cores |
| `database/seeders/products/catalog.json` | Mapeo shop → core |
