Esta página descreve o formato do webhook enviado pela plataforma quando um carrinho criado no checkout passa de 30 minutos sem nenhuma tentativa de pagamento registrada e o comprador já informou algum dado de contato.
O webhook de carrinho abandonado é enviado quando um pedido criado no checkout passa de 30 minutos sem nenhuma tentativa de pagamento registrada e o comprador já preencheu os dados de contato no checkout. A contagem começa na criação do pedido, e o envio acontece a partir dos 30 minutos: a notificação costuma chegar alguns minutos depois, não no minuto exato.
As notificações são enviadas via requisições HTTP no método POST, utilizando o formato JSON.
O envio é cancelado quando o pedido passa a ter um pagamento registrado, qualquer que seja o status: Pix ou boleto gerados e não pagos já contam, e por isso não geram esta notificação. Uma tentativa que não chega a ser registrada, como cartão recusado ou erro do provedor, pode não cancelar o envio, então não conte com isso. O envio é normalmente único por pedido e não há ciclo de status para acompanhar, mas trate a notificação pelo id do pedido e ignore uma eventual repetição.
Todos os campos de data e hora enviados nos webhooks utilizam o padrão ISO 8601 no timezone UTC (UTC+00:00), garantindo consistência independentemente do fuso horário do integrador. Para evitar divergências causadas por horários locais ou horário de verão, recomenda-se manter os valores em UTC para armazenamento e processamento, realizando a conversão para o fuso horário local apenas no nível de apresentação ao usuário final.
Para aumentar a segurança, os webhooks cadastrados diretamente no painel podem incluir uma assinatura enviada no header X-Signature: <assinatura-em-base64>, permitindo validar a autenticidade da notificação recebida. Essa assinatura é gerada pela plataforma utilizando HMAC com SHA-256 sobre o corpo do webhook, em formato JSON, usando um segredo compartilhado WEBHOOK_SECRET e codificada em Base64. O integrador pode reproduzir o mesmo cálculo em seu sistema utilizando o mesmo segredo e o payload recebido. Se a assinatura gerada for igual à enviada no header, o webhook é considerado legítimo e íntegro. Caso sejam diferentes, a requisição pode ter sido alterada ou não ter sido enviada pela plataforma.
A validação por assinatura é opcional, porém fortemente recomendada sempre que o webhook for configurado pelo painel, para garantir maior segurança na comunicação.
O webhook é enviado para a URL cadastrada no painel para o tipo Carrinhos abandonados. Esse é o único jeito de receber este webhook: ele não usa notificationUrl, e todo envio leva a assinatura X-Signature.
O endpoint deve estar acessível publicamente e responder com HTTP 200 para confirmar o recebimento da notificação.
Abaixo está um exemplo do payload de um carrinho abandonado com todos os campos preenchidos.
{
"id": "cm6p2a1b30001ls08d4f7h9kz",
"amount": 42450,
"discount": 6486,
"currency": "BRL",
"status": "PENDING",
"installments": 1,
"customer": {
"fullName": "Maria Silva",
"email": "maria.silva@example.test",
"document": "12345678909",
"phone": "+5511999999999"
},
"items": [
{
"name": "Tênis Runner",
"quantity": 1,
"price": 29990,
"type": "PHYSICAL"
},
{
"name": "Meia Esportiva",
"quantity": 2,
"price": 2490,
"type": "PHYSICAL"
},
{
"name": "E-book Guia de Corrida",
"quantity": 1,
"price": 4990,
"type": "DIGITAL"
}
],
"coupons": [
{
"code": "VOLTA10",
"type": "BY_ORDER",
"percent": 1000,
"fixed": null
},
{
"code": "FRETEGRATIS",
"type": "FREE_SHIPPING",
"percent": null,
"fixed": null
}
],
"shipping": {
"fee": 2490,
"type": "SEDEX",
"address": {
"zipCode": "01310-100",
"country": "BR",
"state": "SP",
"city": "São Paulo",
"neighborhood": "Bela Vista",
"line1": "Avenida Paulista",
"line2": "Apto 42",
"streetNumber": "1000"
}
},
"utms": {
"utmSource": "instagram",
"utmMedium": "stories",
"utmCampaign": "black-friday",
"utmContent": "video-tenis",
"utmTerm": null,
"src": "bio",
"sck": null
},
"metadata": {
"provider": "ExemploCheckout",
"checkoutUrl": "https://checkout.example.test/link/tenis-runner",
"memberProductUrl": "",
"returnUrl": "",
"shopUrl": "loja.example.test",
"referrerLink": "https://www.instagram.com/"
},
"recoveryUrl": "https://checkout.example.test/recovery/eyJhbGciOiJIUzI1NiJ9.eyJvcmRlcklkIjoiY202cDJhMWIzMDAwMWxzMDhkNGY3aDlreiJ9",
"createdAt": "2026-10-15T12:00:00.000Z",
"updatedAt": "2026-10-15T12:08:00.000Z"
}Todos os campos enviados no webhook. Os objetos e as listas abrem para mostrar os campos de dentro.
Identificador do pedido. Use para ignorar uma eventual repetição da notificação.
Soma dos produtos do carrinho (preço × quantidade) com o frete, em centavos, antes dos cupons.
Desconto dos cupons aplicados, em centavos. Inclui o valor do frete quando há cupom de frete grátis. O valor que o comprador pagaria é amount - discount.
Moeda do pedido, como BRL.
Status do pedido. Neste webhook vem PENDING, porque o pedido ainda não tem pagamento.
Número de parcelas. Sem pagamento, vem 1.
Dados do comprador. Sempre vem, porque o webhook só é enviado depois que o comprador preencheu os dados de contato.
Nome completo.
E-mail.
CPF ou CNPJ, só com números. Pode vir nulo quando a loja não exige, como fora do Brasil.
Telefone com DDI, como +5511999999999. Pode vir nulo.
Itens do carrinho.
Nome do produto.
Quantidade.
Valor unitário, em centavos.
Tipo do produto: DIGITAL ou PHYSICAL.
Cupons aplicados ao pedido. Lista vazia quando nenhum cupom foi usado.
Código do cupom.
Tipo do cupom: BY_ORDER (desconto no pedido), BY_PRODUCT (desconto em produto), BXGY (compre X, leve Y) ou FREE_SHIPPING (frete grátis).
Desconto percentual, em centésimos: 1000 = 10%. Nulo quando o cupom não tem desconto percentual.
Desconto fixo, em centavos. Nulo quando o cupom não tem desconto fixo.
Frete e endereço de entrega. Nulo quando o pedido não tem entrega, como em produto digital.
Valor do frete, em centavos. Vem 0 enquanto o comprador não escolheu o frete: quem indica isso é o type nulo.
Modalidade escolhida: PAC, SEDEX, MINI_ENVIOS, JADLOG, LOGGI, TOTAL_EXPRESS, IMILE ou JT_EXPRESS. Nulo enquanto o comprador não escolheu o frete.
Endereço de entrega. Campo que o comprador ainda não preencheu vem nulo.
CEP ou código postal.
País, como BR.
Estado (UF).
Cidade.
Bairro.
Logradouro.
Complemento.
Número.
Parâmetros de origem com que o comprador chegou ao checkout. O que não veio na URL vem nulo.
Valor de utm_source.
Valor de utm_medium.
Valor de utm_campaign.
Valor de utm_content.
Valor de utm_term.
Valor de src.
Valor de sck.
Dados de origem do pedido. Pode vir nulo.
Origem do checkout que criou o pedido.
Página do checkout.
Página do produto na área de membros, quando houver.
Página para onde o comprador volta depois de pagar, quando houver.
Domínio da loja integrada, como Shopify ou WooCommerce. Só vem em pedido de loja integrada.
De onde o comprador veio antes de chegar ao checkout.
Link de volta para o checkout com os itens já montados, para reengajar o comprador por e-mail, WhatsApp ou SMS. Pode vir nulo quando o pedido não tem link de recuperação.
Data de criação do pedido, em ISO 8601 e UTC.
Data da última atualização do pedido, em ISO 8601 e UTC.