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.
- Por que pedidos morrem em
pending_paymentouprocessing— 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.
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
- 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 em
pending_paymentpara sempre. - 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.
- 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.
- 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.
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.
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]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:
- Confirme: o pedido está mesmo travado ou é só lag de processamento? Aguarde 5 minutos antes de agir.
- Identifique o tópico/integração afetada. Pendentes só no tópico de cancelamento? Provavelmente cron. Pendentes em todos? Cron ou banco.
- Reinicie o consumer afetado:
bin/magento queue:consumers:start <nome>e veja se a fila começa a drenar. - Se for webhook não chegando, reenvie manualmente do painel do gateway (PagSeguro, Mercado Pago e Cielo permitem reenviar).
- 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_iddo gateway como chave única e ignore duplicatas — assim retries do gateway não criam ordens duplicadas.
Referências
- Adobe Commerce. Order processing — Sales document workflow. experienceleague.adobe.com/order-processing
- Adobe Commerce. Message Queues — Architecture and Consumer Management. developer.adobe.com/commerce/php
- Automattic / WooCommerce. Action Scheduler — Internals and Stuck Actions. actionscheduler.org
- Reclame AQUI. Balanço Anual de Reclamações, 2024. reclameaqui.com.br
- Brasil. Lei nº 8.078, de 11 de setembro de 1990 — Código de Defesa do Consumidor, Art. 35. planalto.gov.br
- 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.
Continue lendo
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.
