2026-07-16 — User journey + prep de junta (VW CRM)
Documento completo: ~/nef/twenty-vw-crm/docs/user-journey.md
Esqueleto para no re-derivarlo:
- Journey: DESCONOCIDO → PROSPECTO → OPORTUNIDAD → COTIZACIÓN⇄PDF → CIERRE → DMS. 6 momentos, cada uno con dueño, artefacto y salida.
- Principio rector: la conversación de venta manda; el cierre (humano) dispara la confirmación al DMS. El sistema registra, no decide.
- Cotizaciones NO se editan tras enviarse: versión nueva (-R1, -R2) con su propio PDF = historial de negociación.
- Frontera CRM/DMS en tabla; refacciones/taller/SKU = anti-alcance explícito, incluso en Fase 2.
- Fase 1 = lo ya construido (demo lista). Fase 2: versionado formal, aprobación de descuentos, WhatsApp, adapter real, postventa, multi-sucursal, import de bases largas.
- 6 preguntas de descubrimiento; la #5 (¿el DMS tiene API?) es el riesgo técnico #1.
- Argumento build vs white-label: Twenty self-hosted como tercer camino (base open source + capa custom delgada, costo trasladable).
Aclaración post-junta interna (2026-07-17)
Lo que el cliente llama “DMS” NO es Dealer Management System: es (a) historial de todos los PDFs ida/vuelta por negociación y (b) transferencia de dueño del “ticket” (oportunidad) con contexto completo. Ambos son CRM puro. Implementado: cada PDF generado se auto-adjunta a su Cotización (uploadFilesFieldFile en /metadata + createAttachment con targetCotizacionId; helpers en twenty-client.ts). PDFs entrantes del cliente: drag-drop nativo de Twenty al registro. Verificado contra el pod real. Pendiente de decisión: asesor como relación a workspaceMember (hoy TEXT) para que reasignar sea formal.
Catálogo real + PDF con marca (2026-07-17)
- Fuente: “propuesta de valor camiones y buses.xlsx” (export Nodriza del equipo) → 18 productos con propuesta de valor, paquete “Incluye” y URL de ficha. El XML de WordPress es blog/noticias, poco spec útil.
npm run seed:catalogo— upsert por nombre (scripts/seed-catalogo.ts). Campos nuevos en Modelo: propuestaValor, incluye, urlFicha. Precios de lista NO venían (solo Volksbus 15.210: $1,691,000 c/IVA); se capturan al cotizar.- PDF enriquecido: bloque del modelo cotizado (nombre, propuesta de valor, specs PBV/HP/Nm/transmisión, bullets “Incluye”) — réplica del formato Grupo Andrade.
- Bug encontrado: Twenty regresa NULL SILENCIOSO a 2 niveles de relación (cotizacion→oportunidad→cuenta). Regla: máximo 1 nivel por query, segunda query para el nivel siguiente. Corregido en pdf-propuesta y enviar-venta-dms.
Lectura de cotizaciones + seed (2026-07-17)
- Formato real del cliente (Grupo Andrade): precios IVA INCLUIDO, chasis + “equipo aliado”, vigencia “30 días o agotar existencias”, contacto WhatsApp del asesor. PDF de referencia: ~/Downloads/PDF/CONSTELLATION 18.260 VOLTEO 7 HECTORP.pdf
- Rastreo de lectura: NO cookie/pixel. Link público /c/:token en el runner (token UUID por cotización, campo tokenLectura); al abrirlo sirve el PDF y marca leidaEn + lecturas en el CRM. El PDF enviado lleva el link al pie (“ver propuesta en línea”). Requiere RUNNER_PUBLIC_URL pública (Cloudflare Tunnel al System76).
- Seed demo:
npm run seed(idempotente por folio COT-2026-0007). Caso estrella: negociación volteo con 4 revisiones (R0→R3: opciones entran/salen, descuento 2.5%, flete cortesía), PDFs auto-adjuntos, actividades y recordatorio vencido para demo del job.