Este archivo es la referencia única de arquitectura, hitos, cronograma Gantt, próximos pasos y stack por capas. Actualizarlo cuando cambien migraciones Supabase, rutas API, reglas de cancelación/multas o el avance real frente al plan.
Formato Word: en la raíz del repo ejecutar npm run export:memoria-docx → docs/Memoria-tecnica-Uber-Truck.docx y copia en Downloads/Proyecto Uber Truck/. Pack completo: npm run export:all-docs.
MVP final = una sola app web con funcionamiento lo más parecido posible a Uber (pedir → emparejar → viaje en curso → chat → cancelar → cuenta), adaptado a carga por camión. El usuario ya sabe usar Uber; la curva de aprendizaje debe ser mínima.
Objetivo comercial: ganar usuarios y viajes reales con esta app propia. Objetivo estratégico a futuro: demostrar tracción y ofrecer el producto como add-on / integración a plataformas grandes (ej. marketplace logístico o apps de movilidad), no reemplazarlas desde el día uno.
Descartado para el MVP: piloto paralelo con WhatsApp + Airtable fuera de la app. Todo el piloto y la operación van dentro de Uber Truck.
Embarcadores y transportistas usan la misma app (public/): publicar demanda u oferta, ver sugerencias de match, aceptar, seguir estados, chatear, cancelar y revisar multas/cuenta. Backend Node.js 20 + Express 4, datos en Supabase, auth JWT, deploy Railway, código en GitHub.
Priorizar paridad de flujo Uber y usuarios activos en la app antes que integraciones B2B o Open Finance. Pagos in-app y mapa en vivo entran cuando el flujo base ya se usa sin fricción.
Resumen may 2026: el MVP final de flujo está cerrado en producción (v0.0.129). Post-MVP ítems FCM y contraseña fuerte cerrados; recuperar clave con código listo pero bloqueado para multi-cuenta piloto hasta dominio Resend (ver DOMAIN-AND-EMAIL.md). Canvas plan: canvases/cubik-plan-native-escala.canvas.tsx.
| Flujo tipo Uber | Uber Truck | Estado MVP |
|---|---|---|
| Pedir un viaje | Embarcador publica carga | Hecho |
| Conductor disponible / acepta | Transportista publica capacidad y acepta match | Hecho |
| Viaje en curso (estados) | Propuesto → aceptado → en ejecución → completado | Hecho |
| Chat con la otra parte | Chat in-app por match (+ presets en ruta) | Hecho v0.0.97+ |
| Cancelar con reglas | Modal motivos, acuerdo mutuo, multas sugeridas | Hecho |
| Iniciar sesión / registro | Email + contraseña (JWT) | Hecho |
| Notificaciones | Campana in-app; activos vs historial; archivo al cerrar viaje | Hecho v0.0.125 |
| Mis viajes | Pestaña Mis viajes + banner viaje activo + calificación | Hecho v0.0.28+ |
| Publicar / ofertar | Pedir flete / Ofertar ruta + mis cargas/ofertas (owner_user_id) | Hecho |
| Buscando camiones | Sugerencias con estado «buscando…» | Hecho |
| Precio oferta/demanda | Rango embarcador + oferta transportista + aceptación + tarifa sugerida calibrada | Hecho v0.0.105+ |
| Declaración de carga y confianza | Valor ref. CLP, guía, términos, incidentes drawer | Hecho v0.0.98+ |
| Mapa / dirección | Google Maps origen–destino + distancia + navegar Maps/Waze | Hecho |
| Mapa en vivo / GPS | Ubicación transportista + mapa en viaje activo | Hecho v0.0.34+ |
| Anti-bypass teléfono | Bloqueo números en chat; botón Llamar (UI lista) | Hecho v0.0.98 |
| Incidentes / perfil shell | Drawer incidente, shell Cuenta tipo Uber | Hecho v0.0.97–0.0.98 |
| Calificación ★ | Mutua 1–5 + chips por rol; reputación en tablero | Hecho v0.0.28–0.0.31 |
| Perfil y cuenta | Empresa, billetera multi-cuenta, multas, comprobante | Hecho v0.0.94+ |
| Cubicación carga / oferta | Pallets ↔ m³, preset, tipo camión, camión habitual | Hecho v0.0.90–0.0.93 |
| Pago en app (piloto) | Cubik Saldo piloto 10/5 — Pagar post-completed + notif transportista | Hecho v0.0.100–0.0.104 |
| Checkout UX (piloto) | Drawer «Pagar con Cubik Saldo» + desglose por rol | Hecho v0.0.102+ |
| QA automatizado | Unit + Playwright + CI GitHub + Laboratorio /qa-lab | Hecho v0.0.125 |
| App Android testers | Capacitor + APK remoto/bundle + verify login | Hecho v0.0.125 |
| Distribución sin tienda | /probar + APK + PWA iPhone | Hecho jun 2026 |
Validar en orden: Checklist interactivo Post-MVP · Guía MD · API GET /api/post-mvp/status
| Flujo / capacidad | Uber Truck | Estado | Ventana |
|---|---|---|---|
| Login Gmail / Apple | OAuth Google + Sign in with Apple | Bloque E — post-piloto | Q3 2026+ |
| Recuperar contraseña | Enlace por correo (Resend) | Código validado; piloto bloqueado sin dominio propio | P0 — dominio |
| Política contraseña + cambio en app | 8+ chars, mayúscula, número; Seguridad en Cuenta APK | Hecho v0.0.128 | — |
| Pago en app (prod) | Wallet real + retención al «En ruta»; escrow 10/5 | P0 siguiente | Sem 2–8 piloto |
| Llamadas enmascaradas | Twilio Proxy — botón Llamar | UI lista v0.0.98; proxy pendiente | Sem 2–4 |
| Push móvil (FCM) | Token Android + envío servidor | Cerrado — 3 push en 2.º plano | — |
| GPS background (app cerrada) | Plugin Capacitor / módulo nativo lite | Spike sem 4–9 si piloto lo exige | Ver canvas nativo |
| App iOS nativa | TestFlight / App Store | Hoy PWA vía /probar | Post escala |
| Escrow checkout en ruta | Retención al «Marcar en ruta» (prod) | Diseño cerrado; wallet real primero | Con U7 prod |
Entrevistas en nodo industrial (San Bernardo / RM), validación de precio/comisión y borrador legal + seguro piloto.
En curso — paralelo al MVP digital ya desplegado y demo comercial.
Cerrar la paridad de flujo en la misma app: mis viajes por cuenta, copy y pasos al estilo Uber, piloto con 20 viajes reales hechos 100% en la plataforma (hito M2).
MVP flujo cerrado (v0.0.129). Pendiente operacional: dominio/correo Resend → 20 viajes M2 + piloto 25 empresas / 50 transportistas — no más pantallas core.
owner_user_id — mis cargas / mis ofertas: hecho.docs/img/ opcional.match_ratings, chips tags/tag_band).POST /api/matches/:id/rate, catálogo /rating-tags-catalog.json, UI trips-ui.js + rating-tags.js.capacity-offers, load-requests, matches, sugerencias automáticas, comms, cuenta.bank-gate — en producción no publicar/ofertar/emparejar sin banco completo (BANK_ENFORCE).kyc_status=approved); owner_user_id en listados./health + documentación en /docs/.KYC manual, ratings bidireccionales (adelantado — mayo 2026), microseguro POC, 100 viajes digitales (M4). Pendiente: reputación visible en tablero Emparejar (M3).
Match semi-automático por corredor, dashboard embarcador frecuente, informe red de capacidad (M5).
Con métricas de uso (viajes, retención, NPS), empaquetar capacidad ociosa como módulo integrable (API + widgets) para socios tipo marketplace o apps de movilidad. Requiere MVP propio maduro y casos de éxito en Chile.
Las fechas son orientativas (jun 2026 – mar 2027). El Gantt detallado por mes está en este mismo documento (no hace falta abrir otro archivo).
| Estilo | Significado |
|---|---|
| Hecho | Entregado en repo / producción |
| En curso | Trabajo activo |
| Planificado | No iniciado o pendiente de priorización |
| — | Fuera del trimestre |
| Fase | Nombre | Inicio | Fin | Duración |
|---|---|---|---|---|
| 0 | Descubrimiento y legal | 2026-06-01 | 2026-06-28 | 4 sem |
| 1 | MVP final app (paridad Uber + piloto) | 2026-06-01 | 2026-08-31 | 12 sem |
| 2 | MVP digital v1 | 2026-08-01 | 2026-10-25 | 12 sem |
| 3 | Piloto escalado + confianza | 2026-10-01 | 2027-01-31 | 16 sem |
| 4 | Producto B2B (SaaS) | 2027-02-01 | 2027-03-31 | 8 sem |
| Fase | 2026 T2 abr–jun |
2026 T3 jul–sep |
2026 T4 oct–dic |
2027 T1 ene–mar |
|---|---|---|---|---|
| 0 · Descubrimiento | En curso | Plan | — | — |
| 1 · MVP final app | Paridad cerrada | Piloto 25/50 + M2 | Operación | — |
| 2 · MVP digital | Hecho | Hecho | Wallet prod | Escala |
| 3 · Confianza | — | — | Plan | En curso |
| 4 · SaaS | — | — | — | Plan |
| Hito | Fecha plan | Estado real (10 jun 2026) |
|---|---|---|
| M1 Descubrimiento + legal | 28-jun-2026 | En curso |
| M3 MVP digital en producción | 25-oct-2026 | Hecho (adelantado jun 2026) |
| M2b Demo comercial + plan piloto 25/50 | 13-jun-2026 | Esta semana |
| M2 20 viajes en la app (piloto corredor) | 31-ago-2026 | P0 operación |
| M4 100 viajes digitales | 31-ene-2027 | Pendiente |
| M5 Match semi-auto + SaaS | 31-mar-2027 | Pendiente |
| Métrica | Meta M2 | Meta M4 |
|---|---|---|
| Emparejamientos exitosos | 20 | 100 |
| Tiempo medio match | < 4 h | < 1 h (digital) |
| Take rate | 15% (10% + 5%) | 15% efectivo |
| NPS transportista | ≥ 7 | ≥ 8 |
Interpretación 25 may 2026: MVP flujo cerrado (v0.0.129); FCM y contraseña fuerte cerrados; SQL prod 23/23 OK; foco = dominio Resend (P0) → demo comercial → piloto 25/50 → 20 viajes M2. Wallet prod y Twilio en cola P0; OAuth/iOS fuera de alcance inmediato. cubik.cl y cubik.com ocupados — variante compuesta sin renombrar app.
El cuello de botella del marketplace no es el código sino la oferta y demanda simultánea. El piloto M2 se concentra en un corredor para lograr densidad operacional.
| Elemento | Definición |
|---|---|
| Corredor principal | RM (origen, ej. San Bernardo / nodo industrial) ↔ Valparaíso / San Antonio (destino) |
| Meta semanal liquidez | ≥ 3 cargas publicadas y ≥ 2 ofertas activas en el mismo corredor |
| Meta M2 | 20 matches completed en ese corredor (jul–ago 2026) |
| Ancla | 1 transportista ruta fija + 2–3 embarcadores PYME del nodo |
Detalle operativo: Piloto M2 — corredor, KPIs y riesgos.
| KPI | Cálculo (resumen) | Meta M2 |
|---|---|---|
| Match rate | Cargas con match aceptado / cargas con ≥1 propuesta | ≥ 60% |
| Tiempo a match | Mediana publicación → accepted | < 4 h |
| Cancelación post-asignación | Cancelados tras accepted / total aceptados | < 10% |
| Viajes completados | matches.completed en corredor piloto | 20 |
| Take rate efectivo | 15% (10% embarcador + 5% transportista) sobre agreed_price_clp | Registrar en piloto |
| Tiempo respuesta carrier | Propuesta → oferta CLP | < 2 h laboral |
| NPS ambos roles | Encuesta manual post-viaje | ≥ 7 |
| Repetición embarcador 60 d | ≥ 2 cargas mismo embarcador | ≥ 30% |
| Riesgo | Mitigación piloto | Responsable |
|---|---|---|
| Robo / extravío | 011 declaración, incidentes, términos, seguro manual | Transportista + seguro |
| Carrier fantasma | Registro empresa, KYC manual | Plataforma + embarcador |
| Declaración falsa carga | Valor ref. + guía/folio; sin SII auto aún | Embarcador |
| No-show / retraso | Estados, multas, chat | Transportista |
| Daño mercadería | Incidente damage; foto entrega (roadmap) | Partes |
| Disputa «app paga» | Intermediación explícita; tabla cobertura en anexo piloto | Plataforma aclara |
La plataforma no transporta ni reembolsa el valor declarado de la mercadería por defecto. Transportista ejecuta el flete; embarcador declara con veracidad; Uber Truck facilita match, registro, chat, incidentes y reglas de cancelación.
Tabla completa: anexo piloto §4 · términos cargo-trust-v1.
Prioridad: P0 bloquea piloto; P1 siguiente entrega; P2 planificado. Actualizar al cerrar cada release o semana de piloto. Detalle comercial: PLAN-COMERCIAL-PILOTO.md · canvas cubik-plan-native-escala.
| ID | P | Actividad | Entregable | Ventana | Estado |
|---|---|---|---|---|---|
| Cerrado — MVP digital y paridad UX | |||||
| U1 | — | SQL 004–030 en Supabase prod | Chat, notif, banco, ratings, FCM, billetera | May–Jun 2026 | Hecho |
| U4 | — | Scopes por rol + registro empresa | shipper/carrier/admin | May 2026 | Hecho |
| U4b–f | — | Precio, confianza, calificaciones, reputación tablero | 010–014 SQL + UI | May 2026 | Hecho |
| U5 | — | UX paridad Uber completa | Cubik móvil, cubicación, billetera, chat, incidentes | Jun 2026 | Hecho v0.0.90–0.0.125 |
| U7a | — | Cubik Saldo piloto 10/5 | SQL 026, pilot-pay, badges, notif | Jun 2026 | Hecho v0.0.100–0.0.104 |
| U7m | — | Multas + comprobante + banco obligatorio | SQL 022–025, bank-gate | May 2026 | Hecho v0.0.57 |
| U13 | — | QA automatizado + Laboratorio | Playwright, unit, CI, /qa-lab | Jun 2026 | Hecho v0.0.125 |
| U14 | — | Notificaciones activas vs historial | notification-visibility.js | Jun 2026 | Hecho v0.0.125 |
| U15 | — | Memoria v4.3 + docs hub | Gantt, paridad MVP cerrada, plan comercial | 10 jun 2026 | Hecho |
| U16 | — | Push FCM validado en teléfono físico | Segundo plano + acciones viaje | May 2026 | Cerrado |
| U17 | — | Contraseña fuerte + cambio clave APK | password-policy.js, Seguridad Cuenta | v0.0.128 | Cerrado |
| U18 | — | Resend forgot/reset en prod | Errores visibles, cooldown 2 min, /health mail | v0.0.129 | Código cerrado |
| U19 | — | SQL verificación prod 23/23 + 014 | RUN_VERIFY_ALL_MIGRATIONS.sql | May 2026 | Cerrado |
| En curso — comercial y piloto (sem 1–16) | |||||
| E0 | P0 | Dominio propio + Resend verificado | EMAIL_FROM=noreply@… — DOMAIN-AND-EMAIL.md | Inmediato | Bloqueante piloto correo |
| C1 | P0 | Demo comercial jueves | Web prod + APK remoto; cuentas demo; guión DEMO-GUION.md | Sem 1 (9–13 jun) | Esta semana |
| C2 | P0 | Checklist demo (login, emparejar, qa:lab) | 6 ítems canvas «Antes del jueves» | Sem 1 | En curso |
| C3 | P0 | Onboarding piloto 25 empresas + 50 transportistas | KYC manual + banco; corredor RM–V | Sem 2–5 | Siguiente |
| C4 | P0 | APK bundle firmado testers | cubik-android.apk dedicado piloto | Sem 2–3 | En cola |
| U6 | P0 | Piloto 20 viajes corredor RM ↔ V/San Antonio | M2 — liquidez + densidad | Sem 6–13 (jul–ago) | P0 operación |
| U6b | P1 | KPIs marketplace M2 (semanal) | Match rate, tiempo, NPS — anexo piloto | Sem 6–13 | Doc listo |
| Cola P0/P1 — producto post-MVP | |||||
| U7 | P0 | Cubik Saldo prod + escrow en ruta | Wallet, ledger, retención; tier $1M | Sem 2–8 | En cola |
| U7d | P0 | Twilio Proxy llamadas | TWILIO_MATCH_PROXY_NUMBER | Sem 2–4 | UI lista v0.0.98 |
| C5 | P1 | Spike GPS background (Capacitor) | Plugin + servicio Android si piloto lo exige | Sem 4–9 | Plan canvas |
| C6 | P1 | Validar push FCM en teléfono físico | Segundo plano + acciones de viaje | Sem 1–3 | Hecho 10 jun 2026 |
| U6c | P1 | Reputación v0 | Cancelaciones + incidentes por cuenta | Post 5 viajes | Plan |
| U6d | P1 | Evidencia entrega | Foto + timestamp | Post-piloto corto | Plan |
| Escala — sem 10+ (50+ empresas / 200 camiones) | |||||
| C7 | P1 | Auditoría costo Maps 200 camiones | Presupuesto ~USD 2.100/mes infra | Sem 10–12 | Plan |
| C8 | P1 | Decisión go/no-go nativo lite | Umbral: >40 camiones mapa o quejas GPS | Sem 12 | Plan |
| C9 | P2 | Play Store closed testing / MDM | Distribución flota escala | Sem 10+ | Plan |
| Fuera de alcance inmediato | |||||
| U4d | P2 | PDF guía + validación SII/DTE | Storage + facturador | Post-piloto | Plan |
| U10 | P2 | Login Gmail + Apple (bloque E) | OAuth — post-piloto | Post-M2 | Diferido |
| U11 | P1 | Panel admin KPIs piloto | Viajes, GMV, NPS — ver pitch panel | Con M2 | Diseño listo |
| U8 | P2 | KYC manual ampliado | Fase 3 operativa | Oct 2026+ | Plan |
| U9 | P2 | Match semi-auto corredor | Algoritmo v1 | Feb 2027 | Plan |
No hacer aún: rewrite 100 % nativo, Open Finance, pricing dinámico completo, expansión multi-corredor sin liquidez. Priorizar operación piloto sobre más pantallas.
Alineado a canvases/cubik-plan-native-escala.canvas.tsx. Barras ████ = ventana activa por semana (S1 = 9–13 jun).
| ID | Fase / tarea clave | Resp. | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | S15 | S16 | Estado |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| C1 | Prep demo comercial (jueves) | E/O | ████ | Esta semana | |||||||||||||||
| C2 | Verificar prod login + Emparejar + APK remoto | E | ████ | Checklist canvas | |||||||||||||||
| C3 | Cuentas demo + viaje ejemplo embarcador/transportista | O | ████ | En curso | |||||||||||||||
| C4 | Onboarding piloto 25 empresas + 50 transportistas | O/E | ████ | ████ | ████ | ████ | Sem 2–5 | ||||||||||||
| C5 | APK bundle firmado + link testers piloto | E | ██ | ██ | Sem 2–3 | ||||||||||||||
| C6 | Operación piloto + monitoreo Railway + soporte WhatsApp | O/E | ████ | ████ | ████ | ████ | ████ | ████ | ████ | ████ | Sem 6–13 | ||||||||
| U6 | 20 viajes completed corredor RM ↔ V (M2) | O | ████ | ████ | ████ | ████ | ████ | ████ | ████ | ████ | KPI M2 | ||||||||
| C7 | Spike GPS background (Capacitor / nativo lite) | E | ██ | ██ | ██ | ██ | ██ | ██ | Paralelo S4–9 | ||||||||||
| U7 | Wallet real + escrow en ruta | E | ██ | ██ | ██ | ██ | ██ | ██ | ██ | P0 prod | |||||||||
| U7d | Twilio Proxy (Llamar enmascarado) | E | ██ | ██ | ██ | Sem 2–4 | |||||||||||||
| C8 | Prep escala 50+ empresas / 200 camiones | E/O | ████ | ████ | ████ | ████ | ████ | ████ | ████ | Sem 10–16 | |||||||||
| C9 | Auditoría costo Maps + decisión nativo (sem 12) | E | ████ | Go/no-go | |||||||||||||||
| — | QA + Laboratorio + notificaciones archivadas | E | Hecho v0.0.125 |
Responsable: E=Equipo, O=Operaciones/piloto, L=Legal. Vista mensual complementaria al Gantt de 16 semanas.
| ID | Tarea | Resp. | Inicio | Fin | Jun | Jul | Ago | Sep | Oct | Nov | Dic | Ene | Feb | Mar | Estado |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| C1 | Demo comercial + pitch piloto 25/50 | O/E | 09-jun | 13-jun | █ | Esta semana | |||||||||
| C4 | Onboarding piloto 25+50 | O/E | 16-jun | 11-jul | ██ | ██ | Planificado | ||||||||
| 0.1 | Entrevistas transportistas + PYME | O | 01-jun | 28-jun | ████ | En curso | |||||||||
| 0.2 | Validación precio / comisión 12–15% | O | 15-jun | 15-jul | ██ | ██ | En curso | ||||||||
| 0.3 | Términos legales + seguro piloto | L | 01-jun | 30-jun | ████ | Borrador v011 | |||||||||
| 1.1 | Mis cargas / mis ofertas (owner_user_id) | E | — | — | Hecho | ||||||||||
| 1.2 | Refino UX flujo tipo Uber | E | — | — | Hecho v0.0.125 | ||||||||||
| 1.3 | Piloto 20 viajes en la app (M2) | O/E | 07-jul | 31-ago | ████████ | ██ | P0 | ||||||||
| 1.4 | Informe piloto (métricas + pitch) | E | 15-ago | 15-sep | ██ | █ | Plan | ||||||||
| 2.x | MVP digital núcleo (API, UI, chat, multas, Cubik app) | E | — | — | Hecho | ||||||||||
| 2.11 | Cubik Saldo piloto 10/5 + QA + notificaciones | E | — | — | Hecho v0.0.125 | ||||||||||
| 2.10b | Wallet prod + pasarela + escrow en ruta | E | 16-jun | 31-ago | ██ | ████ | ██ | P0 | |||||||
| 2.12 | Twilio Proxy llamadas | E | 16-jun | 05-jul | ██ | UI lista | |||||||||
| 2.13 | GPS background (nativo lite spike) | E | 30-jun | 31-ago | ██ | ████ | ██ | Si piloto exige | |||||||
| 3.1 | KYC + checklist vehículo | O/E | 01-oct | 15-nov | ██ | █ | Plan | ||||||||
| 3.2 | Ratings bidireccionales | E | — | — | Hecho | ||||||||||
| 3.3 | Microseguro InsurTech POC | L/O | 01-nov | 31-dic | ████ | Plan | |||||||||
| 3.4 | 100 viajes digitales (M4) | O | 01-nov | 31-ene | ██ | ████ | Plan | ||||||||
| 4.1 | Match semi-auto corredor | E | 01-feb | 28-feb | ██ | Plan | |||||||||
| 4.2 | Dashboard embarcador SaaS | E | 01-feb | 31-mar | ████ | Plan | |||||||||
| C8 | Prep escala 50+/200 camiones + auditoría Maps | E/O | 15-sep | 29-sep | ████ | Sem 10–16 |
| Área | Entregado | Notas |
|---|---|---|
| Auth / login | Errores visibles, anti doble envío, sesión tras «Salir» | Prod validado por usuario |
| UX emparejamientos | Botón aceptar match destacado; confirmación antes de en ruta / finalizar / aceptar precio | Anti doble clic |
| Calificaciones M1 | match_ratings, mutuo shipper↔carrier, modal estrellas, bloque en Completados | SQL 012; POST …/rate |
| Calificaciones M2 | Chips por banda (★1–3 negativos, ★4–5 positivos), comentario obligatorio ★1–2 | SQL 013; rating-tags-catalog.json |
| Operación Supabase | Tras migraciones: NOTIFY pgrst, 'reload schema'; | Evita PGRST204 en caché PostgREST |
| Fix servidor | listMatchRatings sin SELECT *; insert/update columnas mínimas | Logs Railway sin ruido PGRST204 |
| Fix cliente | sessionStorage por rol (matchId:carrier); limpieza al login/logout | Transportista puede calificar tras embarcador |
| Fix alcance | Ofertas sin carrier_user_id: match visible si empresa coincide | Backfill al ofertar precio |
| UX Mis viajes | Completados: listado vertical (más reciente arriba); sin botón «Abrir» → Emparejar | «Gestionar viaje» solo en curso/negociación |
| Área | Entregado | Notas |
|---|---|---|
| Multas y bloqueo | 7 días (PENALTY_DUE_DAYS), gate operar, banner bloqueo | SQL 022–024; penalty-gate.js |
| Pago declarado | Deudor: declarar + comprobante JPG/PNG/WebP | SQL 025; claim-paid, payment-proof |
| Confirmación acreedor | Embarcador/transportista acreedor: ver comprobante, confirmar o rechazar (24 h) | Sección «Pagos por confirmar»; modal revisión; no sube comprobante |
| Moderador | Casos soporte, chat moderador, cierre admin | support_cases; botones solo rol admin |
| Cuenta bancaria | Obligatoria en prod para publicar/ofertar/emparejar | bank-gate.js, BANK_ENFORCE |
| UX cuenta | Panel multas siempre visible; viajes cancelados sin «Gestionar viaje» | penalties-ui.js, trips-ui.js |
| Pendiente prod. | Pasarela + validar tarjeta tipo Uber | Doc: PENALTY-AND-SUPPORT.md § Producción futura |
| Pendiente prod. | Login Gmail (Google) + Apple + correo transaccional | Doc: AUTH-AND-EMAIL-ROADMAP.md |
Deploy: Railway uber-truck-production.up.railway.app · rama main · versión app 0.0.57.
SQL pendiente usuario: ejecutar en Supabase RUN_022_023, RUN_024, RUN_025 (ver SQL-SUPABASE.md).
Archivos clave: src/lib/penalty-ledger.js, src/lib/penalty-payment.js, src/lib/bank-gate.js, src/routes/account.js, public/penalties-ui.js.
| Área | Entregado | Notas |
|---|---|---|
| Marca Cubik | Shell móvil, splash, logo isotipo, bienvenida «Optimiza tus envíos» | app-shell.js, generate-android-icons.cjs |
| Arranque app | Bundle local en APK; splash 500 ms; sin fetch tablero sin sesión; CORS https://localhost | v0.0.76–0.0.77 |
| Login móvil | Alertas email vs contraseña; gate bienvenida sin legacy debajo | auth-ui.js, src/lib/auth.js |
| Capacitor Android | cl.cubik.logistics; npm run cap:sync:bundle (default); APK npm run android:apk → Descargas | UI en assets; API en Railway |
| Testers sin tienda | Página /probar — Android (APK o PWA) + iPhone (PWA Safari) | public/probar.html |
| Play Store (nombre) | Decisión: Cubik Envíos Chile (solo Chile al publicar) | USD 25 cuando suban prueba cerrada |
| Validado usuario | Login admin OK; 2 emuladores (embarcador + transportista API 37); tiempos ~2 s | Jun 2026 |
Links operativos:
npm run android:apk → %USERPROFILE%\Downloads\cubik-android.apkComandos: npm run cap:sync:bundle · npm run android:apk · npm run cap:open:android
| Área | Entregado | Notas |
|---|---|---|
| Oferta transportista | Paridad con publicar carga: pallets, m³, tipo camión, camión habitual en perfil | SQL 029; load-capacity-ui.js; commits v0.0.90 |
| Maps móvil embarcador | Publicar carga sin layout corrido; sugerencias Maps alineadas al input | maps-ui.js, app-shell.css v0.0.91–0.0.92 |
| FCM Railway | FCM_SERVICE_ACCOUNT_B64, health fcm.configured: true, device_tokens | Validado en teléfono 10 jun 2026 — ver bitácora 10 jun |
| Cuenta bancaria | Validador RUT + selector bancos Chile (lista API) | v0.0.93; rut-chile-ui.js, chile-banks.js |
| Cubicación carga | Sync pallets ↔ m³ (~1,2 m³/pallet); preset → Personalizado al exceder | load-capacity-ui.js v0.0.93 |
| Billetera (tipo Uber) | Varias cuentas bancarias: agregar, editar, eliminar, predeterminada; tarjetas listadas | SQL 030 user_bank_accounts; API CRUD; v0.0.94 |
| Validado usuario | Publicar carga OK prod; billetera sincronizada web ↔ APK; 2 cuentas bancarias en prod | Jun 2026 |
| Pendiente | Confirmar recepción push en dispositivo físico (push-test) | device_tokens registrado; ver § FCM |
SQL usuario: ejecutar RUN_030_user_bank_accounts.sql en Supabase (migra cuenta legacy + multi-cuenta).
Deploy: commits 38dee51 (v0.0.93), f816bbe (v0.0.94) · Railway main.
| Área | Entregado / validado | Notas |
|---|---|---|
| Push FCM Android | Recepción en dispositivo físico con app en segundo plano | 3 notificaciones push de acciones de viaje (tarde 10 jun); ítem 5 Post-MVP cerrado |
| Checklist Post-MVP | API push_fcm → validated; panel /post-mvp-checklist | Doc: CUBIK-PUSH-FCM.md |
| Área | Entregado / decidido | Notas |
|---|---|---|
| Chat en ruta | Texto libre solo en in_progress; presets coordinación + carrusel horizontal | comms-ui.js, match-comms.js v0.0.97 |
| Incidentes | Drawer estilo Uber Eats (sin prompt nativo); notificaciones backend | incident-ui.js, match-incidents.js v0.0.98 |
| Navegación | Selector Google Maps / Waze al pulsar «Navegar» | live-map-ui.js, google-maps.js |
| Perfil y shell | Pestaña Cuenta + botonera Inicio / Opciones / Actividad / Cuenta | app-shell.js, app-shell.css |
| Contraparte visible | Avatar, nombre y empresa junto al estado del viaje | trips-ui.js, enrich en API matches |
| Anti-bypass | Bloqueo teléfonos en chat; botón Llamar vía GET …/contact | phone-guard.js, contact-ui.js |
| Twilio Proxy | Documentado en .env.example; número proxy pendiente contrato | Semana siguiente |
| Modelo monetización | 10% fee embarcador + 5% comisión transportista sobre agreed_price_clp; take rate efectivo 15% | Cada rol ve solo su % en UI y API |
| Cubik Saldo | Wallet tipo Uber Cash; sin efectivo en términos de uso | Implementación próxima semana |
| Retención escrow | Al Marcar en ruta (no al aceptar): retiene flete + 10% embarcador | Evita devoluciones por cancelación pre-salida |
| Publicar carga | Saldo mínimo 20% del budget_max_clp (garantía de seriedad) | No es cobro del flete hasta en ruta |
| Tier formalidad | < $1.000.000: saldo Cubik; ≥ $1M: factura + transferencia/saldo (sin cash) | Umbral alineado tier sin efectivo |
| Checkout UX | «Terminar y confirmar» estilo Uber Eats — resumen tarifas explícito por rol; flujo corto solo si flete < $1M | Pantalla ayuda «Cómo funciona el dinero» |
| Cubik Plus Empresa | Suscripción mensual futura → descuento % fee embarcador (tipo Uber One) | Roadmap post-M2; placeholder en Cuenta |
Deploy: Railway main · versión app 0.0.98 · APK cubik-android.apk.
| Área | Entregado | Notas |
|---|---|---|
| Cierre viaje | Drawer confirmar entrega; push trip_completed | v0.0.99 |
| Cubik Saldo piloto | Comisiones 10% embarcador + 5% transportista; sección en Cuenta; badges en Mis viajes | payment-simulation.js, penalties-ui.js v0.0.100 |
| Performance Mis viajes | Batch API matches + precarga al login | v0.0.101 |
| Botón Pagar | Embarcador confirma pago simulado; SQL pilot_payment_status | SQL 026 · pilot-pay-ui.js · v0.0.102 |
| Notificaciones pago | pilot_payment visible en viajes completados; título «Embarcador pagó el flete»; enlace Mis viajes | v0.0.103–0.0.104 |
| UX transportista | Badges «Embarcador pagó» + «Cobro en gestión»; neto a recibir | trips-ui.js |
| Drawer pago web | Modal centrado abajo (360px) en desktop | pilot-pay-drawer en theme.css |
| Campana | Panel abre al instante; Cubik Saldo carga en segundo plano | comms-ui.js v0.0.104 |
API: POST /api/matches/:id/pilot-pay (solo embarcador, viaje completed). SQL: RUN_026_pilot_payment.sql.
Deploy: commits 96947cf (v0.0.102) → 7f09d15 (v0.0.104) · Railway main · APK cubik-android.apk.
Limitación piloto: sin movimiento real de dinero; label «Simulación piloto»; completed ≠ pagado hasta que el embarcador pulsa Pagar.
| Área | Entregado | Notas |
|---|---|---|
| Sugerencia flete | Coeficientes calibrados corredor RM–V vs piloto real e informe logístico | match-price.js · defaults: $80k + $450/km + $22/kg (antes $120k + $750 + $45) |
| Ejemplo Renca–La Serena | 463 km, 12 t → rango sugerido ~$452k–$691k (centro ~$552k vs viaje ~$570k) | POST /api/maps/budget-estimate |
| Config producción | Variables BUDGET_* en Railway / .env | Ver .env.example y DEPLOY.md |
| Comparación costos | Canvas Cursor + brecha ~1,9–2,5× vs informe PDF (no comparable 1:1) | canvases/comparacion-costos-transporte.canvas.tsx |
| Comisiones | Sin cambio: 10% embarcador + 5% transportista | payment-simulation.js |
Deploy: commit a4336d7 (v0.0.105) · Railway main · comisiones piloto sin cambio.
| Área | Entregado | Notas |
|---|---|---|
| Urgencia al publicar | Mensaje dinámico Normal / Urgente / Flexible (copy comercial, piloto honesto) | load-budget-ui.js |
| Sugerencias automáticas | «Usar en Paso 2» vs «Crear propuesta ya» + texto explicativo | app.js |
| Oferta transportista | Botón grande «Enviar propuesta» en emparejamientos activos | theme.css, input ancho |
| Área | Entregado | Notas |
|---|---|---|
| Login welcome APK | Fix sintaxis auth-ui.js + pointerup en botones Comenzar | v0.0.125 · web prod y bundle Android |
| QA automatizado | Playwright (Pixel 5), 14 unit tests, workflow GitHub QA, smoke prod Railway | e2e/, tests/, .github/workflows/qa.yml |
| Laboratorio QA | Panel gráfico /qa-lab — tortas, barras, catálogo de pruebas | npm run qa:lab · ver QA-AUTOMATIZADO.md |
| Android APK | cap:sync:bundle, verify bundle, android:install, APK en Descargas | Remoto = UI Railway; bundle = release planificada |
| Notificaciones | Archivo al cerrar/cancelar viaje; historial separado de activos | notification-visibility.js · emparejamientos cerrados fuera de activos |
| Plan comercial | Piloto 25 empresas + 50 transportistas; escala 50+/200 camiones; híbrido vs nativo | Canvas cubik-plan-native-escala.canvas.tsx · PLAN-COMERCIAL-PILOTO.md |
Deploy: commits 71de185 → 70723d1 · Railway main · presentación comercial jun 2026.
Estado jun 2026: piloto operativo (v0.0.100–0.0.104) con comisiones 10/5 y flujo pago post-completado simulado. Pendiente producción: wallet real, ledger, retención al «En ruta», recarga pasarela. GMV piloto no genera ingreso real (solo simulación en UI).
| Rol | % | Base | Visibilidad |
|---|---|---|---|
| Embarcador | 10% | agreed_price_clp | Solo ve «Servicio Cubik (10%)»; no ve el 5% del transportista |
| Transportista | 5% | agreed_price_clp | Solo ve «Comisión Cubik (5%)»; no ve el 10% del embarcador |
| Plataforma (admin) | 15% efectivo | GMV flete | Panel admin: SHIPPER_FEE_PERCENT=10, CARRIER_FEE_PERCENT=5 |
Ejemplo flete $1.200.000: embarcador retiene/paga $1.320.000; transportista recibe $1.140.000; ingreso Cubik $180.000.
agreed_price_clp = monto negociado en oferta; comisiones se aplican después, no inflan el precio mostrado al aceptar.
wallet_balance ≥ 0,20 × budget_max_clp.agreed_price_clp × 1,10 del embarcador; si saldo insuficiente → bloqueo + notificación al embarcador.agreed_price_clp × 0,95; acredita comisiones a Cubik.| Tramo | Monto acordado | Método |
|---|---|---|
| A — PYME rápido | < $1.000.000 | Cubik Saldo (+ transferencia para recargar) |
| B — Estándar B2B | ≥ $1.000.000 | Factura + saldo Cubik / transferencia registrada |
| C — Corporativo (futuro) | > $1.500.000 o valor carga alto | Factura obligatoria + escrow extendido |
Umbral $1M alinea checkout corto (tipo Uber Eats imagen 1) vs resumen tarifas obligatorio (imagen 2).
| Pantalla | Embarcador | Transportista |
|---|---|---|
| Confirmar flete (< $1M) | Mapa ruta + opciones simples + «Siguiente» | — |
| Terminar y confirmar (siempre) | Flete + Servicio 10% + total al en ruta | Flete − Comisión 5% = neto a recibir |
| Cuenta → Cubik Saldo | «Cómo funciona el dinero» (4 pasos + ejemplo) | Misma ruta, copy solo 5% |
| Cubik Plus Empresa (futuro) | Banner ahorro mensualidad vs % (tipo Uber One) | Plan carrier opcional post-M2 |
matches.pilot_payment_status (in_settlement | released), pilot_payment_at.src/lib/payment-simulation.js — comisiones 10/5, enrich en GET matches y cuenta.POST /api/matches/:id/pilot-pay — embarcador marca pago; notifica transportista (pilot_payment).pilot-pay-ui.js, trips-ui.js, penalties-ui.js, comms-ui.js.wallet_accounts, wallet_ledger, campos fee en matches.wallet-gate.js · retención: hook accepted → in_progress.SHIPPER_FEE_PERCENT=10, CARRIER_FEE_PERCENT=5, WALLET_PUBLISH_MIN_RATIO=0.20, CHECKOUT_SIMPLE_MAX_CLP=1000000.completed corredor RM ↔ Valparaíso/San Antonio.EMAIL_FROM — bloqueante correo piloto.Detalle estratégico: PROXIMOS-PASOS-ESTRATEGIA.md · Plan comercial: PLAN-COMERCIAL-PILOTO.md · QA: QA-AUTOMATIZADO.md · UX app: CUBIK-APP-UX.md
Numeración de abajo hacia arriba y hacia el exterior (referencia en incidentes y actas).
Rol: runtime del servidor (src/server.js). Engines: ≥ 20. Problemas: puerto ocupado, versión distinta a prod → alinear Railway y package.json.
Rol: HTTP, JSON, estáticos public/, documentación /docs/, rutas /api/*, /health. Archivo: src/app.js.
Rol: marketplace — ofertas, cargas, matches, auth, comms, cuenta. Auth: JWT en rutas protegidas. Rutas en src/routes/.
Rol: persistencia; migraciones en supabase/migrations/. Proyecto prod: ljinhegtywixtbzjgjfn. Service role solo en servidor.
Rol: registro/login con email y contraseña; tabla users; roles shipper / carrier. Política contraseña: 8+ caracteres, letra, mayúscula, número (password-policy.js, v0.0.128).
Correo: forgot/reset con Resend en prod; piloto multi-cuenta bloqueado hasta dominio verificado (DOMAIN-AND-EMAIL.md). Pendiente: OAuth Google/Apple — AUTH-AND-EMAIL-ROADMAP.md.
Rol: src/lib/ — match, cancelación (match-cancel-reasons.js), precio (match-price.js), confianza/carga (cargo-trust.js), multas (penalty-ledger.js, penalty-payment.js, penalty-gate.js, bank-gate.js, payment-proof.js), repositorio.
Rol: src/services/ — Supabase client, comms, integraciones futuras (mapas, pagos).
Rol: public/ — SPA web + modo app (?app=1, PWA, Capacitor). Shell móvil: app-shell.js, app-shell.css. API remota vía api-base.js cuando UI va en bundle APK. Marca Cubik: brand-config.js, public/brand/.
Android: Capacitor 7, package cl.cubik.logistics, carpeta android/. Scripts: npm run android:apk, android:install:remote, android:verify. Distribución: /probar + APK bundle o remoto.
QA visual: /qa-lab — catálogo y gráficos de pruebas (npm run qa:lab).
Rol: flujos, copy y pantallas en public/ alineados a «pedir → match → viaje activo → historial»; roles embarcador/transportista como pasajero/conductor. Piloto y validación solo dentro de esta app, no canales externos.
Rol: hosting, variables de entorno, healthcheck /health, deploy desde GitHub main.
Rol: versionado; nunca commitear .env. Workflow CI: .github/workflows/qa.yml (unit + Playwright local + smoke prod en main).
Rol: memoria viva, Gantt y próximos pasos en un solo HTML; export Word vía html-to-docx. Hub: /docs/index.html.
| Capa futura | Tecnología | Fase |
|---|---|---|
| Mapas / geocoding | Google Maps / Mapbox | 2+ |
| Pagos in-app | Webpay / Mercado Pago / Stripe Chile — validación tarjeta + cobro multas | 2.10b (pendiente) |
| Auth social + email | Google OAuth, Apple Sign In, Resend | E (pendiente) |
| KYC / seguro | APIs terceros Chile | 3 |
Entidades: users, vehicles, capacity_offers, load_requests, matches, match_messages, match_notifications, penalty_charges, match_incidents, match_ratings (012–014), trip_events (roadmap).
Calificaciones (012–014): tabla match_ratings — match_id, rater_role (shipper|carrier), stars, comment, tags (TEXT[]), tag_band (low|mid|high), rater_user_id (opcional, 014). UNIQUE (match_id, rater_role). En matches: delivery_note, completed_at.
Precio: load_requests.budget_min_clp, budget_max_clp; en matches: copia del rango, carrier_offer_clp, agreed_price_clp, price_status (migración 010).
Confianza / carga (011): en load_requests: cargo_description, declared_cargo_value_clp, has_dispatch_guide, dispatch_guide_folio, requires_cargo_insurance, legal_terms_version, terms_accepted_at. Tabla match_incidents (robo, daño, faltante, atraso, otro). Ver CARGO-TRUST.md y términos HTML.
Estados matches: proposed → (oferta transportista) → accepted (precio aceptado) → in_progress → completed | cancelled.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /health | Health + versión app |
| POST | /api/auth/register | Alta empresa (shipper/carrier; admin con clave) |
| POST | /api/auth/login | JWT |
| POST/GET | /api/capacity-offers | Oferta (scope por rol) |
| POST/GET | /api/load-requests | Carga + budget_* + declaración mercadería (términos obligatorios) |
| PATCH | /api/load-requests/:id/budget | Embarcador amplía rango |
| POST | /api/maps/budget-estimate | Rango sugerido (km, peso, urgencia) |
| POST/PATCH | /api/matches | Propuesta + estados viaje |
| PATCH | /api/matches/:id/carrier-offer | Transportista oferta CLP |
| PATCH | /api/matches/:id/accept-offer | Embarcador acepta precio → accepted |
| POST | /api/matches/:id/mutual-cancel | Acuerdo mutuo |
| GET | /api/matches/cancel-options | Motivos y multas |
| GET/POST | /api/comms/… | Chat y notificaciones |
| GET | /api/account/summary | Multas, billetera (bank_accounts[]), tarjetas |
| GET/POST/PATCH/DELETE | /api/account/bank-accounts… | Billetera multi-cuenta (v0.0.94) |
| GET | /api/account/chile-banks | Lista bancos Chile (selector) |
| PATCH | /api/account/bank | Upsert cuenta predeterminada (compat legacy) |
| GET/POST | /api/devices/push-status · push-test · push-token | FCM Android (v0.0.81+) |
| POST | /api/account/penalties/:matchId/claim-paid | Deudor declara pago + comprobante (base64) |
| GET | /api/account/penalties/:matchId/payment-proof | Imagen comprobante (JWT participante) |
| POST | /api/account/penalties/:matchId/confirm-payment | Acreedor confirma recepción |
| POST | /api/account/penalties/:matchId/dispute-payment | Acreedor rechaza (nota obligatoria) |
| POST | /api/account/penalties/:matchId/mark-paid | Admin / moderador cierra multa |
| POST/GET | /api/matches/:id/incidents | Reportar / listar incidentes (JWT, participantes) |
| GET | /api/matches/rating-tags/catalog | Catálogo chips por rol (JSON) |
| POST | /api/matches/:id/rate | Calificar viaje completado (stars, comment, tags); 409 si ya calificó |
| GET | /api/matches | Lista matches + can_rate, my_rating, reputación contraparte |
POST /api/maps/budget-estimate — referencia por distancia, peso y urgencia (defaults calibrados jun 2026: base $80.000, $450/km, $22/kg; configurable vía BUDGET_* en Railway); no bloquea ofertas.agreed_price_clp (15% efectivo); cada rol ve solo su línea en checkout.cargo-trust-v1; folio guía opcional (sin validación SII automática en MVP).match_incidents; resolución entre partes y aseguradoras; la app no reembolsa valor declarado por defecto.completed; una nota por rol por viaje; reputación pública = promedio histórico de estrellas recibidas; chips según catálogo por rol y banda de estrellas.reason_code; deudor según motivo (embarcador o transportista); 7 días para pagar antes de bloqueo; deudor declara transferencia + comprobante → acreedor 24 h para confirmar o disputar; sin confirmación → escalado moderador (sin auto-desbloqueo).BANK_ENFORCE); no sustituye pasarela futura..env; RLS Supabase por usuario cuando aplique.requires_cargo_insurance + revisión manual de incidentes open.uber-truck/
src/server.js, app.js, routes/, services/, lib/
supabase/migrations/
public/ ← UI + brand/logo.png
docs/ ← memoria HTML (este archivo)
canvases/ ← estado de avance (Cursor)