# Flujo de Producto — del concepto al marketplace

> Source of truth: este documento explica los 5 estados por los que pasa un producto, qué lo desbloquea, y qué comando ejecutar en cada paso. Está alineado con `formula-de-productos.md` (qué es un producto) y `provision/checklist-production-ready.md` (criterios técnicos).

## Los 5 estados

```
[0] IDEA / DEMAND
      │  ¿hay misiles que lo piden? ¿es gap estratégico?
      ▼
[1] CORE PRESET
      │  JSON en disco + demo + módulos
      ▼
[2] CERTIFIED
      │  bewpro:certify-product → 100/100
      ▼
[3] CATALOG ENTRY
      │  row en products + copy + Stripe Live Price
      ▼
[4] LIVE EN MARKETPLACE
         is_active=1, vendible en /products-catalogue
```

Cada flecha es una **transición controlada por un comando**. Si entendés las 4 transiciones, entendés todo el flujo.

---

## Tabla canónica — estado, qué tiene, qué falta, cómo avanza

| Estado | Qué existe | Cómo se valida | Cómo se avanza al siguiente | Costo típico |
|--------|-----------|---------------|----------------------------|--------------|
| **[0] IDEA** | concept en `product_concepts` (stage `idea`/`in_dev`/`ready_to_promote`) o misil con `product_slug` que no existe | Aparece en `/reseller/factory?view=board` o en columna "Demanda detectada" | Decidir alcance (¿cambio sólo copy? ¿módulos? ¿demo?) y crear core preset | depende del scope |
| **[1] CORE PRESET** | `database/seeders/products/core/{slug}.json` con demo, modules, modules_navigation, skin, fonts, schema_type, header.cta_button, brand_defaults | El JSON parsea, el demo referenciado existe (header/footer/css presentes), módulos válidos | `bewpro:certify-product {slug}` | 2-4h core nuevo / 1-3 días demo nuevo |
| **[2] CERTIFIED** | core JSON 100/100 en `bewpro:certify-product`: paridad vista↔schema↔admin↔json + seeds canónicos sin duplicados | `meta.cert_score = 100` persistido en `products` (o ProductCertifyCommand ejecutado) | INSERT en `products` + crear copy + Stripe Live Price | 30-90 min |
| **[3] CATALOG ENTRY** | row en `products` con: `core_slug`, `name`, `price`, `stripe_price_id`, copy completo (`target_persona`, `pain_points`, `value_props`, `cta_primary`, `keywords`, `tagline`), entry en `catalog.json` | `bewpro:catalog:status --by-core` muestra row+stripe; `health.maturity.commercial ≥ 80` | `bewpro:product:activate {slug}` o `--bulk-by-core={core}` | < 1 min (toggle) |
| **[4] LIVE EN MARKETPLACE** | `is_active=1` + Stripe configurado | Aparece en `/products-catalogue/{slug}` y en `bewpro:catalog:status` columna ACTIVE | — (esto es destino) | — |

---

## Comandos por transición

```bash
# [1] → [2] Certificar
php artisan bewpro:certify-product {slug}            # un core
php artisan bewpro:certify-product --all             # todos los del marketplace

# [2] → [3] Crear catalog entry (manual o vía catalog seed)
# Editar database/seeders/products/catalog.json + INSERT en products
# El copy viene de Airtable Shop Products Copy (column "Headline", "Subheadline", etc)
php artisan bewpro:catalog:seed [--dry-run] [--update]

# [3] → [4] Activar (toggle is_active)
php artisan bewpro:product:activate {slug}                    # un slug
php artisan bewpro:product:activate --bulk-by-core={core}     # todas las variantes de un core
php artisan bewpro:product:activate --bulk-by-core=X --dry-run # preview, no escribe

# Visibilidad — leer estado del catálogo
php artisan bewpro:catalog:status              # resumen del funnel
php artisan bewpro:catalog:status --by-core    # desglose por core
```

---

## Matriz de madurez — 6 ejes por producto

Un producto **deluxe** tiene los 6 ejes ≥ 80%. Lo trackea `ProductHealthService::maturityFor()`. Surface visual en `/reseller/factory/product/{slug}` y en `?view=focus`.

| Eje | % | Cómo se logra |
|-----|---|---------------|
| ⚙️ **Técnico** | cert_score | `bewpro:certify-product {slug}` debe dar 100/100 |
| 💬 **Comercial** | % campos copy llenos (6 campos) | Editar `products` con tagline, target_persona, pain_points, value_props, cta_primary, keywords |
| 🖼️ **Visual** | % assets landing (7 campos) | Subir card_image, hero_poster, hero_video, parallax_image, grid_image_1/2/3 |
| 📝 **Seeds** | % módulos del core con seed | Crear `database/seeders/products/core/seeds/{mod}-{slug}.json` por cada módulo |
| 🌐 **Proof** | clamp(tenants_live × 25%) | Tener 4+ tenants live mostrando el producto = 100% |
| 🚀 **Sales** | clamp(misiles_launched × 20%) | 5+ ventas reales = 100% |

> **El cert_score técnico es solo 1 de 6 ejes.** Un producto puede ser cert=100 pero tener visual=0 y sales=0. La verdadera madurez es multi-dimensional.

---

## Cómo escalar (formula explícita)

Source: `formula-de-productos.md` tabla de costos. Estimador en código: `ProductFactoryService::estimateEffort($baseSlug, $target)`.

| Tipo de adición | Esfuerzo | Recipe |
|-----------------|----------|--------|
| **Shop variant pura** (cambio name + colores + copy) | 30 min | INSERT products + Stripe Price + entry catalog.json |
| **Variant con 1 módulo distinto** (override) | 1-2 h | Core JSON nuevo (clonar y editar `modules`) + verificar dynamic-header + INSERT + Stripe |
| **Core nuevo sobre demo existente** | 2-4 h | Core JSON nuevo + seeds + cert 100/100 + INSERT + Stripe |
| **Core nuevo con módulos sin dynamic-header en ese demo** | 3-5 h | Lo anterior + editar `views/modules/{mod}/frontend/partials/dynamic-header.blade.php` |
| **Demo nuevo** (template visual completo) | 1-3 días | Header + footer + page-header + 3 cd-base blades + CSS + skin + 10× dynamic-headers de módulos |
| **Módulo funcional nuevo** | 3-5 días | Model + migrations + controllers + admin + routes + frontend views + dynamic-header |

### Palanca de mayor escalado

**Shop variant pura ≈ 30 min** es la palanca con mejor ratio impacto/esfuerzo. La fórmula es:

1. **Tomar core existente cert 100/100** (hoy hay 9: art-design, personal-brand, real-estate, corporative, foundations-ong, restaurant-bar, law-firm-digital, construction, creative-video-editor)
2. **Variar sólo COPY** (las 6 campos copy + name) para apuntar al nuevo nicho
3. **Cambiar colores** (skin via brand_defaults o vía settings cuando se provisiona el tenant)
4. **Crear Stripe Price** + INSERT en products + entry catalog.json
5. **Activar** con `bewpro:product:activate {nuevo-slug}`

Resultado: producto nuevo en marketplace en ~30 min sin tocar código.

---

## Bloqueos típicos y cómo resolverlos

| Bloqueo | Síntoma en dashboard | Cómo resolver |
|---------|---------------------|---------------|
| **Cert < 80** | Launch Queue columna Cert en rojo | Correr `bewpro:certify-product {slug} --verbose-details`, fix gaps reportados |
| **Sin Stripe Price** | INACTIVE_NO_STRIPE en status | Operador crea Price en Stripe Dashboard → guarda `stripe_price_id` en products |
| **Sin row en products** | NO_PRODUCT_ROW en status | Correr `bewpro:catalog:seed` o INSERT manual |
| **Demo no existe** | `bewpro:certify-product` falla en "Demo schema" | Construir demo (1-3 días) o usar otro demo |
| **Dynamic header de módulo no registrado** | `modules_dynamic_headers` check falla | Editar `views/modules/{mod}/frontend/partials/dynamic-header.blade.php` agregando `@if($activeDemo === 'demo-X')` |

---

## Dashboard maestro — qué vista usar para qué

| Necesidad | Vista | Ruta |
|-----------|-------|------|
| Ver realidad del funnel completo (estado de los 240) | Tiers | `/reseller/factory?view=tiers` |
| **Operar** activación bulk por core (palanca real) | **Launch** | `/reseller/factory?view=launch` |
| Pulir los productos ya vendibles (los 11/98) | Focus | `/reseller/factory?view=focus` |
| Cobertura industria × demo (gaps estratégicos) | Matrix | `/reseller/factory?view=matrix` |
| Pipeline de ideación (concepts kanban) | Board | `/reseller/factory?view=board` |
| Detalle de un producto + anatomía + linaje | Ficha producto | `/reseller/factory/product/{slug}` |

---

## Plan inmediato de activación (estado al 2026-05-30)

Con la activación de los 8 cores cert 100/100 + sus 87 variantes con Stripe, el marketplace pasa de **11 → 98 productos vendibles**.

**Próximos cuellos (en orden de leverage):**

1. **Certificar 3 cores más populosos:** agency (33 variants), business-catalogue (23), nutritionist (15). Si pasan a 100/100, desbloquean ~71 variantes adicionales.
2. **Crear 77 Stripe Prices faltantes** (operador, ~2 min cada uno = ~2.5 h). Desbloquean otros 77 productos potenciales.
3. **Levantar `meta.visual`** de los productos top 10 (subir hero_video, card_image, parallax) para que la madurez multi-dimensional pase a deluxe completo.

**El piso teórico con el esfuerzo actual: 11 → 98 → 169 → 246 productos vendibles.**

---

## Anti-features (qué NO construir)

- ❌ Editor visual de "cambiar variable" — overkill. El `concept_form?based_on=` ya alcanza.
- ❌ Comando `bewpro:product:launch` desde concept — los 152 ya están en DB, sólo necesitan toggle.
- ❌ Sync automático Airtable → products en producción — riesgo de pisar cambios manuales.
- ❌ Más vistas tabulares en factory — son 6 y representan los 6 ángulos del método. Agregar más = confusión.

---

> **Filosofía:** simple, económico, directo, efectivo. Cada feature del factory debe pasar el test "¿esto reduce el tiempo entre idea y producto vivo?". Si no → no se construye.
