Caso destacado · 18 min de lectura

Cada pedido. Cada segundo.
Una pantalla.

Cómo armamos el Real-Time Order Chain Manager de Dodo Pizza — la cadena de pizzerías que opera 100+ locales en 4 países de LATAM sobre nuestra stack, con visibilidad punta-a-punta y latencia menor a 100 ms.

100+
locales en producción
// PE · MX · BR · CO
−27%
tiempo medio de cocina
// vs baseline 12 meses
+19 pts
NPS de delivery
// medido por Dodo HQ
99.97%
uptime del pipeline
// 12 meses rolling
10k /min
eventos procesados pico
// sábado · 20:00 LIM
// flujo en producción · sábado 21:14:07 LIM LIVE · 8 432 ev/min
RX VAL QUE PRE OVN RDY DSP TRN DLV
// 01 · TL;DR

El caso, en cuatro frases.

Para los que llegaron desde LinkedIn y solo tienen 30 segundos. Si quieres profundidad, sigue scrolleando — el caso completo son ~18 minutos.

01

Dodo escaló a 100+ locales en 4 países y sus dashboards no escalaron con ellos.

El pipeline original era batch overnight: el COO veía a las 9 AM lo que pasó ayer. En una cadena que decide en minutos, eso es ciego.

02

Construimos un Real-Time Order Chain Manager con Kafka + Spark Streaming + Delta Lake.

Cada pedido emite ~9 eventos en su lifecycle. Procesamos 10 000 eventos/min con < 100 ms de latencia end-to-end.

03

Tablets en cocina, alertas en Slack, mapa LATAM en oficina — un solo data layer.

Mismo evento alimenta 4 superficies distintas. El gerente de Lima ve lo mismo que el COO en CDMX, en el mismo momento.

04

Resultado: −27% tiempo de cocina, +19 pts NPS, 99.97% uptime, payback en 6 meses.

Y un equipo que ya no abre Excel el lunes a la mañana para entender lo que pasó el sábado.

// 02 · El problema

Una cadena que crece más rápido que sus dashboards.

Cuando llegamos, Dodo ya tenía 64 locales y crecía 2 por mes. La operación funcionaba. Los datos, no.

// arquitectura previa · Q1 2023

Cuatro sistemas. Cero conversación.

SISTEMAS DESCONECTADOS
  1. 01

    Visibilidad rota

    POS reportaba al día siguiente. El gerente se enteraba el lunes que el sábado faltó queso.

    24h delay
  2. 02

    Cocina sorprendida

    Front-end cerraba ventas antes de que la cocina viera la cola. 40 pedidos en 6 min y nadie con masa lista.

    40 / 6 min
  3. 03

    Reportes desactualizados

    Directorio decidía sobre números de hace 10 días. Decisiones de millones, fotografías borrosas.

    10 días stale
  4. 04

    4 países, 4 hojas de cálculo

    Reconciliar entre PE / MX / BR / CO tomaba 3 días. Cierre mensual: 9 días.

    9 días cierre
  5. 05

    Marketing → ops sin avisar

    2×1 anunciado un viernes 14:00. Cocina del local fuerte colapsa a las 19:00. Ops se entera por reclamos.

    sin coordinación
  6. 06

    Una persona sostenía todo

    64 locales reconciliados a mano por 1 FTE. Si renunciaba una semana → caos.

    1 FTE · 64 locales
// el costo del caos · estimación interna
9 días
Tiempo de cierre mensual contable. Cuatro países en cuatro Excels.
// pedidos perdidos · sábados peak
~84 /sáb
Clientes que se iban sin pedir por colapso de cocina. Por local de mayor flujo.
// dependencia personal
1 FTE
Una sola persona reconciliando 64 locales. Si renunciaba — la operación se ciega.
// 03 · La solución

Un Order Chain Manager que ven todos al mismo tiempo.

No reemplazamos el POS. No reemplazamos el ERP. Construimos una capa de eventos sobre lo que ya existía — y cuatro superficies distintas para consumirla.

// arquitectura nueva · Q3 2023

Un solo bus. Cuatro superficies. Tiempo real.

EVENT-DRIVEN · < 100ms
SUPERFICIE 01

Pantalla central · sala de directores

Mapa LATAM en vivo. Cada pin es un local. Color = estado del momento (verde / ámbar / rojo). Click → drill-down a pedidos individuales.

OK Atención Crítico
SUPERFICIE 02

Tablet en cocina

Aviso 8 minutos antes que entra una ola. La cocina pre-prepara — sin sorpresas el sábado.

12:34 · sáb
EN 8 MIN +12 pizzas 8× pepperoni · 4× hawaiana
SUPERFICIE 03

Slack del gerente

Stock-out, pico de espera, NPS rojo — al instante, a quien tiene que actuar.

⚠ STOCK-OUT Local 07 · Miraflores queso muzzarella en 18% · agotado en ~45 min
SUPERFICIE 04

Mobile · directorio

El COO y el CEO miran desde el celular. Datos al cierre del día anterior. Top-3 alertas en pantalla principal.

Buenos días, Lucia.
Ventas ayer $284k +8.4%
Food cost 28.1% −1.2pp
NPS 7d 62 +4
Locales OK 98/100 2 atn.
// 04 · Cronología del pedido

Los 9 eventos de un pedido. Y los milisegundos entre ellos.

Caso real, sábado a las 21:14, local Miraflores. El cliente pidió a las 21:14:23 y comió a las 21:39:48. Aquí cómo lo vimos en el sistema.

// vista resumen · pedido #A4F-21:14
25 min 25 s · de click a mordida
SLA target: ≤ 30 min · ✓ dentro de target
RX
QUE
PRE
OVN
PK
BF
RD
TRN
DLV
0–18 min · cocina 18–25 min · tránsito 25+ min · alerta SLA p95 LATAM: 26 min 12 s
21:14:23 +0:00 01 / 09
EVENTO RX · order_received

Pedido recibido

Click en la app. Front-end emite order.created al broker. Latencia hasta Kafka: 11 ms .

sigue scrolleando para avanzar el pedido
Latencia P50 evento → dashboard 62 ms Latencia P99 184 ms Eventos por pedido 9 Pico observado 10 240 ev/min
// 05 · Mapa LATAM

Cuatro países, una sola consola.

El COO en Lima ve lo mismo que el director regional en CDMX. En el mismo segundo. Con la misma definición de lo que es un «buen sábado».

CDMX · 18 locales
Bogotá · 14
Lima · 32
São Paulo · 26
Brasília · 8
Manaus · 4

// top 5 locales · NPS últimos 30 d

01 Miraflores LIM · PE +62
02 Polanco CDMX · MX +58
03 Pinheiros SAO · BR +54
04 Chapinero BOG · CO +51
05 San Isidro LIM · PE +49

// 5 locales en seguimiento · alertas activas

98 Brasília Norte BSB · BR · stock crítico +12
99 Manaus Centro MAO · BR · entregas tarde +9
100 Iztapalapa CDMX · MX · ↓ pedidos +5
101 Cali Sur CLO · CO · gerencia rotando +2
102 Recife Boa Viagem REC · BR · apertura nueva −3
// 06 · Arquitectura

Stack open-source. Cero vendor lock-in.

Si en 3 años Dodo decide cambiar de partner, se llevan el código y los datos. Sin contratos atados ni licencias por usuario.

L1

Ingesta

~5 ms
EVENT BROKER
Apache Kafka
CDC
Debezium
SDK CLIENTES
tracker.js + Python
HARDWARE
OPC-UA · hornos · scanners
L2

Procesamiento en streaming

~40 ms
STREAMING
Spark Structured Streaming
STATE
RocksDB · Delta Live Tables
REGLAS
Drools custom + DSL interna
ML INFERENCE
MLflow models · LightGBM
L3

Almacenamiento + DWH

batch / serving
LAKEHOUSE
Delta Lake en S3
SERVING
Postgres + Citus
HOT CACHE
Redis Streams
TRANSFORM
dbt Core · 84 modelos
L4

Superficies

render < 50 ms
WEB CONSOLE
Next.js + TypeScript
TABLET COCINA
React Native (Android)
SLACK BOT
Bolt for Python
EXEC MOBILE
Expo · iOS + Android
// trazado interactivo · prueba un evento

Cómo viaja un evento por las 4 capas.

click → ver el camino
order.created → POS · binlog → Spark Streaming → Delta Bronze + Redis hot → Mapa, Tablet, Slack. Latencia p95: 87 ms.
// 06.5 · Un día en producción

Un sábado, 24 horas, 287 000 eventos.

Sábado 14 de octubre, hora local Lima. Cada barra = miles de eventos procesados por hora. Los puntos rojos son incidentes resueltos sin intervención humana.

// pipeline · 24h · sat 14-oct-2024

Volumen por hora · 287 412 eventos · 0 caídas

peak · 21:00 LIM · 14 920 ev/h
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// 12:42 LIM · auto-resolved
Campaña 2×1 publicada en Insta. Sistema detectó volumen +320% en 8 min y avisó a 14 cocinas con 6 min de anticipación.
// 19:14 SAO · auto-routed
Horno 03 en Pinheiros bajó 18°C. ML predictor reasignó la cola a hornos 01 y 02. Técnico avisado en Slack.
// 21:08 LIM · auto-throttled
Local Miraflores: 47 pedidos en 4 min. Sistema pausó delivery aggregator por 90s para que cocina alcance la cola.
// 07 · Resultados

Los números a 12 meses.

Medidos por el equipo de finanzas de Dodo, no por nosotros. Comparativa: baseline 12 meses antes del go-live.

Métrica Antes Después Δ
Tiempo medio de cocina
14:00
10:12
−27%
NPS de delivery
43
62
+19 pts
Stock-outs por semana
~38
~6
−84%
Cierre mensual de finanzas
9 días
4 horas
~50× más rápido
Food cost
31.2%
28.1%
−3.1 pp
Uptime del pipeline
87%
99.97%
+12.9 pp
Alerta → acción
4–6 h
14 min
−96%
Adopción de gerentes
31%
96%
+65 pp

«El equipo entendió en una semana lo que a otros consultores les tomó tres meses. Y lo más importante: construyen software que mis gerentes de local sí abren todos los días — no dashboards bonitos para directorio que nadie usa.»

M
Mariano R. COO · Dodo Pizza LATAM
Inversión total USD 380k // implementación + 6 meses operación
Ahorro anualizado USD 760k // food cost + ops + cierre
Payback 6.2 meses // validado por CFO
ROI a 24 meses 3.9× // proyección conservadora
// 08 · Lecciones

Tres cosas que aprendimos — y que cobramos en el siguiente caso.

L1

El gerente de local es el usuario, no el COO.

Construimos primero para el directorio porque era el cliente que firmaba. Mal. La adopción real subió cuando rediseñamos la tablet de cocina al fondo. Ahora empezamos siempre por el usuario en la operación, no por el que aprueba el contrato.

L2

Latencia < 200 ms es el umbral psicológico.

Por debajo de 200 ms el usuario percibe el sistema como «en vivo». Por encima, como «reportes». Y el comportamiento cambia: deja de mirarlo. Es la diferencia entre una tablet de cocina y un dashboard de Tableau.

L3

Open-source es portabilidad, no ahorro.

El TCO de Kafka self-hosted es similar a Kinesis a 12 meses. La razón para elegirlo es que Dodo controla su destino — no que ahorra dinero el primer año. Empezamos a vender así, no como «más barato».

// 09 · Siguientes pasos

¿Tienes una cadena? Empecemos por entenderla.

No vendemos software de plantilla. Empezamos siempre con una auditoría gratis de 4 semanas: nos sentamos con tu equipo, mapeamos sistemas y dolores, y entregamos un PDF con 3–5 quick wins concretas.