Webhooks
Receba no seu servidor, em tempo real, cada mudança em cobranças, parcelas, assinaturas e vendas. Este guia mostra, passo a passo, como configurar um webhook no portal do lojista, escolher o formato do payload e validar as entregas.
- Acesso ao portal com o item Plataforma › Webhook.
- Um endpoint no seu servidor (HTTPS em Produção).
- Criar o webhook em 9 passos.
- Escolher entre Trivvo V2 e Trivvo V1.
- Validar, testar e acompanhar as entregas.
Como funciona
Criar um webhook no portal
Tudo é feito no portal do lojista. Os nomes em negrito são exatamente os que aparecem na tela.
- 1
Prepare o endpoint no seu servidor.
Uma URL pública que aceitePOSTcom corpo JSON e responda em até 10 segundos. Em Produção a URL precisa usarhttps://; em Sandbox,http://também é aceito. - 2
Abra a tela de webhooks no portal.
No portal: Plataforma › WebhookNo menu lateral do portal do lojista, em Plataforma, clique em Webhook e depois em Novo endpoint, no canto superior direito. O item só aparece para quem tem a permissão de gerenciar webhooks; se ele não aparecer, peça ao administrador da sua conta. - 3
Preencha a seção Endpoint.
No portal: Novo endpoint › EndpointInforme a URL do endpoint, escolha o Ambiente e, se quiser, uma Descrição de até 200 caracteres; ela vira o nome do webhook na lista. Um webhook de Sandbox só recebe eventos de transações de teste; um de Produção, só eventos reais. - 4
Marque os eventos.
No portal: Novo endpoint › Eventos & filtrosMarque cada evento que quer receber. A lista completa, com exemplos, está no catálogo de eventos. Assine só o que a sua integração usa. - 5
Escolha o schema de cada evento.
No portal: Eventos & filtros › SchemaAo marcar um evento aparece o campo Schema, já preenchido com Trivvo V2. Nos 8 eventos de cobrança você pode trocar para Trivvo V1. Leia a opção assim:Trivvo V2 - cobranca.paga (v1.0)é o formato Trivvo V2, na revisão 1.0, para o evento cobranca.paga. Veja qual escolher.✓cobranca.pagaEvento de confirmação de pagamento de uma cobrançaSchemaTrivvo V2 - cobranca.paga (v1.0)Trivvo V1 - cobranca.paga (v1.0) - 6
Confira o payload e, se precisar, filtre.
No portal: Eventos & filtros › Pré-visualizar payloadPré-visualizar payload aplica o schema ao evento mais recente da sua conta e mostra o corpo que será entregue ao lado do evento original. Em Condição (opcional), uma expressão comoofertaId != nullfiltra quais eventos são entregues (neste exemplo, só cobranças de ofertas); ela é avaliada sobre o evento original, com os nomes de campo que a pré-visualização mostra. Em branco, todos são entregues. - 7
Salve.
No portal: Novo endpointClique em Criar webhook. Se algum evento ficou com o selo Schema pendente, escolha o schema dele antes; o portal não salva sem isso. Você volta para a lista, onde o webhook aparece como Saudável. - 8
Gere e guarde o secret.
No portal: Webhook › Editar › Rotacionar secretNa lista, clique no lápis (Editar) do webhook, depois em Rotacionar secret e em Confirmar rotação. Clique em Copiar e guarde o valor no servidor, por exemplo numa variável de ambiente. Toda entrega traz esse valor no headerX-Secret.O secret completo aparece uma única vez. Depois de fechar a janela o portal mostra só o identificador mascarado. Perdeu o valor? Rotacione de novo e atualize o servidor: o secret anterior deixa de valer na hora. - 9
Confira a primeira entrega.
No portal: Webhook › Ver logsFaça uma transação no ambiente do webhook. Na lista, o ícone de olho (Ver logs) — ou Ver eventos enviados na edição — mostra cada evento; ao abrir um evento você vê as tentativas, com status, código HTTP, duração, a resposta do seu servidor e o payload enviado. Reprocessar envia o evento de novo.
Escolher o schema: Trivvo V2 ou Trivvo V1
O schema define o formato do corpo entregue. Ele é escolhido por evento, no passo 5, e pode ser trocado a qualquer momento editando o webhook. Não há envelope: os campos ficam no primeiro nível do JSON.
Use Trivvo V2 quando
- for uma integração nova (é o padrão do portal);
- precisar de eventos de parcelas, assinaturas, vendas ou comentários;
- quiser um payload enxuto, com valores na unidade da moeda.
Use Trivvo V1 quando
- a sua integração já foi feita para o formato legado da Trivvo;
- precisar, no próprio evento de cobrança, de dados de checkout, order bumps, UTMs, navegador ou endereço.
| Aspecto | Trivvo V2 | Trivvo V1 |
|---|---|---|
| Eventos | Todos os 21 | Só os 8 de cobrança (todos menos comentário externo) |
| Nomes dos campos | camelCase: valorPago, ofertaNome | snake_case: value_cents, approved_at |
| Conteúdo | Os dados do evento, enxutos | Enriquecido: comprador, transação, order bumps, rastreamento (UTMs), navegador e endereço |
| Gerados a cada entrega | schemaVersion, processedAt, eventId (cobrança e parcelas) | Nenhum |
| Identifica o evento | Pela assinatura do webhook (um formato por evento) | Campo type (ex.: transaction.paid) |
| Valores | Unidade da moeda (R$ 49,90 = 49.9), exceto campos …Centavos | Sempre em centavos (value_cents: 4990) |
| Datas | ISO 8601 em UTC (2025-02-28T12:34:56Z) | ISO 8601 com fuso (2025-02-28T09:34:56-03:00) |
O mesmo evento nos dois formatos
cobranca.paga, a mesma cobrança de R$ 100,00. Troque a aba para comparar.
{
"schemaVersion": "1.0",
"processedAt": "2025-03-12T09:30:02Z",
"eventId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-02-28T12:34:56Z",
"valorPago": 100,
"moeda": "BRL",
"formaPagamento": "cartao_de_credito",
"ofertaId": null,
"ofertaNome": null,
"cliente": {
"nome": "João da Silva",
"email": "joao.silva@exemplo.com.br",
"telefone": "+55 11 99999-8888",
"numeroDocumento": "12345678909"
},
"itens": [
{
"descricao": "Assinatura Mensal",
"valor": 50,
"quantidade": 2,
"atributosAdicionais": null
}
]
}Os campos de cada evento, com tipo e descrição, estão no catálogo de eventos.
Valores monetários vêm em unidade da moeda (R$ 49,90 = 49.9), exceto os campos terminados em Centavos, o valorTotal de pagamento incompleto e de estorno parcial, e o valorParcela das parcelas, que vêm em centavos (R$ 49,90 = 4990). Campos sem valor chegam como null. Novos campos podem ser adicionados: ignore os que não conhecer.
Receber e validar
O seu endpoint confere o secret, guarda o evento e responde rápido. O processamento pesado vai para uma fila.
// Exemplo em Node.js (Express)
const crypto = require('crypto');
const segredo = Buffer.from(process.env.TRIVVO_WEBHOOK_SECRET);
app.post('/webhooks/trivvo', express.json(), (req, res) => {
const recebido = Buffer.from(req.get('X-Secret') || '');
if (recebido.length !== segredo.length || !crypto.timingSafeEqual(recebido, segredo)) {
return res.sendStatus(401);
}
const entrega = req.get('X-Request-ID');
if (jaProcessado(entrega)) return res.sendStatus(200);
fila.publicar(entrega, req.body); // processe depois
res.sendStatus(200);
});A requisição
Toda entrega é um POST com Content-Type: application/json e os headers abaixo.
| Header | Para que serve |
|---|---|
| X-Secret | O secret do webhook. Compare com o valor que você guardou e recuse a entrega se não bater. |
| X-Request-ID | Identifica a entrega. É o mesmo em todas as tentativas: use-o para não processar o mesmo evento duas vezes. |
| X-Attempt-ID | Identifica cada tentativa de envio. |
| X-Trace-ID | Informe ao suporte para localizarmos a entrega. |
Testar antes de ir para produção
- Crie um webhook com Ambiente Sandbox. A URL pode ser
http://, por exemplo um túnel para a sua máquina. - Faça uma venda de teste e confira em Ver logs se a tentativa ficou como Sucesso e se o seu servidor gravou o evento.
- Force um erro (responda 500) e veja a nova tentativa aparecer; depois use Reprocessar.
- Quando estiver tudo certo, crie um segundo webhook com Ambiente Produção, URL
https://e o seu próprio secret.
Reenvio e desativação
| Regra | Como funciona |
|---|---|
| Tentativas | Até 3 por evento: a segunda 15 segundos depois da primeira e a terceira 30 segundos depois da segunda. Respostas fora da faixa 2xx, ou sem resposta, contam como falha. |
| Tempo limite | 3 segundos para conectar e 10 segundos para responder. |
| Entrega ao menos uma vez | A mesma entrega pode chegar mais de uma vez. Use o header X-Request-ID para ignorar repetições. |
| Desativação automática | Se o endpoint passar de 3 falhas em 5 minutos, o webhook é desativado e aparece como Desativado na lista. |
| Reativar | Corrija o endpoint e ative pelo ícone liga/desliga na lista, ou pela chave Ativo em Editar › Avançado. |
| Reprocessar | Em Ver logs, abra o evento e clique em Reprocessar para enviá-lo de novo. |
Status das tentativas em Ver logs
| Status | O que significa | O que fazer |
|---|---|---|
| Sucesso | O seu servidor respondeu 2xx. | Nada. |
| Pendente | A tentativa está na fila ou aguardando nova tentativa. | Aguarde; ela é refeita automaticamente. |
| Falhou | Resposta fora de 2xx, ou sem resposta no tempo limite. | Veja a coluna Resposta, corrija o endpoint e use Reprocessar. |
Boas práticas
- Responda rápido. Guarde o evento, responda 200 e processe numa fila. Acima de 10 segundos a tentativa conta como falha.
- Deduplique pelo X-Request-ID. Ele é o mesmo em todas as tentativas do mesmo evento; o
eventIddo payload muda a cada tentativa. - Não dependa da ordem. Eventos podem chegar fora de ordem: compare o
timestampantes de sobrescrever um status. - Ignore campos que não conhece. Novos campos podem ser adicionados ao schema sem aviso.
- Separe Sandbox e Produção. Um webhook por ambiente, cada um com o seu secret.
- Rotacione o secret com cuidado. A rotação invalida o valor antigo na hora: atualize o servidor logo em seguida e confira em Ver logs.