Admin Redesign v5 · User Journeys

Cómo se mueve el admin — 7 journeys re-pensados para que todo cuadre

El corazón no son las páginas, son los flows. Cada journey es un flujo atómico: qué VES, qué DECIDES, dónde CONFIGURAS, dónde se rompe hoy y cómo cuadra ahora. Los ⬥ branch son decisiones, 🔄 async corre en background y 🔔 avisa sin bloquearte.

6 primitivas compartidas

Piezas que se repiten entre journeys — cajas reutilizables, no inventadas cada vez. Diseñarlas una vez las resuelve en todos lados.

P1

La cifra canónica

El par Generado / Validado del engine, siempre etiquetado, idéntico entre superficies.

en A · B · D · E
P2

Cinta del ciclo

Planear→Tráfico→Validar→Cerrar→Pagar con la estación activa resaltada, por cliente×mes.

en A · B
P3

Drawer con recalc vivo

La bolsa + ecuación paga − pagamos = queda + quién se pausa, ANTES de aplicar.

en A · D · F
P4

Cadena de precedencia

default→deal→override→EFECTIVA, ganadora resaltada, perdedoras atenuadas con su origen.

en D · E · F
P5

Checklist de vida

Checks honestos 🟢/🟡/🔴 con re-chequeo automático; nunca un ✓ falso.

en C · F
P6

Month switcher de sesión

Un solo selector de mes que gobierna toda superficie de dinero.

en A · B · D · E
A

"¿Cómo va todo?" — el vistazo diario

Disparador: abre el portal en la mañana (o tras 🔔) · Ops · diario · 2-10 min
Modelo mental"Un semáforo por cliente: si todo está verde son tres líneas y me voy; si algo duele, un clic me lleva al número exacto que duele."
1
Aterrizar en Inicio
Inicio · GLOBAL
VesUna fila por cliente (tabla): Samsung 🟢 Jul $1.42M · 3 partners · 0 alertas / Quote 🟡 412 leads · 1 partner sin tarifa
DecidesTodo 🟢 → cierras (fin). Hay 🟡/🔴 → clic en la fila.
⬥ branch · verde = fin
2
Entrar al Hoy del cliente
Hoy · CLIENT (clic o ⌘O)
VesKPIs en vocabulario del objetivo (512 órdenes · $118,430 generada / $96,120 validada) · la cinta del ciclo (Estamos en: TRÁFICO) · "Lo único raro hoy" (máx 3 líneas)
DecidesClic en la anomalía.
3
Drill a la anomalía
tabla filtrada (Órdenes / Partners / Campañas)
VesLas filas exactas + la cifra canónica: Mobavenue MX · cap $48,223 · 94% · pausa auto en 2 días
Decides¿Accionar, o dejar que la cascada actúe sola? (overbooking es estrategia)
⬥ branch · no accionar → volver
4
Actuar en el drawer
drawer de dinero sobre la tabla — no navegas
VesLa bolsa (asignado $195K / pool $164K — overbooking +19%) + ecuación (paga 5% $221K − $118K = queda $103K) · recalc en vivo
HacesAplicar.
🔄 paridad Go↔SQL🔔 "Cap actualizado · paridad OK" ~30s
5
Salir
Inicio
VesInicio vuelve a 🟢. Journey completo sin abrir más de 3 superficies.
Se rompe hoy

Los 3 números no reconcilian; el drill no existe — las alertas son contadores ruidosos ("3720") sin línea accionable; el ciclo mensual es invisible.

Cómo cuadra ahora

La cifra canónica Generado/Validado acompaña TODO el drill — nunca un tercer número. El drawer enseña la consecuencia antes de aplicar: no existe el edit ciego.

B

El loop mensual — planear → tráfico → validar → cerrar → pagar

Disparador: el calendario · Ops · corre todo el mes con hitos
Modelo mental"El mes es un tren con 5 estaciones y siempre veo en qué estación está cada cliente — la cinta del ciclo nunca desaparece de una superficie de dinero."
1
Planear (día ~25 del mes anterior)
Planner
VesTabla partner×segmento: precio promedio (fallback mes previo 🟡), tarifa, cap propuesto, break-even + margen proyectado por fila, la bolsa por segmento
DecidesAuto-distribute ($113,314 → 2:1 Mobupps $116,739 / Mobavenue $48,223) o manual · "copiar mes anterior"
ConfigCaps (NULL=sin tope · 0=paga-nada), tarifas con effective_from, deals tiered/sprint
⬥ ÚNICO bloqueo: margen < piso 87% → escape hatch con razón auditada
2
Abrir el mes
botón "Abrir julio"
VesDiff vs mes anterior en lenguaje humano: Mobupps MX $30K→$116,739 · BEdig pausado · WR/TAB cerrados
HacesConfirmar.
🔄 pre-crea budgets🔔 drafts de email (revisables, sin tarifas ajenas)
3
Tráfico (todo el mes)
estación TRÁFICO visible en Hoy
VesGenerado a diario · consumo de cap con proyección ("al ritmo, Mobupps MX pausa el día 22") · fraude/salud en una línea solo si hay algo
🔄 cascada auto-pausa al 100%🔔 "Mobavenue DA pausado · 14:32"⬥ bump mid-month → journey D
4
Validar (cuando el cliente sube el archivo)
Consola de Validación
VesDropzone + mapeo de columnas + preview honesto: 30,107 órdenes · 28,911 matchean · 1,196 sin match (3.9%) · delta por partner (BEdig gen $73,550 / val $71,180 · Δ −3.2%)
DecidesAplicar.
⬥ el archivo NO llega antes del cierre → "cerrar sobre generado" (generated_advance 🟡, recordatorio hasta reconciliar)
5
Cerrar
Pagos → "Generar cierres de julio"
VesPreview por partner con la misma cifra viva del engine que muestran Hoy y el Deal: Mobupps $50,000 (cap) · Mobavenue $10,197.73 · BEdig $73,550 🟡. Cada fila declara su basis.
HacesGenerar (pending = engine vivo, no snapshot rancio).
⬥ ajuste manual → adjusted_commission con razón, gana siempre, marcado
6
Aprobar y pagar
Pagos (pipeline)
VesEl ciclo de vida como columnas de UNA tabla: pending → approved → factura → processing → paid, con antigüedad por etapa
HacesAprobar → re-freeze desde el engine ahí mismo: lo que viste = lo que se congela → 🔔 partner "sube tu factura" → marcar pagado con evidencia
7
Cerrar la estación
cinta del ciclo
VesLa cinta marca PAGADO · julio; agosto ya aparece en PLANEAR. Pendientes cross-month no se esconden: "junio: 3 cierres sobre generado esperan archivo · 12 días 🟡" (21 días → 🔴)
Se rompe hoy

El loop vive repartido en Planner / Reconciliation / Payments sin noción de posición; los cierres pending mostraban números congelados viejos; cerrar sin archivo era un hack sin rastro.

Cómo cuadra ahora

Posición en el ciclo siempre visible + atada al month switcher. generado/validado etiquetado en cada estación + "lo que apruebas = lo que se congela". Los cierres sobre generado quedan marcados y perseguidos hasta reconciliar — el sistema no olvida.

C

Dar de alta un cliente nuevo — que nazca VIVO

Disparador: cliente firmado (cualquier objetivo×fuente) · Admin · define todo lo demás · 20-40 min
Modelo mental"El wizard no termina cuando guardas filas — termina cuando llega el primer evento real; 'creado' sin datos es un cliente muerto."
1
Elegir objetivo × fuente
Wizard · paso 1
VesLa matriz objetivo (ventas/leads/clicks/impresiones) × fuente (AppsFlyer/Pixel/GA4/postback), cada celda explica qué implica ("leads × pixel → hablas de Leads y CPL; comisión $/lead"). Fija el vocabulario de TODO lo que sigue.
2
Segmentos (o eventos clave)
paso 2
VesSolo existe si objetivo = ventas ("Copiar defaults Samsung"). Leads/clicks lo saltan → definen eventos clave (lead_submit, stages)
⬥ branch por objetivo
3
Conectar la fuente Y PROBARLA in-wizard
paso Fuente
VesToken AF / snippet de pixel / URL de postback + botón "Enviar evento de prueba". Resultado: ✓ evento hace 8s · event=lead_submit · partner_param=sub2 o 🔴 con diagnóstico concreto
🔄 test no bloqueante — sigues configurando⬥ falla → link al fix · NUNCA te retiene aquí
4
Partners + deal mínimo
paso 3
VesCrear/vincular partners; valores de atribución con colisiones en vivo ("sub1 chocaría con Mobupps"); tarifa y cap iniciales
Configattribution_field (se salta si pixel → manda el click-wrapper)
5
Crear todo
paso Review
VesResumen humano: 3 segmentos · 2 partners · 24 budgets · 7 reglas de fraude clonadas
Haces"Crear".
🔄 transacción atómica⬥ si falla → aterrizas EN el paso culpable con el campo señalado
6
Checklist de vida — la pantalla final nueva
"Nacimiento de Quote.miami" (reemplaza el "created ✓" falso)
Ves5 checks con estado REAL: fuente 🟢 · primer evento 🟡 esperando · atribución 🔴 sin probar · deal 🟢 · link canónico 🟢 — cada 🔴/🟡 con SU botón de arreglo
Clave"Ir al Hoy" SIEMPRE habilitado — el Hoy hereda el checklist como banner hasta estar 🟢
🔄 los checks se re-corren solos cada minuto🔔 "Quote.miami está VIVO — primer lead atribuido · 11:42"
Se rompe hoy

El wizard termina en un "created ✓" falso; nada fluye, nadie sabe si está vivo; el problema se descubre días después cuando no hay datos.

Cómo cuadra ahora

"creado" ≠ "vivo" — el estado de vida es explícito, honesto (🟢/🟡/🔴 por check, nunca un ✓ inventado) y solo el primer evento real con timestamp lo cierra.

D

Ajustar el dinero de un partner — el Deal

Disparador: negociación, bump de cap, cambio de tarifa, sprint · Ops + Joe · semanal
Modelo mental"Hay UNA pantalla que muestra qué tarifa gana y por qué, y cualquier cambio enseña su consecuencia — margen, bolsa, quién se pausa — ANTES de aplicar."
1
Abrir el Deal
Perfil de partner · CLIENT → tab Deal
VesPor segmento, la cadena de precedencia como pipeline: default 3% → deal 2% → override atb-tabs $250/u → EFECTIVA $250/u — ganadora resaltada, perdedoras atenuadas con link a su origen. Tier: WR 0→3% · 75→3.5% · 150→4% · actual 938 uds → 4% (retro)
2
Elegir qué tocar
DecidesTarifa · cap · pausa/despausa · override nuevo (por CID o campaña)
⬥ los cuatro abren el MISMO drawer, distinto foco
3
Drawer con recalc vivo
drawer sobre el Deal
VesRecalculado a cada tecla: la bolsa ($164K→$195K / pool $164K · +19%) · ecuación (paga 5% ($8,634×512=$221K) − $30/u ($15,360) = queda $205K (93%)) · MTD nuevo 🟡 "aplica desde día 15" · quién se pausa/despausa
DecidesFecha efectiva.
⬥ mid-month → propone budget_start_from=mañana 00:00 + locked_commission: "los $19,250 ya ganados quedan intactos"⬥ margen < 87% → bloqueo + escape auditado
4
Aplicar
🔄 paridad Go↔SQL🔔 "sin drift" o 🔴 "drift — flag"⬥ ¿notificar? → draft inglés, jamás expone tarifas de otros ni lo que paga el cliente
5
Verificar el cuadre
el drawer confirma antes de cerrar
Ves"esta tarifa efectiva es la que muestran: Hoy · la campaña · el cierre pendiente" — los tres números idénticos, del mismo engine
Se rompe hoy

El mismo valor es editable en N lugares sin precedencia visible — editas una tarifa y no sabes si gana; los cambios mid-month se comían lo ya ganado o pagaban doble.

Cómo cuadra ahora

La precedencia siempre pintada con la ganadora resaltada — nunca más "¿cuál manda?". Consecuencia antes de aplicar + protección explícita de lo ya ganado en cambios mid-month.

E

Responder a un partner en < 2 minutos

Disparador: WhatsApp/email/ticket del partner · Ops · varias veces al día
Modelo mental"Un perfil, una cifra: cualquier pregunta de un partner se contesta desde su perfil con el MISMO número que él ve en su portal."
1
Buscar al partner
⌘K → "mobavenue" → Perfil de partner
VesHeader con la cifra canónica del mes activo: Julio MTD $9,214 gen / $8,730 val · cap $48,223 (19%)byte-idéntica a la de su portal
2
Branch por tipo de pregunta
2a $$"¿Cuánto gané?" → tab Earnings · desglose por segmento + tarifa efectiva + procedencia · toggle "Ver como el partner" (esconde revenue, solo comisión) → copiar y responder
2b 🧾"Falta mi pago" → tab Pagos · pipeline de SU cierre con antigüedad (junio: approved — esperando SU factura hace 6 días) → recordatorio 🔔 o subir su factura
2c 🔌"Mi PID espera" → tab Fuentes · cola con antigüedad → aprobar/rechazar inline 🔔
2d 🔗"¿Cuál es mi link?" → journey G, desde el mismo perfil
3
Cerrar el loop
activity log del partner
⬥ si implica tocar dinero ("súbeme el cap") → journey D, mismo drawer, sin cambiar de contexto
Se rompe hoy

Los earnings difieren entre dashboard/deal/pagos, así que no sabes con qué número contestar; PID, factura y link viven en 3 páginas sin relación.

Cómo cuadra ahora

"Ver como el partner" garantiza que respondes exactamente lo que él ve; una sola cifra del engine encabeza el perfil y todos los tabs cuelgan de ella.

F

Lanzar / ajustar una campaña

Disparador: campaña nueva o sprint (ej. tablets ATB con cap propio) · Ops · cada pocas semanas
Modelo mental"Una campaña es objetivo×fuente + quién corre + a cuánto + hasta cuánto — un solo flujo que termina con el link canónico en la mano de cada partner."
1
Definir la campaña
Wizard campaña · paso 1
VesHereda objetivo×fuente del cliente; nombre, slug, fechas, presupuesto, segmento(s). Vocabulario ya en modo objetivo (leads → "CPL"; ventas → "$/u · %rev")
⬥ override: cliente hybrid → campaña pixel
2
Partners y dinero
paso 2
VesTabla de partners con tarifa campaign-scoped (chip "gana sobre el deal para este CID"), cap por partner, sugerencia de split ("$25K → 2:1 según histórico"), la bolsa de la campaña vs presupuesto
⬥ margen < piso → bloqueo/escape auditado
3
CIDs + previews
paso 3
VesCIDs auto (…always-onT_sub2…) con colisión en vivo; preview email/WhatsApp por partner con su link canónico ya resuelto (journey G embebido)
4
Lanzar
una sola acción
HacesConfigura patrones + asociaciones + tarifas + caps de un jalón
🔄 creación🔔 emails (o copiar WhatsApp)⬥ lanzar sin notificar todavía
5
Checklist de vida de campaña
mismo patrón que C6
Vesprimer click con CID 🟡 · primer evento atribuido 🟡la campaña también nace, y hay que verla nacer
🔔 "atb-tabs: primer click de Mobavenue · 09:14"
6
Ajustar en vuelo
detalle de campaña
HacesTocar tarifa/cap abre el MISMO drawer del journey D — y la regla campaign-scoped aparece pintada en la cadena de precedencia del Deal del partner
Se rompe hoy

Lanzar toca 5 páginas sueltas (campaña, tarifas, budgets, emails, links); los overrides de campaña son invisibles desde el deal — nadie sabe qué tarifa ganó.

Cómo cuadra ahora

Los overrides de campaña viven en la MISMA cadena de precedencia del Deal (un solo modelo mental de tarifas). El link que se envía es el canónico de G — no hay improvisación.

G

"¿Cuál es mi link?" — micro-journey transversal

Disparador: un partner pregunta, o C6 / F3 lo necesitan · varias veces por semana
Modelo mental"Cada partner×campaña tiene UN link canónico — el sistema elige el tipo correcto según objetivo×fuente; los otros 6 son 'Avanzado'."
1
Abrir "Link"
perfil del partner o detalle de campaña → panel Link
VesEL link canónico, grande, con copiar — elegido por regla, no por el humano: pixel → t.relo.mx/c/AB12 (tamper-proof + cookie); MMP ventas → OneLink; postback → URL con macros. Colapsado: "Avanzado" (deep links, S2S, param crudo)
2
Probar
botón "Probar link"
VesDispara un click de prueba y espera el eco: ✓ click registrado · cookie sembrada · atribuiría a Mobavenue
🔄 eco real⬥ 🔴 no matchea → link al fix en Atribución con el valor fallido pre-cargado
3
Entregar
copiar / incluir en el email
VesEl mismo link idéntico aparece en el portal del partner ("Links & creatives") — nunca hay dos verdades
Se rompe hoy

7 conceptos de link en 7 páginas; ops improvisa cuál mandar y a veces manda uno que no atribuye.

Cómo cuadra ahora

Un link canónico por partner×campaña, testeable con eco real, idéntico en admin y portal del partner.

Los 3 momentos donde la magia tiene que pasar

Las 3 interacciones de mayor palanca. Si estas salen exactas, ganan el rediseño completo.

1

El recalc vivo del drawer de dinero D3 · reusado en A4 · F6

Es el átomo que comparten 4 journeys. Si tocar un número muestra bolsa + ecuación + quién-se-pausa en <300ms y con honestidad (los 🟡 marcados, "calculado con ticket de junio"), el admin le confía la plata a la plataforma — y todos los flujos heredan esa confianza. Si falla, la gente vuelve a SQL y el rediseño murió.

2

El par Generado/Validado etiquetado idéntico en TODAS las superficies B · A · E

El dolor de reconciliación ya no es de datos (el engine ya es único) — es de etiquetado. Una sola convención visual (validado sólido, generado en ghost, Δ en una línea) repetida sin excepción en Hoy / Deal / Cierre / Perfil mata para siempre el "aquí dice X, allá dice Y".

3

El primer 🟢 real del checklist de vida C6 · F5

Convierte "configuré filas" en "esto está VIVO": el primer evento con timestamp real es el payoff emocional del alta, y ENSEÑA el principio en carne propia — la plataforma prefiere decir 🟡 esperando antes que inventar un ✓. Si ese momento se siente bien una vez, el equipo entiende cómo leer todos los semáforos del sistema.

re-pensado con Fable · 2026-07-04· spec: 2026-07-03-admin-redesign-v5-design.md· ← Plan de fases (40 pantallas)