---
title: "Como configurar Webhook"
description: "Um Webhook é essencial para integrar sistemas em tempo real, permitindo que eventos sejam acionados automaticamente e comunicados entre plataformas, garantindo agilidade e precisão nos processos."
url: https://ajuda.zouti.com.br/pt-br/articles/9740997-como-configurar-webhook
collection: "Quero integrar e automatizar"
updated: 2026-07-14
language: pt-br
---

# Como configurar Webhook

Um Webhook é essencial para integrar sistemas em tempo real, permitindo que eventos sejam acionados automaticamente e comunicados entre plataformas, garantindo agilidade e precisão nos processos.

### **Qual a função do Webhook?**

Um Webhook é uma forma de a Zouti **enviar notificações automáticas em tempo real** para um sistema externo sempre que algo acontece na sua conta — uma venda, um pagamento, uma assinatura, um carrinho abandonado, etc. Em vez de você consultar a Zouti manualmente, a Zouti faz uma requisição `HTTP POST` para a URL que você configurar, com os dados do evento no corpo. Serve para integrar a Zouti com CRMs, ERPs, áreas de membros, ferramentas de automação e qualquer sistema próprio

### **Como configurar (passo a passo):**

1\. No painel, acesse o menu **Integrações**

![](https://staticfiles.gleap.io/gattachments/ilQvOzK9AHimKqu12IMZh41KU7Bfek5WGMzndw4XWAJUMrD0qF5o9OQv1gJ9Fpx3lFTJUXX4efl.png)

2\. Localize o card **Webhooks** (categoria "Plataforma externa") e clique em **Acessar**

![](https://staticfiles.gleap.io/gattachments/jDKmNoqaYf15YRI6GllzCZYDcTZSbK7a6HhcimNz4eh2Vc63jY4NdsVExtGxM7fRXvWDY6KX6Vv.png)

3\. Clique em **Criar Webhook**

4\. Preencha os campos:

\- **Nome do Webhook** — um nome para você identificar a integração

\- **URL** — o endereço de destino. O prefixo `https://` é adicionado automaticamente

(somente HTTPS é aceito)

\- **Seleção de produtos (opcional)** — se nenhum produto for selecionado, o webhook

dispara para **todos os produtos** da conta; se selecionar produtos específicos, só

dispara para eles

\- **Seleção de eventos** — marque quais eventos devem disparar o webhook

5\. Clique em **Criar Webhook** para finalizar

6\. Gerencie os webhooks pela listagem (nome, URL, status Ativo/Inativo, data de criação,

editar, testar e excluir)

* * *

### Catálogo completo de eventos (26)

Os eventos abaixo são exatamente os que aparecem para o cliente na tela de criação/edição

do webhook, na ordem em que são exibidos. O **"Evento técnico"** é o valor enviado no

cabeçalho `x-zouti-event-type` e que identifica o evento na integração.

**Pedidos:**

<table data-id="a0f0277c-3e48-43b1-bd87-6fc0b9ae2da7" style="min-width: 261px;"><colgroup><col style="min-width: 25px;"><col style="width: 186px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="2982ff8a-75c0-4a01-b031-b5339d877dea">Evento (como aparece no painel)</p></td><td colspan="1" rowspan="1"><p data-id="a8fe20c6-605f-4f62-a7a3-3209766504d2">Evento técnico</p></td><td colspan="1" rowspan="1"><p data-id="2e3c7dff-228e-4be0-bbf2-99c4be071d0e">Objeto enviado</p></td><td colspan="1" rowspan="1"><p data-id="d3b05a82-2e65-4991-be90-9a5eff5ee5bf">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="97ed2cc0-5c44-4652-b5da-f10ac1b8ecc7" style="text-align: left;">Carrinho abandonado</p></td><td colspan="1" rowspan="1"><p data-id="d9051fa5-e95d-4177-bc2f-d719e956525a" style="text-align: left;"><code>ABANDONED_CART_CREATED</code></p></td><td colspan="1" rowspan="1"><p data-id="9b150752-9cd0-4d0b-ab7e-273f587b2dd7">AbandonedCart</p></td><td colspan="1" rowspan="1"><p data-id="4432a249-747d-4943-8851-105e7ca17cd7">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0f6751fd-2b51-467c-936c-91ca748d6269" style="text-align: left;">Pedido criado</p></td><td colspan="1" rowspan="1"><p data-id="bace591e-63e9-42f3-9b0a-ee513ef479f3" style="text-align: left;"><code>ORDER_CREATED</code></p></td><td colspan="1" rowspan="1"><p data-id="6d93fc3a-fee0-46d3-96bf-fcf5db5798ef"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="62abda1c-2d03-4db9-a99c-7e301acac273">Um novo pedido é registrado</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a1d57ec6-3a0a-4341-9d83-a763eeb4ec91" style="text-align: left;">Pedido atualizado</p></td><td colspan="1" rowspan="1"><p data-id="6985e214-3b25-44d8-bd56-bf4eecfb2a2f" style="text-align: left;"><code>ORDER_UPDATED</code></p></td><td colspan="1" rowspan="1"><p data-id="b23b846f-e0e6-4aa9-b765-a4fba42fcc60"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="b85065ff-c2bf-4a66-8153-ac8236f73c8a">Um pedido existente sofre alteração</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3af6ad8b-d789-4731-8160-a1617b3f1b77" style="text-align: left;">Pedido pago</p></td><td colspan="1" rowspan="1"><p data-id="09a592d9-6138-412b-bde5-92cd3e2f14f6" style="text-align: left;"><code>ORDER_PAID</code></p></td><td colspan="1" rowspan="1"><p data-id="0f3fdf77-0108-45c7-9a37-04c3ba2281fa"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="0edb6aa5-9f88-453b-993f-bd454c2cf6aa">O pagamento do pedido é confirmado</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="568b595c-b19c-4be2-b520-8223fb7d7ca0">Pedido estornado</p></td><td colspan="1" rowspan="1"><p data-id="107b82bc-e740-46ea-917e-c28dc8491ff4"><code>ORDER_REFUNDED</code></p></td><td colspan="1" rowspan="1"><p data-id="168afe7c-b04c-4285-8df2-ee18856fd130"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="77c61fdd-d95c-4494-93fd-10d4b8583512">O pedido é reembolsado (status <code>REFUNDED</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="83511734-f71c-484a-8bd4-994b04f98c9d">Pedido em chargeback</p></td><td colspan="1" rowspan="1"><p data-id="952519dc-8715-4c98-bf78-da98e4ebe0b3"><code>ORDER_DISPUTED</code></p></td><td colspan="1" rowspan="1"><p data-id="cfde23a9-6d60-4b7a-beae-d5c44c81b8f4"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="e9cf169f-fea4-4b2f-960b-2f462f5808e4">Há uma contestação/chargeback (status <code>DISPUTED</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d8b6858d-0c67-439b-a140-e72042856818">Pedido cancelado</p></td><td colspan="1" rowspan="1"><p data-id="ff96d8ee-0757-40b0-867b-46300fedcbe7"><code>ORDER_CANCELED</code></p></td><td colspan="1" rowspan="1"><p data-id="fd690f72-62f2-4a6c-ba32-96e6afbb85c2"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="9ef8e591-5a6e-4e63-95b1-c12599c971e5">O pedido é cancelado</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6590d355-8863-4008-8c3a-75aa310d9f3c">Pedido não pago</p></td><td colspan="1" rowspan="1"><p data-id="bf108565-e08a-4eec-9498-b8c5f250c1ea"><code>ORDER_UNPAID</code></p></td><td colspan="1" rowspan="1"><p data-id="55d2e595-dc30-4b68-95c2-09ec95492843"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="3a9f6396-aafa-4a16-8c91-fa034347ffef">O pedido não foi pago (ex.: PIX/boleto expirado)</p></td></tr></tbody></table>

**Pagamentos (PIX e Boleto):**

<table data-id="411fa86b-1860-40a6-ae4e-1872c92bc3b6" style="min-width: 261px;"><colgroup><col style="min-width: 25px;"><col style="width: 186px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="331d4a8b-69e9-4f5e-8fc9-060e582da144">Evento (como aparece no painel)</p></td><td colspan="1" rowspan="1"><p data-id="4caffbaf-e167-4944-8b1a-eadb3d215b35">Evento técnico</p></td><td colspan="1" rowspan="1"><p data-id="4cfe2c57-eace-4206-84e3-0284c9ab6d75">Objeto enviado</p></td><td colspan="1" rowspan="1"><p data-id="bcd5fa96-f4d1-4ff2-8ef2-21f3e0c7c2df">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5dde6be6-b5bd-4db9-a8e7-0773ec6c1baf">Pix criado</p></td><td colspan="1" rowspan="1"><p data-id="8a81c7fe-d5e4-4bfe-9523-4f2eb0fac75d"><code>PIX_CREATED</code></p></td><td colspan="1" rowspan="1"><p data-id="7b7e470b-3f1d-4fc6-83cd-b68d8c80ca48"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="48f48200-e460-4701-af86-3aded2190e13">Um pagamento via PIX é gerado (aguardando pagamento) — inclui <code>payment.pix.code</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8cd0701e-0194-4cf6-9f44-2968c25cbd50">Boleto criado</p></td><td colspan="1" rowspan="1"><p data-id="b5e26925-dea0-4da1-ac28-83f5f64379df"><code>BOLETO_CREATED</code></p></td><td colspan="1" rowspan="1"><p data-id="1d7552e9-d862-44d0-891a-a41453b63f45"><code>Order</code></p></td><td colspan="1" rowspan="1"><p data-id="00531942-4d0a-44a8-afcb-f42fa3bc091e">Um boleto é gerado (aguardando pagamento) — inclui <code>payment.boleto.number</code></p></td></tr></tbody></table>

**Assinaturas:**

<table data-id="b1ddd35a-8b8c-4769-a9db-e1f6ad7a0953" style="min-width: 355px;"><colgroup><col style="min-width: 25px;"><col style="width: 186px;"><col style="width: 119px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="a4445a4f-de00-4ee6-965c-7f3087913b6f">Evento (como aparece no painel)</p></td><td colspan="1" rowspan="1"><p data-id="d901e12f-ccdb-4224-be77-8233420ba951">Evento técnico</p></td><td colspan="1" rowspan="1"><p data-id="c8b9484e-ce54-41ee-8fb6-1c186940200f">Objeto enviado</p></td><td colspan="1" rowspan="1"><p data-id="cbda8114-2a59-44cf-a219-24fbba3b3d5b">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="487b2daa-d3f5-4cc1-a219-e3f558df5f17">Assinatura criada</p></td><td colspan="1" rowspan="1"><p data-id="8164a6d0-3e19-4dfa-ba8d-74ae60a6dee7"><code>SUBSCRIPTION_CREATED</code></p></td><td colspan="1" rowspan="1"><p data-id="a15b3216-5a96-484e-8c4f-889c5ff2a1e2"><code>Subscription</code></p></td><td colspan="1" rowspan="1"><p data-id="47981288-cf1a-4492-a7b3-8a401a90f376">Nova assinatura registrada (status <code>INCOMPLETE</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0fc0f2a7-8b53-43cd-9220-0194ba1f6aad">Assinatura ativada</p></td><td colspan="1" rowspan="1"><p data-id="95c767ee-a70d-42f4-9c25-a7f32ce85f9f"><code>UBSCRIPTION_ACTIVATED</code></p></td><td colspan="1" rowspan="1"><p data-id="e00febe3-bd7d-4037-a17c-16799fc87c9b"><code>Subscription</code></p></td><td colspan="1" rowspan="1"><p data-id="b86643ed-74df-49bd-acd4-b4086191f922">Assinatura ativada (status <code>ACTIVE</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="4a7057ff-fba0-405c-b202-f09d2652e445">Assinatura renovada</p></td><td colspan="1" rowspan="1"><p data-id="f2af608f-ca0a-4e0b-9de3-bc334c28eb3d"><code>SUBSCRIPTION_RENEWED</code></p></td><td colspan="1" rowspan="1"><p data-id="bd6a0022-10a0-4a30-9848-1cda53101dce"><code>Subscription</code></p></td><td colspan="1" rowspan="1"><p data-id="356dfd08-15f2-4871-af60-63b4873ce74b">Assinatura renovada com sucesso</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b672f668-064f-4be5-b474-39c80d0b20c3">Assinatura cancelada</p></td><td colspan="1" rowspan="1"><p data-id="b133042a-b594-416a-9293-91752cf4e5e2"><code>SUBSCRIPTION_CANCELED</code></p></td><td colspan="1" rowspan="1"><p data-id="ca52fdfb-4a19-4f1e-8890-718acded9351"><code>Subscription</code></p></td><td colspan="1" rowspan="1"><p data-id="1df1b7e6-c850-4ca5-97c3-54b21979098b">Assinatura cancelada (status <code>CANCELED</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c42fffa3-67e3-4ae5-96f8-811b96189c09">Assinatura atrasada</p></td><td colspan="1" rowspan="1"><p data-id="baf45947-8071-43dd-836c-d2a5e3dcbf1f"><code>SUBSCRIPTION_LATE_RENEWAL_WARNING</code></p></td><td colspan="1" rowspan="1"><p data-id="4073ac5a-b0dc-4947-b08e-e3343b8b9c95"><code>Subscription</code></p></td><td colspan="1" rowspan="1"><p data-id="8871d5fd-47ff-474c-b874-116340353174">A renovação da assinatura está atrasada</p></td></tr></tbody></table>

**Parcelamento Inteligente:**

<table data-id="5b560c88-60d7-4448-be65-1faa5356fe70" style="min-width: 355px;"><colgroup><col style="min-width: 25px;"><col style="width: 186px;"><col style="width: 119px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="e39266da-89aa-4fb1-9840-b9a4b0d57b2f">Evento (como aparece no painel)</p></td><td colspan="1" rowspan="1"><p data-id="8c939dc1-04c3-4871-966e-cd19dfabe517">Evento técnico</p></td><td colspan="1" rowspan="1"><p data-id="055c5076-a236-4e7d-a84b-572b36baf76f">Objeto enviado</p></td><td colspan="1" rowspan="1"><p data-id="d27817e1-e399-4c62-bcd2-0f058bb92eb7">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2abdace4-3042-4f43-b92d-bc41dcda6745">Parcelamento inteligente pago</p></td><td colspan="1" rowspan="1"><p data-id="4cace0f1-c8d2-4bd9-a94c-f7b24e06f9d0"><code>SMART_INSTALLMENT_PAID</code></p></td><td colspan="1" rowspan="1"><p data-id="37148ebd-b2f0-478e-996c-68c5f4f7d947"><code>SmartInstallment</code></p></td><td colspan="1" rowspan="1"><p data-id="415b850d-08a9-4e8a-9739-aa628397dffc">Uma parcela do parcelamento inteligente é paga</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f53bcc9c-9860-4fcc-8579-a028cdd666b0">Parcelamento inteligente atrasado</p></td><td colspan="1" rowspan="1"><p data-id="2fbf55eb-7d42-4fbb-96c5-432986a2e5dd"><code>SMART_INSTALLMENT_LATE_RENEWAL</code></p></td><td colspan="1" rowspan="1"><p data-id="3eea4556-2974-4ebe-b27d-ec95c4d3003e"><code>SmartInstallment</code></p></td><td colspan="1" rowspan="1"><p data-id="e7914fd5-46a0-4f29-a0cb-b5e1093d6cf8">Uma parcela está atrasada (cobrança falhou)</p></td></tr></tbody></table>

**Cobranças:**

<table data-id="cdaf64d8-b02c-4bb6-aeb7-30500e6894b3" style="min-width: 489px;"><colgroup><col style="width: 159px;"><col style="width: 186px;"><col style="width: 119px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="82f92cb8-9f1d-4632-9946-1a20f9c1913f">Evento (como aparece no painel)</p></td><td colspan="1" rowspan="1"><p data-id="5e6ef30d-9610-4db2-ac73-85b67003a5f3">Evento técnico</p></td><td colspan="1" rowspan="1"><p data-id="1c0c26c4-5204-4a71-9968-a82c325604fb">Objeto enviado</p></td><td colspan="1" rowspan="1"><p data-id="01f3b538-1074-4c84-a7df-239e154903b2">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e8c7317b-219f-4cbd-a829-1ce48d6d5a4b">Cobrança Pendente</p></td><td colspan="1" rowspan="1"><p data-id="44086321-2551-4617-b6a3-47a561adb711"><code>PAYMENT_PENDING</code></p></td><td colspan="1" rowspan="1"><p data-id="9b2c871c-3ab2-4935-bf6d-da31ce8b5fe9"><code>Payment</code></p></td><td colspan="1" rowspan="1"><p data-id="a97141ab-e76b-4fd9-8c85-833477b8c7a4">Uma cobrança está aguardando pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="83b75746-9b37-4fea-85ec-1f7324388f11">Cobrança Aprovada</p></td><td colspan="1" rowspan="1"><p data-id="896940cb-1e20-48e8-a0e2-7c25a95eea97"><code>PAYMENT_PAID</code></p></td><td colspan="1" rowspan="1"><p data-id="b0e7a82a-88ea-4453-bee4-9bb4beeb9e0b"><code>Payment</code></p></td><td colspan="1" rowspan="1"><p data-id="7f467fd1-3f7f-4651-a977-a692cfa36e18">Uma cobrança é confirmada</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8ad3e3e0-9b37-4a86-b232-525f2781fcd9">Cobrança Reembolsada</p></td><td colspan="1" rowspan="1"><p data-id="3db4da38-b378-4633-9f9a-192effed9107"><code>PAYMENT_REFUNDED</code></p></td><td colspan="1" rowspan="1"><p data-id="3c286fda-cd52-4af2-bacf-4c8cd55637e0"><code>Payment</code></p></td><td colspan="1" rowspan="1"><p data-id="ba4ae01f-757b-4c50-a18c-bf629fc057a1">Uma cobrança é reembolsada</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f10c1dc5-7acf-40b7-acae-5a06c982db8c">Cobrança Contestada</p></td><td colspan="1" rowspan="1"><p data-id="ebdbaf18-db49-4f33-9f7b-e88589f6c6d1"><code>PAYMENT_DISPUTED</code></p></td><td colspan="1" rowspan="1"><p data-id="c01fe54a-55ac-4a24-8733-93db4c6d67cd"><code>Payment</code></p></td><td colspan="1" rowspan="1"><p data-id="e39c560a-3b72-4e12-9f98-d243323ce97f">Uma cobrança é contestada pelo cliente</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ba86643a-7095-4479-8089-e0a04d4250fd">Cobrança Expirada</p></td><td colspan="1" rowspan="1"><p data-id="c3e060a7-8548-4ccc-96c6-fa7b3b7dc370"><code>PAYMENT_UNPAID</code></p></td><td colspan="1" rowspan="1"><p data-id="2cb45ebf-57cc-481c-84f6-3ed4d3b83f25"><code>Payment</code></p></td><td colspan="1" rowspan="1"><p data-id="fa16be58-2b8e-48f7-a664-bee1a5712c42">Uma cobrança expira sem pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0acdb2f0-1816-4c72-9f2e-67b1932ffaea">Cobrança Recusada</p></td><td colspan="1" rowspan="1"><p data-id="d1daa1bb-583e-4dda-8af1-b4162e177889"><code>PAYMENT_DECLINED</code></p></td><td colspan="1" rowspan="1"><p data-id="b11aaabb-6a38-42a5-bd5c-d46450f1f3ed"><code>Payment</code></p></td><td colspan="1" rowspan="1"><p data-id="e48ca4bb-1e9c-4c22-a8bd-447fad24a5f9">Uma cobrança é recusada</p></td></tr></tbody></table>

**Solicitações de reembolso?**

<table data-id="38c99fd6-c58f-4a7d-a698-09abf9fe417b" style="min-width: 355px;"><colgroup><col style="min-width: 25px;"><col style="width: 186px;"><col style="width: 119px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="0f027c39-1a7d-4f43-87c8-56a6b5784e4c">Evento (como aparece no painel)</p></td><td colspan="1" rowspan="1"><p data-id="0a89e6cd-869f-4461-9e95-cf88768f029c">Evento técnico</p></td><td colspan="1" rowspan="1"><p data-id="a1d993e3-7ff1-47b6-a942-1edaa4f487a1">Objeto enviado</p></td><td colspan="1" rowspan="1"><p data-id="69a99ea4-203d-4091-bedf-b960b52f9c53">Cliente iniciou o checkout mas não concluiu o pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a8135e00-bffa-412d-921a-591adf1691d0">Solicitação de reembolso criada</p></td><td colspan="1" rowspan="1"><p data-id="2870d5d1-dd36-43bf-a0c9-d2542e5bcfd8"><code>REFUND_REQUEST_CREATED</code></p></td><td colspan="1" rowspan="1"><p data-id="411b704b-c2ee-4c34-ac7d-ce7c75db4da9"><code>RefundRequest</code></p></td><td colspan="1" rowspan="1"><p data-id="2a3cdbf1-6bae-4848-b6e0-7ee428827201">O cliente solicita um reembolso</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a4611135-7ea2-4e47-9a52-73788f7529c0">Solicitação de reembolso aprovada</p></td><td colspan="1" rowspan="1"><p data-id="dbce18a8-fbe0-4ecd-b178-7fed3ec5c9c4"><code>REFUND_REQUEST_APPROVED</code></p></td><td colspan="1" rowspan="1"><p data-id="37a17c6e-c05e-4aa4-b89e-4972a66a71a9"><code>RefundRequest</code></p></td><td colspan="1" rowspan="1"><p data-id="55a0be19-a353-4849-a42d-82d7b952716a">A solicitação de reembolso é aprovada</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="47e7d6fe-1fb5-4744-aa6b-d052c8454986">Solicitação de reembolso recusada</p></td><td colspan="1" rowspan="1"><p data-id="d2685fa6-41c0-4569-a917-8cb9578ace88"><code>REFUND_REQUEST_REFUSED</code></p></td><td colspan="1" rowspan="1"><p data-id="00e17a1e-1f15-4848-b968-8a27fbe3df91"><code>RefundRequest</code></p></td><td colspan="1" rowspan="1"><p data-id="ecfb4b34-c046-4085-8af0-7d828c76d17f">A solicitação de reembolso é recusada</p></td></tr></tbody></table>

**Observação de status**

-   **Order.status:** `AWAITING_PAYMENT`, `PAID`, `UNPAID`, `REFUNDED`, `DISPUTED`, `CANCELED`
    
-   **Payment.status:** `PENDING`, `PAID`, `REFUNDED`, `PARTIALLY_REFUNDED`, `DISPUTED`, `UNPAID`, `DECLINED`
    
-   **Subscription.status:** `INCOMPLETE`, `ACTIVE`, `CANCELED`, `TRIAL`, `PAST_DUE`
    
-   **Métodos de pagamento:** Cartão de crédito `CREDIT_CARD`), PIX `PIX`), Boleto `BOLETO`)
    
-   **RefundRequest.status:** `PENDING`, `APPROVED`, `REFUSED`
    

**Diferença entre** `ORDER_*` **e** `PAYMENT_*`

o **Pedido** `Order`) é a compra do ponto de vista comercial (itens, cliente, valor total); a **Cobrança** `Payment`) é a transação financeira em si. Um mesmo pedido pode ter mais de uma cobrança (ex.: pagamento dividido / _split payment_, ou uma nova tentativa de cobrança). Use os eventos `PAYMENT_*` quando precisar acompanhar o **fluxo financeiro** transação a transação; use `ORDER_*` quando o foco for o **pedido/venda**

* * *

### Carrinho abandonado — como funciona

Um **carrinho abandonado** é gerado quando um cliente **inicia o checkout, não conclui o**

**pagamento e a sessão de checkout expira**. Nesse momento a Zouti dispara o evento

`ABANDONED_CART_CREATED` (objeto `AbandonedCart`).

**Quando o evento é (e não é) disparado:**

O carrinho abandonado **só é criado** — e o webhook só dispara — se:

-   A sessão de checkout **expirou** sem o pagamento ter sido concluído; **e**
    
-   O cliente informou um **e-mail** durante o checkout.
    

O evento **NÃO é disparado** quando:

-   O checkout **não capturou o e-mail** do cliente (sem e-mail não há como criar o carrinho/remarketing);
    
-   Já existe um **pedido pago** para o mesmo e-mail + oferta nas últimas 24 horas (o cliente já comprou);
    
-   Já existe um **carrinho abandonado ativo** para o mesmo e-mail + oferta (evita duplicatas).
    

* * *

**Etapas do carrinho( Step):**

<table data-id="eb3f9641-9b6e-42d5-b0a8-97f019f363f4" style="width: 756px;"><colgroup><col style="width: 372px;"><col style="width: 384px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="7f459841-430a-479e-bf7c-eacd4b78dd33">Step</p></td><td colspan="1" rowspan="1"><p data-id="780177ff-b5cd-46fc-943e-9ef38b723a37">Significado</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6e5b4b06-1b10-4520-b46a-4e2305034535"><code>PERSONAL_DATA</code></p></td><td colspan="1" rowspan="1"><p data-id="57f4a6ae-7246-4797-9e73-2abc41182614">Cliente preencheu apenas os dados pessoais</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="59bc0409-7859-4e21-a7d9-8ac75dde8eae"><code>SHIPPING</code></p></td><td colspan="1" rowspan="1"><p data-id="8b97a519-2515-4dee-b6ae-c216311e1033">Cliente avançou até a etapa de frete/entrega (produto físico)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="93aaf25a-2cc2-4dc8-80ff-9857513e5b0c"><code>PAYMENT</code></p></td><td colspan="1" rowspan="1"><p data-id="9d9ed44e-69b6-4a50-986f-5ca4473affd0">Cliente chegou à etapa de pagamento</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="99d0b087-1f9e-4df1-9d7f-d211fc87aba1"><code>AWAITING_PAYMENT</code></p></td><td colspan="1" rowspan="1"><p data-id="2b73c278-587e-47ff-bd3c-ab53bdff2e42">Cliente gerou um PIX e não pagou (aguardando pagamento)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3039766e-855c-458f-91f4-39d075bbcb4c"><code>REFUSED</code></p></td><td colspan="1" rowspan="1"><p data-id="e99bc832-7099-4c15-a815-e0eda1a1d334">O pagamento do cliente foi recusado</p></td></tr></tbody></table>

**Observação técnica:** na busca/filtragem, `PAYMENT` e `AWAITING_PAYMENT` são tratados como o mesmo grupo de "etapa de pagamento".

O payload completo de exemplo do objeto `AbandonedCart` está no apêndice técnico.

* * *

### Como testar um webhook

A plataforma tem a função **Testar Webhook**, que envia um disparo de exemplo sem criar dados reais:

1\. Na listagem de webhooks, clique em **Testar Webhook**

2\. Escolha qual webhook deseja testar

3\. Escolha o evento a simular (só aparecem os eventos configurados naquele webhook)

4\. Clique em **Enviar webhook teste.** O disparo de teste é assinado com o mesmo segredo do webhook, ou seja, seu servidor valida exatamente como uma entrega real.

O disparo de teste é assinado com o mesmo segredo do webhook, ou seja, seu servidor valida exatamente como uma entrega real. Cada tipo de evento envia um exemplo do objeto correspondente (Pedido, Cobrança, Assinatura, etc.).

* * *

**Inativação automática e reativação**

-   Um webhook é **inativado automaticamente após 10 falhas consecutivas** de conexão.
    
-   O motivo fica registrado como `CONSECUTIVE_FAILURES`.
    
-   Quando isso acontece, um ícone de alerta aparece na listagem com a explicação.
    
-   O cliente pode **reativar manualmente** o webhook depois de corrigir o destino.
    
-   Webhooks também podem ser ativados/inativados manualmente pelo switch da listagem.
    
-   Webhook inativado **não recebe disparos**.
    

* * *

**Política de retentativa (retry)**

Apenas respostas **HTTP 2xx** são consideradas sucesso.

-   O servidor de destino deve responder em até **30 segundos** (timeout).
    
-   Em caso de falha, a Zouti **retenta automaticamente** com backoff exponencial(intervalo crescente entre tentativas, com no máximo ~12h entre uma e outra).
    
-   As retentativas continuam por até **4 dias** após o evento original. Depois disso a entrega é descartada.
    

* * *

### Apêndice técnico — para desenvolvedores

**Cabeçalhos enviados em cada disparo:**

```javascript
content-type: application/json
user-agent: Zouti-Webhook/1.0
x-zouti-webhook-id: web_xxx
x-zouti-webhook-delivery-id: webd_xxx
x-zouti-object-id: ord_xxx        (ID do objeto — pedido, assinatura, etc.)
x-zouti-object-name: Order        (tipo do objeto: Order | Subscription | AbandonedCart | Payment | SmartInstallment | RefundRequest)
x-zouti-event-id: evt_xxx
x-zouti-event-type: ORDER_PAID    (o evento técnico da tabela acima)
x-zouti-signature: t=1717000000000,v1=<hmac_sha256>
```

Nos eventos de **Cobrança** `PAYMENT_*`), `x-zouti-object-name` é `Payment` e `x-zouti-object-id` é o ID da cobrança `pmt_xxx`).

**Verificação de assinatura:**

Cada disparo vem assinado por **HMAC-SHA256** usando o segredo do webhook. O formato é:

```javascript
[
t=<timestamp_em_ms>,v1=<hash_hex>


Onde `v1` é o HMAC-SHA256 do **corpo bruto** (raw body) da requisição usando o segredo
como chave. Exemplo de verificação em Node.js:

 javascript
const crypto = require('crypto');

function verifyWebhookSignature(rawBody, signatureHeader, secret) {
  const [tPart, v1Part] = signatureHeader.split(',');
  const receivedHash = v1Part.split('=')[1];

  const expectedHash = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(receivedHash),
    Buffer.from(expectedHash),
  );
}
```

\> **Dica:** valide sempre o corpo **bruto** (antes de qualquer parse/JSON),caso contrário o hash não confere. O segredo pode ser rotacionado pelo painel; após arotação há um período de carência em que a assinatura antiga ainda é aceita.

* * *

**Valores monetários:**

Todos os valores vêm em **centavos** (ex.: `amount: 9790`) e também com a versão em reais

no campo correspondente `*_in_brl` (ex.: `amount_in_brl: 97.90`).

**Exceção — objeto** `Cobrança` `Payment`**):** neste objeto os valores do nível raiz `amount`, `fee`, `interest_amount`, `interest_transfer_amount`, `discount_amount`, `amount_paid`, `amount_refunded`) vêm \*\*apenas em centavos\*\*, sem o companheiro `*_in_brl`. A versão em reais aparece somente \*\*dentro de `line_items[].amount_in_brl`\*\*. O objeto `Payment` também \*\*não\*\* traz um campo `net_amount` no nível raiz.

* * *

**Exemplos de payload (corpo enviado):**

Estes são exatamente os payloads usados na função "Testar Webhook" — representam o formato real de cada tipo de objeto. Campos podem variar conforme o método de pagamento e o tipo de produto.

**Pedido** `Order`**)\*\* — eventos** `ORDER_*`**,** `PIX_CREATED`**,** `BOLETO_CREATED`**:**

````javascript
```json
{
  "id": "ord_eloz1kotrd7jtghi5oa3vl",
  "account_id": "acc_grlw5o8dp8rv2drenaio84",
  "status": "PAID",
  "payment_type": "UNIQUE",
  "customer_id": "cus_8h2k1l0trd7jtghi5oa3vl",
  "provider": "ZOUTI",
  "order_session_id": "os_3n9x1k0trd7jtghi5oa3vl",
  "checkout_id": "chk_5k2j1h0trd7jtghi5oa3vl",
  "is_split_payment": false,
  "amount_subtotal": 11970,
  "amount_subtotal_in_brl": 119.7,
  "amount_total": 11970,
  "amount_total_in_brl": 119.7,
  "currency": "BRL",
  "paid_at": "2024-12-16T19:50:17.044Z",
  "items": [
    {
      "amount": 11970,
      "amount_in_brl": 119.7,
      "full_amount": 11970,
      "full_amount_in_brl": 119.7,
      "description": "Curso completo de Desenvolvimento Web Full Stack",
      "image_url": "https://zouti-core-media-public.s3.amazonaws.com/media/accounts/acc_grlw5o8dp8rv2drenaio84/products/images/icon.jpg",
      "name": "Curso de Desenvolvimento Web",
      "product_id": "prod_eji9ptlqrlqk35etn3zfyi",
      "quantity": 1,
      "type": "SKU"
    }
  ],
  "customer": {
    "document": "12345678909",
    "email": "maria.silva@email.com",
    "name": "Maria Silva",
    "phone": "5511987654321"
  },
  "payment": {
    "method": "CREDIT_CARD",
    "status": "PAID",
    "amount": 11970,
    "amount_in_brl": 119.7,
    "fee": 390,
    "fee_in_brl": 3.9,
    "net_amount": 11100,
    "net_amount_in_brl": 111.0,
    "interest_amount": 970,
    "interest_amount_in_brl": 9.7,
    "interest_transfer_amount": 480,
    "interest_transfer_amount_in_brl": 4.8,
    "discount_amount": 500,
    "discount_amount_in_brl": 5.0,
    "amount_refunded": 0,
    "installments": 12
  },
  "utm_data": {
    "utm_campaign": "black_friday_2024",
    "utm_source": "google",
    "utm_medium": "cpc",
    "utm_content": "banner_promocional",
    "utm_term": "curso programacao"
  },
  "shipping_address": {
    "id": "adr_2n8x1k0trd7jtghi5oa3vl",
    "line1": "Av. Paulista, 1578",
    "line2": "Apto 502",
    "line3": "Bloco B",
    "neighborhood": "Bela Vista",
    "city": "São Paulo",
    "state": "SP",
    "country": "Brasil",
    "postal_code": "01310200"
  },
  "created_at": "2024-12-16T19:50:17.044Z",
  "updated_at": "2024-12-16T19:50:17.044Z"
}
````

Detalhes do objeto `Order`:

`is_split_payment` está **sempre presente**; quando `true`, o objeto também traz

`split_payments[]` com o rateio.

Em \*`PIX_CREATED`\*\* o `payment` traz `"pix": { "code": "00020126..." }` e o pedido fica com `status: "AWAITING_PAYMENT"`. Em \*`BOLETO_CREATED`\*\*, traz `"boleto": { "number": "34191..." }`.

`shipping_address` só vem em produto físico.

O objeto `customer` do pedido traz `name`, `email`, `phone` e `document` (\*\*não\*\* traz `instagram`).

* * *

**Cobrança** `Payment`**)\*\* — eventos** `PAYMENT_PENDING`**,** `PAYMENT_PAID`**,** `PAYMENT_REFUNDED`**,** `PAYMENT_DISPUTED`**,** `PAYMENT_UNPAID`**,** `PAYMENT_DECLINED`**:**

````javascript

```json
{
  "id": "pmt_eloz1kotrd7jtghi5oa3vl",
  "status": "PAID",
  "method": "CREDIT_CARD",
  "decline_reason": "Não autorizado pelo emissor",
  "failure_reason": "GENERIC_DECLINE",
  "installments": 12,
  "order_id": "ord_eloz1kotrd7jtghi5oa3vl",
  "subscription_id": "sub_2n8x1k0trd7jtghi5oa3vl",
  "smart_installment_id": "smi_9f3x1k0trd7jtghi5oa3vl",
  "account_id": "acc_grlw5o8dp8rv2drenaio84",
  "interest_transfer_amount": 480,
  "amount": 11970,
  "interest_amount": 970,
  "fee": 390,
  "discount_amount": 500,
  "amount_paid": 11970,
  "amount_refunded": 11970,
  "refund_id": "ref_7k2j1h0trd7jtghi5oa3vl",
  "metadata": {
    "invoices": [
      {
        "invoice_id": "inv_a1b2c3d4",
        "credential_type": "ENOTAS",
        "credential_id": "cred_xyz789"
      }
    ]
  },
  "customer": {
    "name": "Maria Silva",
    "email": "maria.silva@email.com",
    "document": "12345678909",
    "phone": "5511987654321"
  },
  "splits": [
    {
      "id": "spl_1a2b3c4d",
      "percentage": "20.00",
      "amount": 2394,
      "amount_refunded": 2394,
      "invoice_mode": "PARTNER",
      "invited_account_id": "acc_partner7k2j1h0trd7jt"
    }
  ],
  "shipping_address": {
    "line1": "Av. Paulista, 1578",
    "line2": "Apto 502",
    "line3": "Bloco B",
    "neighborhood": "Bela Vista",
    "city": "São Paulo",
    "state": "SP",
    "country": "Brasil",
    "postal_code": "01310200"
  },
  "line_items": [
    {
      "name": "Curso de Desenvolvimento Web",
      "description": "Curso completo de Desenvolvimento Web Full Stack",
      "type": "SKU",
      "quantity": 1,
      "product_id": "prod_eji9ptlqrlqk35etn3zfyi",
      "amount": 11970,
      "amount_in_brl": 119.7,
      "image": "https://zouti-core-media-public.s3.amazonaws.com/media/.../icon.jpg"
    }
  ],
  "created_at": "2024-12-16T19:50:17.044Z",
  "updated_at": "2024-12-16T19:50:17.044Z",
  "paid_at": "2024-12-16T19:50:17.044Z",
  "unpaid_at": "2024-12-16T20:10:00.000Z",
  "refunded_at": "2024-12-17T10:00:00.000Z"
}
````

O objeto `Payment` mantém a **mesma estrutura** em todos os eventos `PAYMENT_*`; muda o `status` e alguns campos de data/valor:

<table data-id="1b052e59-9677-4f9a-8cb7-c4c72ff5ff21" style="min-width: 466px;"><colgroup><col style="width: 198px;"><col style="width: 243px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="5c28dda8-99ec-433f-ba8b-2f0f4801aa40">Evento</p></td><td colspan="1" rowspan="1"><p data-id="adf604f1-5e20-44f1-a312-f8e9c8d4d7a7"><code>status</code></p></td><td colspan="1" rowspan="1"><p data-id="242cfa84-4670-496e-92cb-5c91d4f9f56e">Campos que mudam</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="dbdff3f1-3060-45de-923c-0f60f6efd005"><code>PAYMENT_PENDING</code></p></td><td colspan="1" rowspan="1"><p data-id="0cb09cbd-400f-4bc7-8793-d54ca2213702"><code>PENDING</code></p></td><td colspan="1" rowspan="1"><p data-id="54347905-92c4-48ab-a14f-ac5fcef8e69d"><code>paid_at: null</code> (PIX/boleto ainda aguardando pagamento)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="18c04cd3-9758-40c2-a14d-ff5fda8dd627"><code>PAYMENT_PAID</code></p></td><td colspan="1" rowspan="1"><p data-id="c9b54357-0a82-49ac-864f-92297b4d1501"><code>PAID</code></p></td><td colspan="1" rowspan="1"><p data-id="3de8da53-4d41-4dda-af88-74098f47c140"><code>paid_at</code> preenchido; <code>amount_paid</code> = valor pago</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1cd5e0a2-e2f0-4858-8787-6873e90ee9f5"><code>PAYMENT_DECLINED</code></p></td><td colspan="1" rowspan="1"><p data-id="4971d1f5-cc18-4ca2-809e-169e55045d75"><code>DECLINED</code></p></td><td colspan="1" rowspan="1"><p data-id="9c67affc-7b55-4f3b-8b43-32c8d709e613">inclui <code>decline_reason</code> (motivo mapeado do adquirente) e, quando houver, <code>failure_reason</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a538f6db-9097-42d4-a4ca-80768a7766f4"><code>PAYMENT_UNPAID</code> |</p></td><td colspan="1" rowspan="1"><p data-id="68b90846-a1f9-4220-9f66-63e0bd5e8dd9"><code>UNPAID</code></p></td><td colspan="1" rowspan="1"><p data-id="8e7f10f2-ffe0-4b10-b6f7-a1126fa7bad5"><code>unpaid_at</code> preenchido (PIX/boleto expirado)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9a795362-bfd9-4cc5-9748-a7283c8c57d1"><code>PAYMENT_REFUNDED</code></p></td><td colspan="1" rowspan="1"><p data-id="830f93d5-737e-411a-a65c-74460d1e120b"><code>REFUNDED </code>ou <code>PARTIALLY_REFUNDED</code> |</p></td><td colspan="1" rowspan="1"><p data-id="2b909197-a8fe-4201-9742-544547365e95"><code>refunded_at</code> preenchido; <code>amount_refunded</code> &gt; 0 |</p><p data-id="1f68a978-6115-4fc2-81c8-532333fafa59"></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f3a24228-329f-478a-991f-428275f37217"><code>PAYMENT_DISPUTED</code></p></td><td colspan="1" rowspan="1"><p data-id="3bcd60cc-1a7e-4f08-87f3-a525bb8450a1"><code>DISPUTED</code></p></td><td colspan="1" rowspan="1"><p data-id="e3c7ffe6-129f-4d32-b70f-06f73a9e09f5">chargeback aberto para a cobrança</p></td></tr></tbody></table>

Detalhes do objeto `Payment`:

O exemplo acima está com **todos os campos preenchidos**. Na prática, os campos **condicionais** só aparecem no contexto certo: `decline_reasonfailure_reason` em recusa; `subscription_id` em cobrança de assinatura; `smart_installment_id` em parcela de parcelamento inteligente; `refund_id` e `refunded_at` em estorno; `paid_atunpaid_at` conforme o pagamento foi confirmado ou expirou.

`splits` traz o rateio de coprodução quando existe.

`shipping_address` só vem em produto físico.

Os valores são em **centavos**; a versão em reais aparece só em `line_items[].amount_in_brl` (veja "Valores monetários" acima).

O objeto `Payment` **não** expõe dados internos de gateway/roteamento (ex.: adquirente, subconta, dados do cartão).

* * *

**Assinatura** `Subscription`**)\*\* — eventos** `SUBSCRIPTION_*`**:**

````javascript

```json
{
  "id": "sub_2n8x1k0trd7jtghi5oa3vl",
  "account_id": "acc_grlw5o8dp8rv2drenaio84",
  "order_id": "ord_eloz1kotrd7jtghi5oa3vl",
  "status": "ACTIVE",
  "customer": {
    "id": "cus_8h2k1l0trd7jtghi5oa3vl",
    "name": "João Silva",
    "email": "joao.silva@email.com",
    "document": "11122233344",
    "phone": "5511988776655"
  },
  "plan": {
    "id": "prod_offer_plan_9f3x1k0trd7jt",
    "name": "Anual",
    "amount": 119700,
    "currency": "BRL",
    "interval": "YEARLY",
    "max_cycles": 12
  },
  "payment_method": "CREDIT_CARD",
  "current_period_start": "2025-05-01T00:00:00.000Z",
  "current_period_end": "2026-05-01T00:00:00.000Z",
  "next_payment_date": "2026-05-01T00:00:00.000Z",
  "installments": 12,
  "line_items": [
    {
      "name": "Assinatura Anual",
      "description": "Plano anual do curso",
      "type": "SKU",
      "quantity": 1,
      "product_id": "prod_eji9ptlqrlqk35etn3zfyi",
      "amount": 119700,
      "amount_in_brl": 1197.0
    }
  ],
  "cancel_at_period_end": false,
  "billing_cycle_count": 1,
  "created_at": "2025-05-01T00:00:00.000Z",
  "updated_at": "2025-05-01T00:00:00.000Z"
}
````

Detalhes do objeto `Subscription`:

`line_items[]` está **sempre presente**.

O `plan` traz `id`, `name`, `amount`, `currency`, `interval` (e, quando aplicável, `max_cyclestrial`). **Não** há `amount_in_brl` dentro de `plan`. O `plan.id` tem o prefixo `prod_offer_plan_...`.

`current_period_end`, `next_payment_date`, `canceled_at` e `installments` só aparecem quando fazem sentido para o status da assinatura.

* * *

Carrinho abandonado `AbandonedCart`)\*\* — evento `ABANDONED_CART_CREATED`:

````javascript
```json
{
  "id": "ab_c_5k2j1h0trd7jtghi5oa3vl",
  "step": "PAYMENT",
  "total_amount": 14990,
  "total_amount_in_brl": 149.9,
  "order_session_id": "os_3n9x1k0trd7jtghi5oa3vl",
  "url": "https://pay.zouti.com.br/infoproduct_cart_token/ab_c_5k2j1h0trd7jtghi5oa3vl",
  "ip_address": "179.108.44.10",
  "currency": "BRL",
  "customer": {
    "name": "Lucas Oliveira",
    "email": "lucas.oliveira@email.com",
    "document": "98765432100",
    "phone": "5511999887766",
    "instagram": "lucas.oliveira"
  },
  "metadata": {
    "theme": "ZOUTI",
    "payment_method": "CREDIT_CARD",
    "checkout_type": "INFOPRODUCT"
  },
  "items": [
    {
      "type": "SKU",
      "product_id": "prod_eji9ptlqrlqk35etn3zfyi",
      "variant_id": "var_1a2b3c4d5e",
      "name": "Curso de Desenvolvimento Web",
      "description": "Curso completo de Desenvolvimento Web",
      "amount": 14990,
      "amount_in_brl": 149.9,
      "quantity": 1,
      "image_url": "https://zouti-core-media-public.s3.amazonaws.com/media/.../icon.jpg"
    }
  ],
  "utm_data": {
    "source": "facebook",
    "medium": "social",
    "campaign": "remarketing_junho",
    "content": "story_01",
    "term": "curso web"
  },
  "account_id": "acc_grlw5o8dp8rv2drenaio84",
  "checkout_id": "chk_5k2j1h0trd7jtghi5oa3vl",
  "created_at": "2025-05-12T19:30:41.459Z",
  "updated_at": "2025-05-12T19:30:41.459Z"
}
````

Detalhes do objeto `AbandonedCart`:

O `id` tem o prefixo `ab_c_...`.

**Atenção às chaves de UTM:** neste objeto o `utm_data` usa `source`, `medium`,

`campaign`, `content`, `term` (\*\*sem\*\* o prefixo `utm_`). Já no objeto `Order` as chaves são `utm_source`, `utm_medium`, etc.

`ip_address`, `checkout_id` e `utm_data` só aparecem quando disponíveis.

`metadata.payment_method` só existe se o cliente chegou a escolher um método.

O `step` indica em que etapa o cliente parou: `PERSONAL_DATA`, `SHIPPING`, `PAYMENT`, `AWAITING_PAYMENT` ou `REFUSED`.

* * *

**Parcelamento inteligente** `SmartInstallment`**)\*\* — eventos** `SMART_INSTALLMENT_*`**:**

````javascript
```json
{
  "id": "smi_9f3x1k0trd7jtghi5oa3vl",
  "status": "PAID",
  "method": "CREDIT_CARD",
  "order_id": "ord_eloz1kotrd7jtghi5oa3vl",
  "account_id": "acc_grlw5o8dp8rv2drenaio84",
  "order_session_id": "os_3n9x1k0trd7jtghi5oa3vl",
  "amount": 9975,
  "amount_in_brl": 99.75,
  "installment_number": 1,
  "total_installments": 12,
  "payment_id": "pmt_eloz1kotrd7jtghi5oa3vl",
  "due_date": "2025-01-15T00:00:00.000Z",
  "currency": "BRL",
  "interest_amount": 0,
  "interest_amount_in_brl": 0,
  "discount_amount": 0,
  "discount_amount_in_brl": 0,
  "paid_at": "2025-01-10T10:30:00.000Z",
  "card": {
    "brand": "VISA",
    "first_digits": "411111",
    "last_digits": "1111",
    "holder_name": "João Silva"
  },
  "customer": {
    "id": "cus_8h2k1l0trd7jtghi5oa3vl",
    "name": "João Silva",
    "email": "joao.silva@email.com",
    "document": "11122233344",
    "phone": "5511988776655"
  },
  "products": [
    {
      "name": "Curso de Desenvolvimento Web",
      "amount": 9975,
      "amount_in_brl": 99.75,
      "quantity": 1,
      "product_id": "prod_eji9ptlqrlqk35etn3zfyi"
    }
  ],
  "created_at": "2025-01-01T00:00:00.000Z",
  "updated_at": "2025-01-01T00:00:00.000Z"
}
````

Detalhes do objeto `SmartInstallment`:

O `id` tem o prefixo `smi_...`.

`products[]` está **sempre presente**.

`card` inclui `first_digits` além de `last_digits`; só aparece em cartão. Para outros métodos podem vir `pixboleto`.

`paid_at` fica vazio no evento `SMART_INSTALLMENT_LATE_RENEWAL`.

* * *

**Solicitação de reembolso** `RefundRequest`**)\*\* — eventos** `REFUND_REQUEST_*`**:**

````javascript
```json
{
  "id": "rrq_5k2j1h0trd7jtghi5oa3vl",
  "account_id": "acc_grlw5o8dp8rv2drenaio84",
  "order_id": "ord_eloz1kotrd7jtghi5oa3vl",
  "payment_id": "pmt_eloz1kotrd7jtghi5oa3vl",
  "status": "APPROVED",
  "reason": "Não recebi o produto",
  "amount": 9790,
  "accepted_at": "2025-05-01T01:00:00.000Z",
  "created_at": "2025-05-01T00:00:00.000Z",
  "updated_at": "2025-05-01T01:00:00.000Z",
  "customer": {
    "id": "cus_8h2k1l0trd7jtghi5oa3vl",
    "name": "Maria Silva",
    "email": "maria.silva@email.com",
    "document": "12345678909",
    "phone": "5511987654321",
    "timezone": "America/Sao_Paulo"
  },
  "order": {
    "id": "ord_eloz1kotrd7jtghi5oa3vl",
    "status": "PAID",
    "amount_subtotal": 9790,
    "amount_total": 9790,
    "currency": "BRL",
    "paid_at": "2025-04-20T14:00:00.000Z",
    "created_at": "2025-04-20T13:55:00.000Z",
    "updated_at": "2025-04-20T14:00:00.000Z"
  },
  "payment": {
    "id": "pmt_eloz1kotrd7jtghi5oa3vl",
    "status": "PAID",
    "method": "CREDIT_CARD",
    "amount": 9790,
    "amount_paid": 9790,
    "amount_refunded": 0,
    "interest_amount": 0,
    "fee": 290,
    "installments": 1,
    "paid_at": "2025-04-20T14:00:00.000Z"
  },
  "card": {
    "id": "card_5k2j1h0trd7jtghi5oa3vl",
    "brand": "VISA",
    "last_digits": "1111",
    "holder_name": "Maria Silva",
    "type": "CREDIT",
    "category": "STANDARD",
    "country": "BR"
  },
  "products": [
    {
      "product_id": "prod_eji9ptlqrlqk35etn3zfyi",
      "name": "Curso de Desenvolvimento Web",
      "description": "Curso completo de Desenvolvimento Web Full Stack",
      "quantity": 1,
      "unit_price": 9790,
      "sub_total": 9790,
      "image_url": "https://zouti-core-media-public.s3.amazonaws.com/media/.../icon.jpg"
    }
  ]
}

````

Detalhes do objeto `RefundRequest`:

O `id` tem o prefixo `rrq_...`.

`products[]` está **sempre presente**.

`accepted_at` aparece em `REFUND_REQUEST_APPROVED`; `rejection_reason` e `failure_reason` em `REFUND_REQUEST_REFUSED`. Campos sem valor são **omitidos** do corpo.

`cardpixboleto` aparecem conforme o método de pagamento original.

* * *

### Regras de negócio

-   A URL do webhook deve usar **HTTPS** (o `https://` é adicionado automaticamente).
    
-   Se **nenhum produto** for selecionado, o webhook vale para **todos os produtos** da conta.
    
-   Cada webhook pode ter **vários eventos** associados ao mesmo tempo.
    
-   É possível ter **mais de um webhook para a mesma URL**, cada um com eventos diferentes.
    
-   Apenas respostas **HTTP 2xx** são consideradas sucesso; o destino deve responder em até **30 segundos**.
    
-   Em caso de falha de conexão/timeout/4xx, há **retentativa automática** com backoff exponencial.
    
-   Após **10 falhas consecutivas** de entrega, o webhook é **inativado automaticamente**(motivo `CONSECUTIVE_FAILURES`) e precisa ser **reativado manualmente**.
    
-   O cliente pode ativar/inativar manualmente pelo switch da listagem; webhook inativado **não recebe disparos**
    

* * *

**Limitações conhecidas:**

-   Somente URLs com protocolo **HTTPS** são suportadas.
    
-   **Não há reenvio manual** de disparos que falharam (apenas a política de retentativa interna).
    
-   Webhooks inativados por falhas consecutivas precisam ser **reativados manualmente**.
    
-   **Não é possível visualizar o histórico completo** de disparos de um webhook pela interface.
    

* * *

### FAQ

**Posso criar mais de um webhook para a mesma URL?** _Sim, cada um com eventos diferentes._

**O que acontece se meu servidor estiver fora do ar?** _A Zouti retenta por até 4 dias. Após 10 falhas consecutivas, o webhook é inativado automaticamente e precisa ser reativado manualmente._

**Como sei se está funcionando?** _Use a função \*\*Testar Webhook\*\* para enviar um disparo de teste._

**Qual a diferença entre os eventos de Pedido e de Cobrança?** _O_ **_Pedido_** `Order`_) representa a venda; a_ **_Cobrança_** `Payment`_) representa a transação financeira. Um pedido pode ter mais de uma cobrança (ex.: pagamento dividido). Use_ `PAYMENT_*` _para acompanhar o fluxo financeiro transação a transação._

**O** `https://` **é obrigatório?** _Sim — e é adicionado automaticamente, não precisa digitar_.
