Skip to main content
Você testou em sandbox e funcionou. Estes são os pontos que sandbox não pega.

Segurança

A chave live não está no bundle do front

Procure por ps_live_ no build final, não só no código. Um console.log esquecido ou uma variável sem prefixo de servidor já entrega a chave.Se ela estiver exposta, alguém pode criar cobrança em seu nome e, com saque turbo, mandar dinheiro pra fora.

O webhook valida a assinatura

A sua callbackUrl é pública. Sem validar o X-Webhook-Signature, qualquer pessoa manda um JSON com "status": "paid" e leva o produto de graça.Confira também que você está assinando o corpo cru, antes do parse. Um express.json() no lugar errado quebra a validação de um jeito que passa em teste e falha em produção.
Não basta o status ser paid. Compare o amountCents recebido com o valor que você esperava para aquele pedido antes de liberar qualquer coisa.
Variável de ambiente ou cofre. Se vazou, regenere no painel: o antigo para de funcionar na hora.

Confiabilidade

O handler é idempotente

Webhook é reentregue quando a entrega falha, e a mesma confirmação pode chegar mais de uma vez. Deduplique pelo header X-Webhook-Id, que é estável entre as tentativas.O teste é simples: mande o mesmo payload duas vezes e veja se o cliente recebe o produto duas vezes.
O timeout é de 5 segundos. Se o seu handler manda e-mail, gera licença e escreve em três tabelas antes de responder, ele vai estourar e você vai receber reentrega de coisa que já processou.Grave o evento, responda 200, processe em fila.
Webhook é notificação, não fonte da verdade. Tenha um job que varre pedidos parados em pending há mais de uma hora e confirma o estado por GET.
Em saques, 202 e status: "processing" significam que o dinheiro pode já ter saído. Reenviar paga duas vezes.

Configuração da conta

1

Chave PIX verificada

Sem verificação, o primeiro saque devolve 403. Resolva isso antes de precisar do dinheiro, não depois.
2

URL de webhook cadastrada no painel

Os webhooks de pedido e de saque usam a URL configurada na conta, não a callbackUrl da cobrança.
3

Valor mínimo conferido

O painel permite subir o mínimo da loja acima de R$ 0,80. Se o seu produto mais barato fica abaixo dele, a cobrança falha em produção e passava em sandbox.
4

Carteira LTC configurada, se for usar cripto

Sem carteira, paymentMethod: "ltc" devolve 503.

Operação

Log com o tripé certo

Código HTTP, corpo do erro e paymentId. Com esses três, uma dúvida no Discord vira uma resposta em vez de cinco.

Alerta de disputa

Rode GET /v1/disputes?status=aberta diariamente. Contestação tem prazo.

Uma chave por serviço

Dá pra revogar uma sem derrubar o resto, e dá pra saber quem gastou o limite.

Backoff no cliente

Com jitter. Sem ele, seus workers batem no 429 todos juntos.

O teste final

Faça uma venda real de valor baixo, do início ao fim: cobrança, pagamento, webhook, entrega e saque. É o único teste que cobre configuração de conta, e leva dez minutos.

Travou em algum ponto?

Chama no Discord com o código HTTP, o corpo do erro e o paymentId. Costuma sair na primeira resposta.