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.
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.warehouse 1 does not support shipping_method 1090 — Customer Success debe dar de alta el método o validar con cliente.T1EnviosV2ApiClient — proveedor caído intermitentemente, fuera de Cubbo.Volumen agregado de errores y dos métricas operativas clave: la concentración por almacén y el índice de transferencia de productividad.
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.
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.
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.
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 |
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.
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.
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).
| Almacén | Día | Packs totales | Generó packer | Generó coord | % transferido |
|---|---|---|---|---|---|
| Plata | 28 abr | 5,627 | 5,231 | 358 | 6.36% |
| Plata | 29 abr | 12,541 | 11,406 | 1,096 | 8.74% |
| Plata | 30 abr | 9,600 | 8,757 | 814 | 8.48% |
| Plata | 1 may | 3,950 | 3,576 | 359 | 9.09% |
| Toreo | 28 abr | 1,224 | 1,193 | 10 | 0.82% |
| Toreo | 29 abr | 4,166 | 4,117 | 35 | 0.84% |
| Toreo | 30 abr | 4,071 | 4,021 | 26 | 0.64% |
| Toreo | 1 may | 2,393 | 2,347 | 1 | 0.04% |
| Tlalne | 28 abr | 1,031 | 1,009 | 9 | 0.87% |
| Tlalne | 29 abr | 8,926 | 8,875 | 4 | 0.04% |
| Tlalne | 30 abr | 6,870 | 6,833 | 17 | 0.25% |
| Tlalne | 1 may | 3,105 | 3,075 | 0 | 0.00% |
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 |
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 |
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.
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 |
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.
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.created_at >= NOW() - INTERVAL '7 days' - INTERVAL '6 hours' para alinear con timezone CDMX (UTC-6).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.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.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.error_message para casos cuyo mensaje matches el patrón el texto '%' es demasiado largo, filtrando por store_id = 18877.error_message se reproducen tal como vienen de Rails logs. warehouse_id 1 = Toreo · warehouse_id 100 = Plata · warehouse_id 133 = Tlalnepantla.