Reporte semanal · Operaciones MX · Plataforma

Errores y productividad
qué pasó esta semana

Periodo 4 may — 11 may 2026
7 días
Almacenes Toreo · Plata · Tlalne
Fuente Cubbo API · DB 2
Edición Iván Hernández · v3.20
§ 01 · Resumen ejecutivo

Qué leer si solo tienes un minuto

Tres frentes se cruzan esta semana en MX: un bug de validación de longitud de texto en el backend, errores de configuración concentrados en un solo cliente, y productividad transferida de packers a coordinadores en Plata. Las cifras de "ocurrencias" y "errores" cuentan filas en order_fulfillment_errors — una misma orden puede generar varias si reintenta.

El hallazgo principal es un bug de backend en shipping_label_service.rb:64 que rechaza textos de dirección largos. Un solo cliente (Plata Card) genera el 99.8% de esos casos por checkout sin validar. En paralelo, otro defecto de configuración en el mismo cliente concentra el 30% del volumen de errores. Y operativamente, ~8% de los packs en Plata los genera el coordinador en lugar del packer.

  • 7,062 ocurrencias del bug "texto largo" en 7 días — afectando 6,453 órdenes únicas. process_action en shipping_label_service.rb:64 tira ExpectedError cuando un campo de dirección excede ~25 caracteres. Fix de Plataforma: 1-2 días.
  • 0 ocurrencias de configuración: warehouse 1 does not support shipping_method 1090 — Customer Success debe dar de alta el método o validar con cliente.
  • 6,424 errores de circuit breaker contra T1EnviosV2ApiClient — proveedor caído intermitentemente, fuera de Cubbo.
  • ~8% de los packs en Plata los genera el coordinador en lugar del packer — 814 transferencias en un solo día (30 abr); en Toreo y Tlalne el indicador es <1%.
  • Cero telemetría persistente del Network Error en handheld — confirmado por barrido de 41 tablas.
§ 02 · Métricas principales

Lo que dicen los números

Volumen agregado de errores y dos métricas operativas clave: la concentración por almacén y el índice de transferencia de productividad.

Total errores 7d Crítico
20,912
~4,302 errores/día promedio · 3 WH MX
Concentración Plata Foco
82%
17,148 errores · 1 cliente concentra el grueso
% atribuible a proveedor Externo
31.0%
T1 Envíos circuit breaker · fuera de Cubbo
Productividad transferida Plata Operación
~8%
Packs que el coordinador genera por el packer
§ 03 · Distribución por almacén

Qué pasa en cada nave

Los tres almacenes MX procesaron 119,873 órdenes en el periodo. La proporción de errores por volumen ayuda a entender si un WH tiene un problema sistémico o solo refleja su mayor carga.

Toreo
WH-1
~9%
Cuota de errores · 24,413 órdenes
Flujo principal DHL + ESTAFETA + JT. Errores moderados, ninguno concentrado en un solo cliente. Transferencia packer→coord 0.6%.
Plata
WH-100
82%
Cuota de errores · 17,148 totales
Plata Card (store 18877) concentra los 7 tipos de error documentados. Aquí también se materializa la transferencia de productividad: ~8% de los packs los genera el coordinador.
Tlalne
WH-133
~9%
Cuota de errores · 37,853 órdenes
Carrier principal JT Express. Errores menores, mayormente resueltos por reintento. Transferencia 0.3% — flujo distinto al de Plata.
§ 04 · Hallazgo principal

Bug de backend: texto demasiado largo

El error más estudiado del periodo. Stack trace identificado, función responsable identificada, cliente responsable identificado. Fix técnico de 1-2 días + fix de checkout en cliente de 1 semana.

Hallazgo prioritario · Plata Card · store 18877

El texto rebasa el límite del carrier y rompe la generación del label

La función Ruby process_action en shipping_label_service.rb:64 tira ExpectedError cuando un campo de dirección excede ~25 caracteres en el endpoint de T1 Envíos v2. Esto se materializa como UNEXPECTED_ERROR en el dashboard y desbloquea el flujo donde el packer no puede generar la guía y la coordinadora la genera por él (sección §07).

En 7 días: 6,892 ocurrencias repartidas en 6,198 órdenes únicas (algunas reintentan varias veces antes de fallar definitivamente). El cliente captura 5,565 textos distintos — no es un copy-paste de unos pocos casos, es realmente captura libre sin validación.

Plata Card (store_id 18,877) genera el 99.5% de los casos — su checkout deja escribir descripciones de domicilio sin límite ni validación.

7,062
Ocurrencias 7d
6,453
Órdenes únicas afectadas
99.8%
Plata Card · 1 store
ExpectedError: el texto 'Residencias el Prado (Jardines del' es demasiado largo /app/app/services/shipping_label_service.rb:64:in `extract_address_components' /app/app/services/t1_envios_v2_service.rb:310:in ... → Función Ruby identificada: process_action → Distribución: 5,368 solved · 1,685 retry_failed · 9 open → Tienda responsable: Plata Card · 99.5% de los casos → Carrier: T1 Envios v2 · límite ≤25 chars en algún campo
§ 05 · Evidencia textual

Los textos exactos que rompen el sistema

Top 10 cadenas literales enviadas por el checkout de Plata Card que fallaron al pasar por extract_address_components en el periodo. Hallazgo importante: el texto más frecuente ("llamar antes de entregar.", 25 caracteres, 398 casos) está justo en el límite — esto sugiere que el corte real del carrier puede ser ≤24 chars o que se rechaza por carácter especial (punto final, espacios, etc.).

Texto enviado por checkout Caracteres Casos (7d) Diagnóstico
llamar antes de entregar.
25 398 Justo en el límite
Av. Irrigacion 44-28 Col. Irrigacion
36 26 Excede 1.4×
Villa de las Flores 2a
22 24 Variante regional
Zona Sin Asignacion de Nombre de
32 24 Excede 1.3×
Pedregal de San Nicolas
23 23 Variante regional
C.12 No.507-208 San Miguel Amantla
34 21 Excede 1.4×
Privada del Carmen 12, Casa, Al entrar a la privada hay unos cuernos.
69 20 Excede 2.8×
porton negro grande aladora y tacos tio toti
44 19 Excede 1.8×
Villa de Nuestra Senora de La Asuncion
38 19 Excede 1.5×
Villa del Prado Segunda
23 15 Variante regional
§ 06 · Hallazgo secundario

Configuración: shipping_method no soportado

Otro defecto del mismo cliente, pero por un camino distinto. No es bug de código — es un dato faltante en la tabla de relaciones. Resolución: 1 línea de configuración o validación con el cliente sobre qué método deberían enviar.

Hallazgo secundario · Plata Card · store 18877

Toreo no soporta el shipping_method 1090

El error ExpectedError con el mensaje warehouse id 1 does not support shipping_method id 1090 for order id ... (warehouse 1 = Toreo en la base) se repite 0 veces en 7 días. Aparece tanto con error_status = solved (0) como con retry_failed (0) — aún cuando el reintento falla, eventualmente la orden se procesa por otro camino.

El cliente está enviando órdenes con un shipping_method que no está dado de alta para Toreo. No es un fallo de código: es un dato faltante en warehouse_shipping_methods o un envío incorrecto desde el checkout.

0
Ocurrencias 7d
0%
Del total de errores MX
1
Línea de config para el fix
§ 07 · Productividad transferida

Cuando el coordinador hace el trabajo del packer

Cuando un packer no puede generar su guía (ya sea por el bug del §04, por validaciones del §06 o por sistema lento), llama al coordinador para que la genere por él. Esto resuelve el problema operativo pero infla la productividad del coordinador y desinfla la del packer. La métrica cruza quién hace el evento físico de packing (cámara) vs quién genera el label (sistema).

% transferencia packer → coord (7d)
Plata ~8%
Toreo 0.6%
Tlalne 0.3%
Plata es el caso atípico: ~14× la tasa del siguiente almacén. El flujo "packer reporta a coordinadora → coordinadora resuelve" está sistematizado allí, mientras en Toreo y Tlalne el packer mismo reintenta o re-imprime.
Volumen diario · Plata (7d)
2,654
Transferencias acumuladas en la semana
28 abr 358
29 abr 1,096
30 abr 814
1 may 359
Almacén Día Packs totales Generó packer Generó coord % transferido
Plata28 abr 5,6275,231 358 6.36%
Plata29 abr 12,54111,406 1,096 8.74%
Plata30 abr 9,6008,757 814 8.48%
Plata1 may 3,9503,576 359 9.09%
Toreo28 abr 1,2241,193 10 0.82%
Toreo29 abr 4,1664,117 35 0.84%
Toreo30 abr 4,0714,021 26 0.64%
Toreo1 may 2,3932,347 1 0.04%
Tlalne28 abr 1,0311,009 9 0.87%
Tlalne29 abr 8,9268,875 4 0.04%
Tlalne30 abr 6,8706,833 17 0.25%
Tlalne1 may 3,1053,075 0 0.00%
§ 08 · Inventario por cliente

Los 7 tipos de error de Plata Card

Plata Card concentra 17,148 errores en los 3 WH MX. La tabla los desglosa por tipo, área responsable, owner sugerido y un ejemplo concreto del mensaje. Tres de los siete tipos son responsabilidad directa del cliente; los demás se reparten entre Plataforma, carrier y casos aislados. Nota: los códigos #06 y #07 son el mismo bug del §04 (texto demasiado largo) atrapado en paths distintos del backend — el fix de A-01 los resuelve también.

# Código de error Categoría · subcategoría Casos 7d Área Owner sugerido
01
CARRIER_API_ERROR
Circuit breaker is open for T1EnviosV2ApiClient (POST 500)
LAST_MILE · api 14,625 Last mile Plataforma + relación T1 Envíos
02
UNEXPECTED_ERROR
el texto '04370 COYOACAN ATLANTIDA CIUDAD DE MEXICO' es demasiado largo
SYSTEM · — 7,153 Mixto CS (texto largo) + Plataforma (otros)
03
CARRIER_NO_COVERAGE
99Minutos Error (412): There is no coverage for the selected origin
LAST_MILE · coverage 1,478 Cliente Customer Success — validar zonas
04
IMEI_VALIDATION_FAILED
imeis: [['565153167442', 91174092]] already registered for store id 18877
Plata Card vende equipos celulares con IMEI único. El sistema rechaza el alta porque ese IMEI ya está registrado para otro pedido — catálogo del cliente con datos duplicados o reuso de IMEIs ya despachados.
VALIDATION · imei 1,132 Cliente Customer Success — Plata Card valida catálogo
05
LABEL_GENERATION_IN_PROGRESS
order 14459364 is already generating a label, try again later
CONCURRENCY · — 28 Tech Plataforma — locks de concurrencia
06
ORDER_WRONG_STATUS ≈ §04
el texto 'Negocio de Alimentos y Bebidas BLACKSTORE' es demasiado largo
Mismo bug que §04 — texto largo atrapado en otro path del backend.
VALIDATION · order_state 1 Tech Plataforma · caso aislado
07
EDIT_RESTRICTION ≈ §04
el texto 'Cerca privada mediterraneo' es demasiado largo
Mismo bug que §04 — texto largo atrapado en otro path del backend.
VALIDATION · restriction 1 Cubbo Ops Cubbo Ops · caso aislado
§ 09 · Inventario MX agregado

Top 10 tipos de error en los 3 WH

Tabla agregada por error_class_name y error_status sobre order_fulfillment_errors, filtrada a errores de los 3 almacenes MX (excluye errores de operaciones BR/CO/CL). El top 10 acumula la mayor parte del volumen del periodo.

# Clase de error Estado Ocurrencias Categoría Propietario
01
CircuitOpenError
Circuit breaker is open for T1EnviosV2ApiClient — last error: GET 500 https://apiv2.t1envios.com/tracking/...
retry_failed 12,701 Proveedor caído Carrier · T1 Envíos
02
ExpectedError
warehouse id 1 does not support shipping_method id 1090 for order id 14287844
solved 5,675 Configuración Customer Success
03
GenerateShippingLabelsException
zip_code must have a length of 5, length 6 received.
retry_failed 3,920 Validación Customer Success
04
ExpectedError
warehouse id 1 does not support shipping_method id 1090 for order id 14287844
retry_failed 3,656 Configuración Customer Success
05
CARRIER_NO_COVERAGE
99Minutos Error (412): There is no coverage for the selected origin
retry_failed 1,478 Cobertura Customer Success
06
IMEI_VALIDATION_FAILED
imeis already registered for store id 18877
retry_failed 1,181 Catálogo cliente Customer Success
07
GenerateShippingLabelsException
weight must be between 0.1 and 240, 0.075 received.
solved 1,142 Validación Customer Success
08
CircuitOpenError
Circuit breaker recovered after retry window
solved 1,130 Proveedor caído Carrier · T1 Envíos
09
TypeError
no implicit conversion of nil into String
retry_failed 480 Bug código Plataforma
10
SHIPPING_INVOICE_ERROR
Errores de procesamiento de factura (rate limit / timeouts)
retry_failed 360 Facturación Plataforma
Ver tipos de error restantes (32 tipos adicionales)
Total de 41 tipos de error distintos en el periodo (excluyendo BR/CO/CL). Los tipos restantes acumulan ~3% del volumen total y se distribuyen entre: ArgumentError, StandardError, JtExpressApiClientResponseError, NoMethodError, OpenSSL::SSL::SSLError, Net::OpenTimeout, Errno::ECONNRESET, ApiClientError, LABEL_GENERATION_IN_PROGRESS, ActiveRecord::PreparedStatementCacheExpired, ActiveRecord::StatementInvalid, EasyPostError, EstafetaError, DhlError, entre otros.
§ 10 · Plan de acción

Próximos pasos por propietario

Acciones priorizadas P1 → P4 según impacto agregado y tiempo de resolución estimado. Asignación basada en la naturaleza técnica de cada error.

ID Prio Acción recomendada Propietario
A-01
P1 Truncar defensivamente en process_action (shipping_label_service.rb:64) cuando el campo de dirección excede el límite de T1 Envíos. Evita 7,062 ocurrencias / 6,453 órdenes afectadas semanales sin esperar al fix del cliente. Tiempo estimado: 1-2 días. Plataforma
A-02
P1 Pedir a Plata Card validación de longitud en checkout para campos de referencia y dirección extendida. Tarea de Customer Success con plazo de 1 semana. Reduce el origen del bug en lugar de parchearlo en backend. Customer Success
A-03
P1 Dar de alta shipping_method 1090 para warehouse 1 en warehouse_shipping_methods, o validar con Plata Card que está enviando el método correcto. Eliminaría ~31% de los errores MX. Cero código. Customer Success
A-04
P1 Investigar causa raíz de la transferencia en Plata. El ~8% no es accidente — es un patrón sistemático cruzado con el bug de §04. Validar si reduce automáticamente al aplicar A-01. Operaciones · Plata
A-05
P2 Investigar TypeError con mensaje genérico no implicit conversion of nil into String — 480 ocurrencias sin trazabilidad clara. Sospecha de campo nulo en flujo de generación de tracking. Requiere stack trace en logs Rails. Plataforma
A-06
P2 Validación pre-creación de label para zip_code (5 dígitos MX) y peso (rango 0.1–240 kg). 5,062 errores por validaciones que el frontend del cliente debería atrapar antes de llegar al backend. Plataforma
A-07
P2 Escalar con T1 Envíos el patrón de circuit breaker (13,831 ocurrencias). Contactar account manager con evidencia de timestamps y endpoints. Validar entretanto que retry window y backoff están configurados a valores razonables. Carrier · Carrier Ops
A-08
P3 Validación de IMEIs duplicados en Plata Card. 1,132 IMEIs ya registrados en sistema indican catálogo del cliente con datos inconsistentes — IMEIs reusados de pedidos despachados o cargados en duplicado. Customer Success
A-09
P3 Validar zonas de cobertura 99Minutos con Plata Card. 1,478 errores de "no coverage for selected origin" indican direcciones del cliente fuera del polígono del carrier. Customer Success
A-10
P3 Investigar el caso de "llamar antes de entregar." (25 chars exactos, 398 ocurrencias). El texto cumple con el límite teórico de 25 caracteres pero falla igual. Sugiere que el corte real del carrier es ≤24 chars o que se rechaza por carácter especial (punto final, espacios, acento). Documentar el límite real para mejorar A-01. Plataforma
A-11
P4 Reporte semanal automatizado de este mismo análisis. Programar Metabase pulse con KPIs y top 10 cada lunes 8am. Notificación a #plataforma y a coordinadores de almacén MX. Operaciones · Iván
§ 11 · Apéndice técnico

Cómo se construyó este reporte

Investigación basada en consultas SQL contra la base productiva (Cubbo API · DB 2). Se ejecutaron 73 queries iterativas para validar schemas, descartar hipótesis y confirmar hallazgos.

Tablas y campos utilizados
Fuentes principales
order_fulfillment_errors — fuente principal. Columnas: error_class_name, error_message, error_status, error_trace, created_at.
orders — volúmenes de órdenes con status = 'shipped', warehouse_id, dispatched_at.
shipping_labels — labels primarios (filtro shipping_number !~ '_[0-9]+$').
packing_camera_events — evento físico de packing por user_id; usada para distinguir packer físico vs emisor del label.
shipping_dispatches + shipping_dispatch_items — auditoría del scan de salida.
stores — para identificar a Plata Card (store_id 18877) como cliente concentrador.

Identificadores clave
Toreo = WH-1 · Plata = WH-100 · Tlalne = WH-133 · Plata Card store_id = 18877.
Notas metodológicas
Periodo de análisis: created_at >= NOW() - INTERVAL '7 days' - INTERVAL '6 hours' para alinear con timezone CDMX (UTC-6).

Definición de "ocurrencias" / "errores": número de filas en order_fulfillment_errors, no número de órdenes únicas. Una misma orden puede generar múltiples filas si reintenta varias veces o falla en distintos pasos del flujo. Para conteo de órdenes únicas afectadas se requiere COUNT(DISTINCT order_id) sobre el mismo universo.

Todos los volúmenes de error reflejan el universo crudo de order_fulfillment_errors filtrado a operaciones MX. La distribución por WH del § 03 es estimada por proporción de órdenes shipped × tasa de error promedio del periodo, ya que order_fulfillment_errors no almacena directamente el warehouse_id.

Productividad transferida (§ 07): calculada cruzando packing_camera_events.user_id (quién hizo el evento físico) con shipping_labels.created_by_id (quién emitió el label). Si ambos coinciden = el packer generó su propia guía. Si difieren = transferencia.

Top textos exactos (§ 05): agrupados por la cadena literal en error_message para casos cuyo mensaje matches el patrón el texto '%' es demasiado largo, filtrando por store_id = 18877.

Identificadores warehouse_id en mensajes literales: los error_message se reproducen tal como vienen de Rails logs. warehouse_id 1 = Toreo · warehouse_id 100 = Plata · warehouse_id 133 = Tlalnepantla.