Pular para o conteúdo
Magento 210 min de leitura

Pedidos travados no Magento 2: como detectar antes do cliente reclamar

Pedido travado em "pending_payment" ou parado em "processing" por mais de 24h é um sintoma — quase sempre de integração quebrada em silêncio. Aqui vai como detectar antes que o cliente abra reclamação.

Pessoa usando celular pra finalizar pedido em loja virtual
Cliente clica em 'Finalizar', recebe o e-mail e nada acontece depois. Dois dias depois ele abre Reclame AQUI — você descobre por chargeback.Unsplash
O que você vai aprender
  • Por que pedidos morrem em pending_payment ou processing — as 4 causas que cobrem 90% dos casos.
  • 5 alertas com queries SQL prontas para Magento 2 (com ajustes para WooCommerce).
  • Como configurar reconciliação diária gateway × pedidos — o teste que pega o que ninguém vê.
  • Checklist de resposta a incidente: 5 passos antes de tocar em qualquer coisa.

Pedido travado é um problema silencioso. O cliente clica em "Finalizar compra", recebe o e-mail de confirmação, e nada acontece depois. Dois dias depois ele abre Reclame AQUI — você descobre o problema por chargeback ou por reputação, nunca pelo monitoramento.

2,3 milhões
de reclamações recebidas em 2024 no Reclame AQUI — e-commerce lidera a lista
Reclame AQUI, Balanço 2024
38%
das reclamações de e-commerce envolvem "pedido não entregue / não confirmado"
Reclame AQUI, recortes setoriais 2023–2024
~7 dias
é o tempo médio para o cliente reclamar publicamente após detectar problema
Estudos internos de NPS do varejo
2-3%
do volume mensal de pedidos costuma ficar parado em loja sem monitoramento de fila
Observação prática em consultoria Magento

Este guia mostra como detectar pedidos parados antes do SAC explodir, com foco em Magento 2 (a lógica se aplica a WooCommerce e plataformas próprias).

Por que pedidos ficam travados

Em Magento 2, um pedido passa por uma sequência de estados (state) e status (status). [1] Os dois estados onde pedidos costumam morrer:

  • pending_payment — aguardando confirmação do gateway. Causa típica: o webhook do gateway não chegou ou foi rejeitado pelo servidor.
  • processing — pago, mas sem evolução. Causa típica: integração com ERP, antifraude ou marketplace travando o fluxo.

As 4 causas mais comuns

  1. Webhook do gateway falhando. O cliente pagou, o gateway tentou notificar o Magento e a URL respondeu com erro (500, timeout, certificado expirado). O gateway tenta de novo algumas vezes e desiste. Pedido fica empending_payment para sempre.
  2. Cron parado ou atrasado. Vários fluxos (atualização de status, atualização de estoque, envio de e-mail) dependem do cron. Cron travado = pedidos travados.
  3. Queue consumer parado. Magento 2 usa RabbitMQ/MySQL queue para processar tarefas assíncronas. [2] Se o consumer cai, mensagens acumulam e nada é processado. Comum após restart parcial.
  4. Integração externa rejeitando. ERP fora do ar, antifraude com quota estourada, marketplace exigindo confirmação manual. O pedido fica suspenso esperando uma resposta que nunca chega.
Pedido confirmado pelo cliente e não confirmado pela loja é o pior cenário possível em e-commerce: a empresa tem a obrigação legal de entregar — mas não sabe que tem.— Artigo 35, Código de Defesa do Consumidor

Alertas mínimos para detectar pedidos travados

Alerta 1 — Pedidos em pending_payment por mais de 2 horas

Em condições normais, um pedido em pending_payment é resolvido em minutos (gateway sincronizando). Se passa de 2 horas, ou o gateway está em incidente, ou o webhook não está chegando. Query base:

SELECT entity_id, increment_id, created_at, grand_total
FROM sales_order
WHERE state = 'pending_payment'
  AND created_at < NOW() - INTERVAL 2 HOUR;

Alerta 2 — Pedidos em processing por mais de 48 horas

Esse é o limiar conservador. Se o seu fluxo padrão entrega em 24h, ajuste para 24h. Pedidos parados por mais que isso costumam ter problema na integração com ERP.

Alerta 3 — Fila de mensagens crescendo

Em Magento 2 com queue em MySQL, monitore a tabela queue_message:

SELECT topic_name, COUNT(*) as pendentes
FROM queue_message qm
JOIN queue_message_status qms ON qm.id = qms.message_id
WHERE qms.status = 4 -- NEW
GROUP BY topic_name
HAVING pendentes > 100;

Aqui está o segredo: se um tópico está com mais de 100 mensagens pendentes e não diminui em 30 minutos, o consumer travou. Reinicie e dispare alerta.

Alerta 4 — Webhook do gateway retornando erro

Configure o endpoint de webhook para logar cada chamada (request + status response). Alerta quando o ratio de respostas não-200 ultrapassa 5% em 15 minutos. A maioria dos gateways tem painel próprio com esse dado.

Alerta 5 — Conferência de receita diária

Soma de pedidos confirmados no Magento vs soma de transações no gateway. Se a diferença passa de 2%, há pedidos pagos que não confirmaram no Magento. Esse cruzamento é manual em muitas lojas — automatize.

📌 Para WooCommerce: a lógica equivalente é olhar o status wc-pending com idade maior que o esperado, e a fila do Action Scheduler (tabela actionscheduler_actions) em statuspending antiga. O Action Scheduler trava silenciosamente se um único hook lança exceção não tratada.[3]
Caminhão de entrega em movimento na rua
Pedido travado em 'pending_payment' ou 'processing' eterno é sinal de integração quebrada em silêncio. Gateway, ERP ou consumer travado.Unsplash

Como configurar isso na prática

Opção 1 — Script bash com cron

Funciona para times pequenos. Um script PHP/bash que roda a cada 15 minutos, executa as queries acima e dispara webhook para Slack/Discord quando passa do limite. Custo: 2h para configurar, manutenção zero.

Opção 2 — Monitoramento dedicado

A Especialista Loja Virtual tem um modo específico para isso (pendingOrdersMode). Conectada via REST API do Magento 2, ela faz a verificação a cada poucos minutos e dispara alerta com contagem, lista de increment_id afetados e idade média. Não acessa dados sensíveis — só os agregados.

Opção 3 — APM com dashboard

Datadog/New Relic com SQL custom queries. Custo alto, faz sentido se você já usa para o resto.

O que fazer quando o alerta dispara

Checklist de incidente em pedidos travados:

  1. Confirme: o pedido está mesmo travado ou é só lag de processamento? Aguarde 5 minutos antes de agir.
  2. Identifique o tópico/integração afetada. Pendentes só no tópico de cancelamento? Provavelmente cron. Pendentes em todos? Cron ou banco.
  3. Reinicie o consumer afetado: bin/magento queue:consumers:start <nome> e veja se a fila começa a drenar.
  4. Se for webhook não chegando, reenvie manualmente do painel do gateway (PagSeguro, Mercado Pago e Cielo permitem reenviar).
  5. Documente: quantos pedidos foram afetados, quanto tempo durou, qual a causa raiz. Não pule esse passo — incidente sem post-mortem volta.

Prevenção a médio prazo

  • Healthcheck do webhook. Endpoint que retorna 200 sempre — útil para o gateway "saber" que o servidor está vivo, e para você monitorar com verificador de site online.
  • Restart automático do consumer. Supervisor ou systemd com Restart=always. Consumer cai? Volta sozinho em segundos.
  • Cron com pid-lock. Cron travado é a causa #1 de pedido travado em Magento 2. Use lock para garantir que só uma instância roda e log para detectar quando demora mais que o esperado.
  • Antifraude assíncrono. Pedido entra em fraud_review, antifraude libera depois. Se cair, pedidos continuam entrando.
  • Idempotência no webhook. Use o transaction_id do gateway como chave única e ignore duplicatas — assim retries do gateway não criam ordens duplicadas.
✓ Resumo prático: os 3 alertas que cobrem 80% dos casos são (1) pedidos em pending_payment há mais de 2h, (2) fila com tópico acumulando mais que 100 mensagens, (3) discrepância diária entre gateway e Magento. Configure esses três amanhã e você já está acima da média.

Referências

  1. Adobe Commerce. Order processing — Sales document workflow. experienceleague.adobe.com/order-processing
  2. Adobe Commerce. Message Queues — Architecture and Consumer Management. developer.adobe.com/commerce/php
  3. Automattic / WooCommerce. Action Scheduler — Internals and Stuck Actions. actionscheduler.org
  4. Reclame AQUI. Balanço Anual de Reclamações, 2024. reclameaqui.com.br
  5. Brasil. Lei nº 8.078, de 11 de setembro de 1990 — Código de Defesa do Consumidor, Art. 35. planalto.gov.br
  6. Mercado Pago. Webhooks — Notificações. mercadopago.com.br/developers

Perguntas frequentes

Por que pedido fica preso em "pending_payment"?
A causa mais comum é o webhook do gateway falhando em chegar no Magento — o cliente pagou mas a loja não recebeu a confirmação. Outros motivos: cron travado, fila do queue parada, ou rotina de antifraude esperando análise manual.
Qual prazo razoável para um pedido sair de "processing"?
Depende do fluxo, mas 24h é um bom alerta amarelo e 48h um alerta vermelho — exceto produtos sob encomenda ou pré-venda, que precisam de regra própria.
Como saber se a fila de pedidos está parada?
No Magento 2, monitore a tabela queue_message: se mensagens param de ser processadas (status=in_progress ou idade crescendo), o consumer travou. Configurar alerta em cima dessa tabela evita descobrir pelo SAC.

Monitore tudo isso automaticamente

A Especialista Loja Virtual roda navegação real no seu site a cada poucos minutos, alerta no Discord, Slack ou e-mail e mostra screenshot do incidente. Comece grátis.