Lemon Squeezy: como funciona a entrega de webhooks

A Lemon Squeezy não publica timeout, novas tentativas nem desativação. O que está verificado: o formato HMAC do x-signature, com um verificador Node.

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 respostanão publicado pelo provedor
Novas tentativasnão publicado pelo provedor
Desistenão publicado pelo provedor

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.

AlgoritmoHMAC-SHA256
Payload assinadoraw body
Codificaçãohex
Cabeçalhox-signature + x-event-name
Tolerâncianenhuma 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");

// hex(HMAC-SHA256(signing secret, raw body)); event name rides x-event-name
const expected = crypto
  .createHmac("sha256", signingSecret)
  .update(rawBody)
  .digest("hex");
const received = Buffer.from(req.headers["x-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

Nenhum timeout, cronograma de novas tentativas ou regra de desativação é publicado. Planeje para o pior caso: trate cada entrega como possivelmente a única e mantenha seu próprio log do que chegou.

Leia também

O AnyHook fica entre Lemon Squeezy 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.

Como funciona →