Comportamento de entrega
Lido na documentação do próprio provedor, verificado pela última vez em 2026-08-06. Onde o provedor não informa um número, esta tabela também não traz nenhum.
| Prazo de resposta | não publicado pelo provedor A entrega entra na fila do Action Scheduler e é disparada pelo WP-Cron, então sai quando a próxima página é carregada, não quando o evento acontece |
|---|---|
| Novas tentativas | não publicado pelo provedor |
| Desiste | Webhook desativado após mais de cinco falhas de entrega consecutivas |
| Fonte | https://woocommerce.com/document/webhooks/ |
Assinatura
Verificada com um verificador funcional, comprovado por uma suíte de testes, e não lida na documentação. Última verificação em 2026-08-20.
| Algoritmo | HMAC-SHA256 |
|---|---|
| Payload assinado | raw body |
| Codificação | base64 |
| Cabeçalho | x-wc-webhook-signature |
| Tolerância | nenhuma exigida |
Verifique a assinatura
O corpo bruto da requisição, byte a byte, antes de qualquer parsing de JSON. Todos os esquemas desta página quebram no momento em que um framework serializa o payload de novo.
const crypto = require("node:crypto");
// base64(HMAC-SHA256(secret, raw body))
const expected = crypto
.createHmac("sha256", webhookSecret)
.update(rawBody)
.digest("base64");
const received = Buffer.from(req.headers["x-wc-webhook-signature"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
received.length === wanted.length && crypto.timingSafeEqual(received, wanted);Armadilhas
O webhook não dispara quando o pedido acontece. A entrega entra na fila do Action Scheduler, que roda no WP-Cron, que roda quando alguém carrega a próxima página: numa loja com pouco movimento, são minutos de atraso embutido antes de o primeiro byte sair.
Mais de cinco falhas de entrega consecutivas desativam o webhook de vez, e o dono da loja raramente percebe até que algo que depende dele fique visivelmente desatualizado.
Leia também
O AnyHook fica entre WooCommerce e seus endpoints: responde em cerca de um segundo, tenta de novo segundo um cronograma próprio quando seu servidor está fora do ar e guarda cada evento disponível para replay. Troque uma URL e mantenha seu código.