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 | 5 s 1 segundo para conectar, 5 segundos para a requisição inteira |
|---|---|
| Novas tentativas | 8 novas tentativas ao longo de 4 horas |
| Desiste | Inscrições criadas pela Admin API são excluídas após 8 falhas consecutivas, com um e-mail de aviso para o contato de emergência do desenvolvedor do app |
| Fonte | https://shopify.dev/docs/apps/build/webhooks/subscribe/https |
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-shopify-hmac-sha256 |
| 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", hmacSecret) // admin webhooks: Settings → Notifications
.update(rawBody)
.digest("base64");
const received = Buffer.from(req.headers["x-shopify-hmac-sha256"] ?? "");
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);Existem dois segredos diferentes: webhooks criados no admin assinam com o segredo compartilhado em Settings → Notifications, e os criados por apps, com o client secret do app. Use o segredo que corresponde à forma como o webhook foi criado.
Armadilhas
A Shopify não desativa a inscrição: ela a exclui. Uma inscrição criada pela Admin API é excluída depois de 8 falhas consecutivas, com apenas um e-mail de aviso ao contato de emergência do desenvolvedor do app; nenhum erro aparece e os pedidos param de chegar. A recuperação é um job de conciliação pela Admin API, porque os eventos perdidos nunca foram enviados.
Leia também
O AnyHook fica entre Shopify 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.