Catálogo de Eventos de Webhook
Lista consolidada e autoritativa dos tipos de evento que a Selectwin pode entregar aos seus
Webhook Endpoints. Ao criar/atualizar um endpoint, o campo
events[] aceita exatamente os valores listados aqui — um valor fora desta lista é rejeitado com
400 na criação/atualização do endpoint.
Cada entrega traz o envelope do evento e o cabeçalho X-Selectwin-Signature — sempre verifique a
assinatura (guia) antes de processar.
Transações
| Evento | Quando |
|---|---|
transaction.created | Transação criada |
transaction.pending | Aguardando pagamento (boleto/PIX) ou processamento |
transaction.failed | Tentativa de transação falhou |
transaction.approved | Transação aprovada |
transaction.canceled | Transação cancelada |
transaction.chargeback | Chargeback registrado. Sai de novo se o chargeback voltar depois de revertido (veja abaixo) |
transaction.refunded | Transação estornada (total/parcial) |
transaction.fraud-review | Em análise de fraude |
transaction.pre-authorized | Pré-autorização aprovada (captura manual) |
transaction.unauthorized | Pré-autorização não autorizada |
transaction.awaiting | Aguardando ação/análise |
transaction.dispute | Transação em disputa. Sai de novo se a disputa reabrir depois de encerrada a seu favor (veja abaixo) |
Disputa e chargeback que reabrem. Uma disputa encerrada a seu favor pode voltar, e um chargeback revertido pode ser
cobrado de novo. Cada vez que isso acontece na mesma venda chega um transaction.dispute ou transaction.chargeback
novo, com id próprio, e o mesmo vale para o receivable.dispute e o receivable.chargeback de cada recebível. A
primeira disputa e o primeiro chargeback chegam como sempre chegaram. Já a vitória, que devolve a venda a approved,
não gera um segundo transaction.approved, porque a aprovação é uma vez por venda: para saber o desfecho, leia a
transação. Veja
Uma vez por recurso × uma vez por ocorrência.
Pagamento combinado (2 cartões ou cartão + Pix)
Num pedido pago com 2 cartões (dualcredit) ou cartão + Pix (creditpix), cada parte é uma transação com o
bloco paymentGroup (id, method, status, legIndex, legCount, isPrimary, totalAmount e transactionIds — as
transações atuais das partes do pedido, para ligar as cobranças). Uma parte só é
anunciada como aprovada quando o pedido inteiro está pago, então não entregue nada por uma parte antes disso:
- Pedido pago: sai
transaction.approvedde cada parte, uma vez, junto comcheckout.session.completed(que trazpaymentGroupIdetransactionIds[]). Depois disso, cada parte é como qualquer transação (estorno, contestação). - Parte do Pix: sai
transaction.pending(o QR) e, se o pedido não fechar, o fim dele (transaction.canceledoutransaction.failed). - Dinheiro voltando (
transaction.refunded,transaction.chargeback,transaction.dispute): sai sempre. Exemplo: o Pix pago depois de o pedido ter falhado é estornado automaticamente e chega só comotransaction.refunded, nunca comotransaction.approved. - Não saem: a reserva do cartão (
transaction.pre-authorized), a recusa ou o cancelamento de uma tentativa de cartão (o comprador troca de cartão na mesma página) e a aprovação de uma parte antes de o pedido estar pago.
Clientes
| Evento | Quando |
|---|---|
customer.created | Cliente criado |
customer.updated | Cliente atualizado |
customer.deleted | Cliente removido |
customer.address.created | Endereço do cliente criado |
customer.address.updated | Endereço do cliente atualizado |
customer.address.deleted | Endereço do cliente removido |
Cartões
| Evento | Quando |
|---|---|
card.created | Cartão tokenizado/registrado |
card.updated | Cartão atualizado |
card.deleted | Cartão removido |
card.expired | Cartão expirado |
Assinaturas
| Evento | Quando |
|---|---|
subscription.created | Assinatura criada |
subscription.pending | Assinatura aguardando confirmação |
subscription.active | Assinatura ativada (em dia) |
subscription.canceled | Assinatura cancelada |
subscription.pastdue | Cobrança de ciclo falhou; em retentativa |
subscription.unpaid | Retentativas esgotadas sem pagamento |
subscription.trialing | Em período de trial |
subscription.paused | Assinatura pausada |
subscription.updated | Assinatura atualizada |
Recebíveis
| Evento | Quando |
|---|---|
receivable.created | Recebível gerado |
receivable.pending | Aguardando liquidação |
receivable.paid | Recebível liberado/pago |
receivable.canceled | Recebível cancelado |
receivable.chargeback | Chargeback afeta o recebível. Sai de novo se o chargeback voltar depois de revertido |
receivable.refunded | Recebível reembolsado |
receivable.dispute | Disputa afeta o recebível. Sai de novo se a disputa reabrir depois de revertida |
receivable.scheduled | Recebível agendado para liberação |
receivable.fraud-hold | Recebível retido por análise de fraude |
Carteiras
| Evento | Quando |
|---|---|
wallet.created | Carteira criada |
wallet.deleted | Carteira removida |
wallet.pending | Carteira aguardando validação |
wallet.disabled | Carteira desativada |
wallet.enabled | Carteira ativada |
Vendedores (Sellers)
Primariamente para plataformas de marketplace, que recebem estes eventos para cada sub-conta via fan-out — veja Marketplace (sub-contas). O payload.object é a sub-conta (o objeto de conta), e id é o bus_… que você usa em onBehalfOf.
| Evento | Quando |
|---|---|
seller.created | Sub-conta/vendedor provisionado |
seller.updated | Perfil/configuração atualizados |
seller.analyzing | KYC submetido (status → analyzing) |
seller.approved | KYC aprovado |
seller.refused | KYC recusado |
seller.blocked | Conta bloqueada (status → blocked); não cobra nem saca enquanto estiver assim |
seller.disabled | Conta desativada (status → disabled); não cobra nem saca enquanto estiver assim |
seller.reinstated | Bloqueio ou desativação desfeitos (status → active, ou analyzing quando a conta volta para a análise do KYC) |
seller.kycRequired | A análise de KYC precisa ser refeita (status → awaiting-documents); a conta não cobra nem saca até reenviar os documentos pedidos e ser aprovada de novo |
Saques (Withdrawals)
| Evento | Quando |
|---|---|
withdrawal.created | Saque criado |
withdrawal.pending | Saque pendente |
withdrawal.confirmed | Saque confirmado |
withdrawal.canceled | Saque cancelado |
withdrawal.refused | Saque recusado |
withdrawal.processing | Saque em processamento |
withdrawal.analysis | Saque em análise |
Webhooks
| Evento | Quando |
|---|---|
webhook.created | Um novo webhook endpoint foi configurado |
webhook.updated | Um webhook endpoint foi atualizado |
webhook.deleted | Um webhook endpoint foi removido |
webhook.disabled | Um webhook foi desativado por falhas de entrega |
Checkout
| Evento | Quando |
|---|---|
checkout.session.created | Sessão de checkout criada |
checkout.session.updated | Sessão de checkout atualizada |
checkout.session.abandoned | Sessão abandonada |
checkout.session.recovered | Sessão recuperada |
checkout.session.reactivated | Sessão reativada |
checkout.session.expired | Sessão expirada |
checkout.session.completed | A compra da sessão foi paga (cartão aprovado, Pix/boleto pago) ou a assinatura dela foi criada. Traz o objeto da sessão + transactionId/subscriptionId |
Produtos
| Evento | Quando |
|---|---|
product.created | Produto criado. O objeto traz as variantes criadas junto com ele, e cada uma gera também o seu variant.created |
product.updated | Produto atualizado |
product.deleted | Produto removido. O objeto é { "id", "resource": "product", "deleted": true }. Cada variante removida junto gera também o seu variant.deleted |
variant.created | Variante criada: acrescentada a um produto que já existe ou criada junto com o produto |
variant.updated | Variante atualizada, inclusive quando a moderação da Selectwin retira o produto do ar ou o devolve |
variant.deleted | Variante removida, sozinha ou junto com o produto. O objeto é { "id", "resource": "variant", "deleted": true } |
Um evento por variante. Uma operação que mexe em várias variantes de uma vez entrega o evento do produto e um
variant.* para cada variante afetada, nunca um evento só para o lote. Criar um produto com 3 variantes entrega um
product.created e 3 variant.created. Excluir o produto entrega um product.deleted e um variant.deleted por variante
que saiu com ele. Quando a moderação retira o produto do ar, chegam um product.updated e um variant.updated para cada
variante desligada. Quem sincroniza só variantes pode assinar só variant.*. Como a ordem de entrega não é garantida, um
variant.created pode chegar antes do product.created do mesmo produto.
Nos eventos de criação e de atualização, payload.object é o produto (com as variantes) ou a variante, na mesma forma
da leitura.
Cupons
| Evento | Quando |
|---|---|
coupon.created | Cupom criado |
coupon.updated | Cupom alterado, inclusive quando volta a ficar ativo |
coupon.disabled | Cupom desativado, por você ou pela moderação da Selectwin |
Cada alteração gera um evento: a que desativa o cupom é coupon.disabled, e as demais são coupon.updated.
payload.object é o cupom na mesma forma de GET /v1/coupons/{couponId}, com resource: "coupon". O cupom que
vence, esgota ou é excluído não gera evento.
Eventos de teste
| Evento | Quando |
|---|---|
webhook.ping | Ping sintético gerado por POST /v1/webhooks/{webhookId}/test |
Envelope do evento
O objeto do recurso é entregue em payload.object (não em data):
{
"id": "wbh_01hqzvabc",
"type": "transaction.approved",
"source": "automatic",
"payload": {
"object": { "...": "objeto do recurso no momento do evento" }
},
"correlationId": null,
"updatedAt": "2026-06-20T17:56:33.000Z",
"createdAt": "2026-06-20T17:56:33.000Z"
}type— o tipo do evento (uma das linhas acima).source— origem do evento (automaticpara eventos de plataforma;apipara o ping de teste).payload.object— o objeto do recurso (mesma forma da leitura do recurso).correlationId— id de correlação da requisição originária, quando disponível.- Em fan-out de marketplace, o envelope entregue ao parent inclui também
account(publicId da sub-conta).
Atribuição (utm) nos eventos
De onde veio a venda chega em payload.object.utm — no topo do objeto do recurso, irmão de
metadata. Mesmo nome, mesmas chaves, nas duas famílias de evento:
{
"type": "checkout.session.created",
"payload": {
"object": {
"object": "checkout.session",
"id": "sess_fc2b692056e12dc475b1",
"status": "active",
"utm": {
"source": "instagram",
"medium": "cpc",
"campaign": "lancamento-agosto",
"content": "criativo-v2",
"term": "curso-online",
"fbclid": "IwAR1x...",
"gclid": "Cj0KCQ..."
},
"metadata": null
}
}
}{
"type": "transaction.approved",
"payload": {
"object": {
"id": "tra_68qx2h3skshvd85g",
"status": "approved",
"utm": { "source": "instagram", "medium": "cpc", "campaign": "lancamento-agosto" }
}
}
}| Chave | O que é |
|---|---|
source | Origem (instagram, google, newsletter) |
medium | Meio (cpc, organic, email) |
campaign | Campanha |
content | Criativo/variação |
term | Termo de busca |
gclid · fbclid · ttclid · msclkid · twclid · wbraid · gbraid · irclickid · li_fat_id · epik | Identificador de clique do anunciante, como veio. Só em checkout.session.* |
Três regras que valem para os dois eventos:
utménullquando não há campanha. Compra direta não vem com um objeto de chaves nulas — vemnull. Tratenullcomo "tráfego direto".- Chave ausente ≠ chave nula. Só aparece o que realmente veio: uma campanha sem
termnão traz a chaveterm. - Os nomes são curtos. A URL do anúncio usa
utm_source, mas o que você recebe ésource. A conversão é feita na entrada — você pode continuar mandandoutm_sourcequando for você a criar a sessão ou a cobrança.
A sessão captura a atribuição uma vez, na primeira visita do comprador, e ela é imutável dali em
diante — o clique que trouxe a venda não muda no meio do checkout. Quando a sessão vira cobrança, os
cinco campos UTM descem para a transação sozinhos: o utm de transaction.* de uma venda de checkout é
o mesmo da sessão, sem você fazer nada.
Cookies de rastreio (cookies) em checkout.session.*
Os identificadores do navegador do comprador chegam em payload.object.cookies, irmão de utm, com o
nome do cookie como chave e o valor como veio — é o que o seu CAPI/Conversions API precisa para casar um
carrinho abandonado com o anúncio:
{
"type": "checkout.session.abandoned",
"payload": {
"object": {
"object": "checkout.session",
"id": "sess_a1b2c3d4e5f6789012ab",
"utm": { "source": "meta", "medium": "cpc", "campaign": "lancamento" },
"cookies": {
"_fbp": "fb.1.1790000000000.1234567890",
"_fbc": "fb.1.1790000000000.IwAR1x...",
"_ga": "GA1.1.1234567890.1790000000",
"_gcl_au": "1.1.1234567890.1790000000"
}
}
}
}nullquando nada foi capturado — o comprador saiu antes de a página rodar, ou não consentiu. Não é um objeto vazio.- As chaves são as do navegador (
_fbp, nãofbp); cookies de GA4 com stream aparecem como_ga_<id do stream>. - A sessão os acumula enquanto o comprador navega; um evento posterior (
reactivated,expired) pode trazer mais chaves que ocreated. - Na venda aprovada eles já chegavam em
transaction.*comometadata.cookies; agora também chegam na sessão.
Boas práticas
- Assine a menor lista de eventos que você precisa — evita tráfego desnecessário.
- Deduplique pelo
iddo evento (wbh_...); reentregas podem repetir um evento. - Responda
2xxrápido (o prazo é 30 s, mas acima de 5 s o endpoint passa à fila agendada) e processe de forma assíncrona — veja Proibição de Polling. - A lista pode evoluir; novos tipos podem ser adicionados. Ignore com segurança tipos que você não trata.
Atualizado em 21 de outubro de 2026