O veredito primeiro: quando etiquetas de envio somem, a transportadora quase nunca é culpada. O pedido morreu em algum ponto da sua própria cadeia de integração, entre o WMS e a API de etiquetas da transportadora. Não comece ligando para a transportadora. Depure nesta ordem: expedição do WMS → camada de API/fila → resposta da transportadora → escrita de status → estação de impressão. Onde quer que o pedido pare, é ali que mora o seu problema. Erre a ordem e você vai queimar três dias sem encontrar nada.

Por que os pedidos "evaporam"

Uma solicitação de etiqueta percorre cinco elos antes de chegar à caixa:

  1. O WMS gera uma solicitação de envio.
  2. A camada de integração (ou middleware) a envia à API da transportadora.
  3. A transportadora devolve os dados da etiqueta e um número de rastreio.
  4. O WMS escreve o número de rastreio de volta no pedido e o move para "pronto para imprimir".
  5. A estação de empacotamento imprime a etiqueta e o operador a cola na caixa.

Cada elo pode engolir um pedido: a solicitação nunca sai, apodrece numa fila não consumida, o seu lado esgota o tempo antes de ler a resposta da transportadora, a escrita falha, a impressora está offline. Erros são o caso fácil — pelo menos dá para vê-los. O assassino é a falha silenciosa: seu WMS acha que enviou a solicitação, a transportadora acha que nunca chegou, e o pedido fica no vão, reivindicado por ninguém. É por isso que o armazém grita "pedidos perdidos" enquanto a TI insiste que "os logs parecem bons".

Já vi isso três vezes: duas histórias de guerra

A primeira, em novembro passado, num armazém 3PL de vestuário no leste da China usando a API de etiquetas da UPS. De vinte a trinta etiquetas por dia sumiam, e a transportadora jurava que seu backend nunca recebeu as solicitações. Uma tarde de investigação descobriu: o timeout era de 5 segundos, e na alta temporada a API da transportadora respondia em 8 a 10. Cada timeout fazia o WMS marcar o pedido como "etiqueta falhou" — enquanto a transportadora já tinha gerado a etiqueta e o número de rastreio. Duas histórias, um pedido: o WMS mostrava falhas aguardando reimpressão manual, o faturamento da transportadora já tinha cobrado as etiquetas. Pior, o armazém via "falhou" e clicava em tentar de novo, e a nova tentativa produzia um segundo número de rastreio para o mesmo pedido. Duas etiquetas candidatas por pacote — escolha a errada e é um pacote perdido mais um cliente furioso.

A segunda, em março deste ano, num armazém de e-commerce transfronteiriço no sul da China usando a API de uma transportadora internacional. Pedidos feitos entre meia-noite e 2 AM sumiam em massa; de dia estava tudo perfeito. Causa raiz mais cruel: a API da transportadora tinha uma janela de manutenção noturna que retornava "serviço indisponível", e a camada de integração do WMS não tinha nenhuma fila de falhas. Solicitações falhadas eram simplesmente descartadas — sem nova tentativa, sem alerta, sem registro. Duas horas de pedidos não deixaram rastro no sistema, os pedidos ficaram em "aguardando etiqueta", e o armazém achou que o sistema estava atrasado e esperou até de manhã. Os logs mostraram a verdade: duas horas inteiras de solicitações sequer foram enviadas. A camada de integração as comeu.

Sintomas diferentes, mesma causa raiz: ninguém estava conciliando a cadeia de etiquetas. Dinheiro se concilia. Estoque se concilia. Etiquetas? Trabalho de ninguém.

O manual: uma cadeia de depuração de cinco elos

Este é meu checklist da noite de lançamento. Faço os clientes ticar cada item antes do lançamento.

Passo 1: Verifique o log de expedição do WMS. Confirme que todo pedido enviável tem um registro de solicitação de expedição com número do pedido, peso e dimensões do pacote, e produto de serviço. Se o pedido nunca gerou uma solicitação dentro do WMS, o problema é interno — uma máquina de estados travada, um agendador de expedição morto. Pule a API.

Passo 2: Verifique a fila da camada de integração. Para expedição assíncrona, olhe o atraso da fila, se os consumidores estão vivos, e o que está se acumulando na fila de mensagens mortas (dead-letter queue). Para chamadas síncronas, olhe as configurações de timeout e novas tentativas. O timeout nunca deve ser menor que o teto de resposta do SLA da transportadora — e na alta temporada, dobre com margem. O timeout de 5 segundos do armazém de vestuário foi pego bem aqui.

Um funcionário de armazém solucionando um problema de API de etiquetas numa estação de trabalho, tela desfocada

Passo 3: Verifique a resposta da transportadora. Cada solicitação precisa de um log pareado solicitação-resposta: o que foi enviado, em que timestamp, o que voltou, e o número de rastreio. Registrar a solicitação sem a resposta é o mesmo que não registrar nada — o pior sistema que já vi armazenava apenas as palavras "chamada bem-sucedida", nem mesmo o número de rastreio.

Passo 4: Verifique a escrita de status. Depois que a transportadora devolve um número de rastreio, o WMS deve escrevê-lo de volta no pedido e avançar o status para "pronto para imprimir". Uma escrita falhada deve ir para uma fila de novas tentativas, nunca ser silenciosamente ignorada. A escrita é a zona de maior baixa — em muitos sistemas a solicitação e a escrita são duas transações independentes. A solicitação tem sucesso, a escrita morre, e o pedido flutua no limbo: a transportadora tem, o WMS não.

Passo 5: Verifique a impressora. A impressora da estação de empacotamento fica offline, acaba o papel, o driver quebra, a etiqueta não sai, e o operador clica em "reimprimir". A reimpressão deve seguir o fluxo de reimpressão — o mesmo número de rastreio existente, papel novo. Nunca emita uma nova solicitação de etiqueta, ou um pedido vira dois números de rastreio e a conciliação de fim de mês vira seu pesadelo pessoal.

Passo 6: Concilie a cadeia completa. Após o corte diário, execute uma conciliação em quatro vias: contagem de expedição do WMS = contagem de solicitações da camada de integração = contagem de sucessos da transportadora = contagem impressa. Qualquer diferença são suas etiquetas perdidas, quantificadas. Este script de conciliação deve existir no dia um do lançamento — não depois do primeiro incidente. Escreva tarde e você nem conseguirá responder "quantas perdemos?".

Passo 7: Chaves de idempotência. Cada solicitação de etiqueta carrega uma chave de idempotência globalmente única. Use número do pedido mais sequência do pacote — nunca o número do pedido sozinho, porque pedidos multi-pacote vão colidir. Tanto o lado da transportadora quanto sua própria camada de integração devem deduplicar pela chave. Esta é a única defesa contra "a nova tentativa imprime uma etiqueta duplicada". Não há uma segunda.

Elo Sintoma típico Ação de depuração
Expedição do WMS Pedidos presos em "aguardando etiqueta", sem registro de solicitação Verifique a máquina de estados do pedido, o agendador de expedição
Fila da API Latência crescente, fila de mensagens mortas se acumulando Verifique a saúde dos consumidores, alertas de profundidade da fila
Resposta da transportadora Timeouts frequentes, falhas esporádicas Verifique as configurações de timeout, página de status da transportadora, logs pareados
Escrita de status O número de rastreio existe mas o status do pedido não muda Verifique a transação de escrita, a fila de novas tentativas
Estação de impressão Operadores relatam "nada imprime" Verifique o status da impressora, use o fluxo de reimpressão, nunca solicite de novo

Pontos de falha comuns (autoavaliação antes do lançamento)

  • Timeout curto demais. Sempre explode na alta temporada. Já vi isso três vezes, e toda vez a história começa com "funcionava bem até a grande promoção".
  • Falhas descartadas em vez de enfileiradas. Uma janela de manutenção da meia-noite ou um 500 aleatório da transportadora vira "pedido não encontrado".
  • Novas tentativas sem chaves de idempotência. Tentar de novo é gostoso; a conciliação de fim de mês é a ressaca — a transportadora cobra por cada etiqueta duplicada.
  • Conciliar dinheiro e estoque, mas não etiquetas. O financeiro fecha, o estoque fecha, e ninguém nota algumas dezenas de etiquetas perdidas até os clientes relatarem pacotes que nunca chegaram.
  • Tratar "chamada bem-sucedida" como "etiqueta criada". Um 200 da API da transportadora não significa que uma etiqueta foi gerada. Leia o código de status de negócio dentro do corpo da resposta — transportadoras rotineiramente embrulham uma falha de negócio num HTTP 200.

A parte contraintuitiva

O modo de falha mais perigoso não é um erro — é o falso sucesso. Um erro dispara um alerta e alguém olha. Mas "solicitação enviada, WMS mostra sucesso, transportadora nunca recebeu" pode ficar quieto por semanas e depois detonar na manhã da sua maior promoção. Uma regra se defende disso: o número de rastreio devolvido pela transportadora é a única fonte da verdade. Qualquer pedido sem um é tratado como nunca enviado. Alinhe o armazém e o atendimento ao cliente nisso antes do lançamento, ou os três lados vão discutir sobre isso depois do incidente — com a TI levando a culpa.

Um trade-off merece honestidade: chamadas síncronas versus fila assíncrona. Síncrono é simples — o operador clica em imprimir e sabe o resultado — mas uma resposta lenta da transportadora trava toda a linha de empacotamento. Assíncrono dá vazão e absorve picos, mas a cadeia fica mais longa e a depuração fica duas vezes mais difícil. Minha regra: abaixo de 5,000 pedidos por dia, vá de síncrono com timeouts curtos e uma fila de revisão manual para falhas. Acima disso, vá de assíncrono — mas só depois que a conciliação de cadeia completa e os alertas acima estiverem no lugar. Assíncrono não é bala de prata; ele converte "erro na sua cara" em "conciliação depois do fato". Conciliação fraca torna perdas assíncronas mais difíceis de achar que as síncronas.

APIs de etiquetas parecem tranquilas até as 3 AM do dia da promoção. Imprima este checklist e cole ao lado da estação de empacotamento. É melhor que qualquer dashboard.

Por Lin Xiao, Consultor de Implementação WMS

Traduzido do inglês. Em caso de divergência, prevalece a versão em inglês.