Ir para o conteúdo
Desenvolvedores

Webhooks de comunidade

A Mateflow envia um HTTP POST para a sua URL quando algo acontece em uma comunidade. Esta página cobre o que o seu receptor recebe, como verificar, o que acontece quando a entrega falha e cada campo de cada evento.

Início rápido

Cada entrega é um POST com corpo JSON. Se vários webhooks assinam um evento, cada um recebe a sua própria cópia.

  1. No console de administração da sua comunidade, abra Configurações → Integrações → Webhooks e crie um webhook: informe a URL, escolha os eventos, gere um segredo e ative-o.
  2. Trate cada requisição nesta ordem:
    1. Leia o corpo bruto da requisição e verifique a assinatura.
    2. Se test for true, responda 200 e pare.
    3. Deduplique por event_id.
    4. Coloque o trabalho na sua própria fila e responda com um 2xx em até 10 segundos.
  3. Clique em Testar Webhook para enviar uma requisição de teste e depois abra Logs de Entrega para ver a requisição e a resposta.

Planos e configuração

Webhooks são um recurso de plano, e somente administradores da comunidade podem gerenciá-los.

PlanoWebhooks por comunidade
FreeNão disponível
StarterNão disponível
Growth5
Business20
EnterpriseIlimitado
  • Após um downgrade para um plano sem webhooks, as configurações dos seus webhooks são mantidas, mas nada é entregue nem registrado. Fazer upgrade restaura a entrega.
  • Os webhooks são criados e gerenciados no console de administração. A Community Open API não tem endpoints para eles.

Configuração

ConfiguraçãoRequisito
URLO formulário de administração aceita somente URLs https://, com até 1.024 caracteres.
Endereços inacessíveisRequisições para endereços que resolvem para faixas de loopback, privadas ou de link local são bloqueadas no momento da conexão e tratadas como erro de rede. Para desenvolvimento local, use um túnel público.
NomeAté 100 caracteres.
EventosPelo menos um, do catálogo abaixo. Um webhook salvo antes com a lista de eventos vazia recebe todos os eventos.
SegredoOpcional, até 128 caracteres. Depois de salvo, pode ser substituído, mas não pode ser lido de volta. Sem segredo, as requisições não são assinadas, por isso recomendamos fortemente definir um. O próprio segredo nunca aparece em uma requisição.

Formato de entrega

Toda entrega é um POST com timeout de 10 segundos por requisição.

Cabeçalhos

CabeçalhoValorObservações
Content-Typeapplication/jsonSempre JSON.
User-AgentMateflow-Webhook/1.0Identifica a Mateflow como remetente.
X-Mateflow-TimestampSegundos UnixQuando esta requisição foi enviada. Faz parte da assinatura.
X-Mateflow-Signaturesha256= seguido de um digest hexadecimalPresente somente quando o webhook tem um segredo.

Webhooks personalizados não têm o cabeçalho X-Mateflow-Delivery-Id. Leia delivery_id do corpo.

Corpo

CampoTipoDescrição
eventstringO código do evento.
event_idstringO identificador único do evento. Deduplique por ele. Ele permanece o mesmo entre retentativas automáticas e reenvios manuais, e entre todos os webhooks que assinam o evento. Trate-o como uma string opaca.
occurred_atRFC 3339Quando o evento aconteceu, com precisão de segundos. Permanece o mesmo entre retentativas.
delivery_idstring (decimal)Identifica esta entrega. Muda a cada retentativa automática; um reenvio manual mantém o valor original.
timestampRFC 3339Quando o corpo foi gerado. Um reenvio manual mantém o valor original, então use o cabeçalho para avaliar a atualidade.
webhook_idhashidO webhook que recebe esta entrega.
site_idhashidA comunidade.
dataobjectOs dados do evento, descritos no catálogo de eventos.

Em casos raros, quando a geração do ID falha, event_id e occurred_at podem estar ausentes. Aceite isso e recorra a event mais o ID de negócio em data para identificar duplicatas.

JSON
{
  "event": "payment.received",
  "event_id": "86116692152877061",
  "occurred_at": "2026-11-03T00:00:00Z",
  "delivery_id": "86116692152877060",
  "timestamp": "2026-11-03T00:00:01Z",
  "webhook_id": "qP3aXm71Bd",
  "site_id": "Z5Kf08mFv8r",
  "data": {
    "member_id": "b7Lq2WxR9e",
    "username": "sample_member",
    "email": "sample.member@example.com",
    "invoice_id": "in_1Abc",
    "subscription_id": "sub_1Abc",
    "amount_cents": 2900,
    "currency": "usd",
    "period_start": "2026-11-03T00:00:00Z",
    "period_end": "2026-12-03T00:00:00Z"
  }
}

Verificar assinaturas

Quando um webhook tem um segredo, toda requisição é assinada com HMAC-SHA256 sobre o cabeçalho de timestamp e o corpo bruto.

Assinatura
X-Mateflow-Signature = "sha256=" + hex(
  HMAC-SHA256(secret, X-Mateflow-Timestamp + "." + raw_request_body)
)
  • Use os bytes brutos. Caracteres especiais em HTML podem ser escapados no corpo, então interpretar o JSON e serializá-lo de novo produz bytes diferentes e a assinatura não vai coincidir.
  • Pegue o timestamp do cabeçalho, não do corpo. Um reenvio manual atualiza apenas o timestamp do cabeçalho e a assinatura.
  • Uma verificação de timestamp não interfere nas retentativas. Cada retentativa automática e cada reenvio manual são assinados de novo, então uma janela de 5 minutos é suficiente.
Node.js
const crypto = require('crypto');

// rawBody must be the untouched bytes, e.g. from express.raw({ type: 'application/json' }).
function verifyMateflowSignature(rawBody, headers, secret, toleranceSeconds = 300) {
  const timestamp = headers['x-mateflow-timestamp'];
  const received = headers['x-mateflow-signature'] || '';
  if (!timestamp || Math.abs(Date.now() / 1000 - Number(timestamp)) > toleranceSeconds) {
    return false;
  }
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(`${timestamp}.`)
    .update(rawBody)
    .digest('hex');
  const a = Buffer.from(received);
  const b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
Python
import hashlib
import hmac
import time


def verify_mateflow_signature(raw_body: bytes, headers, secret: str, tolerance_seconds: int = 300) -> bool:
    timestamp = headers.get("X-Mateflow-Timestamp", "")
    received = headers.get("X-Mateflow-Signature", "")
    if not timestamp.isdigit() or abs(time.time() - int(timestamp)) > tolerance_seconds:
        return False
    signed = timestamp.encode() + b"." + raw_body
    expected = "sha256=" + hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(received.encode(), expected.encode())

Vetor de teste

Use estes valores para conferir o seu cálculo da assinatura. O timestamp já expirou, então relaxe a sua janela de tempo durante os testes.

Vetor de teste
secret                 my_signing_secret
X-Mateflow-Timestamp   1793664000
raw body (UTF-8)       {"event":"member.joined","data":{"username":"张三"}}
X-Mateflow-Signature   sha256=3f4c83828ce0086150c9bd48c1654899357b7c05265c1d1b6c172225ee04b4b4

Rotação de segredo

Um novo segredo entra em vigor assim que é salvo, e as retentativas na fila também são assinadas com ele. Não há período em que a Mateflow assine com os dois, então faça o seu receptor aceitar o segredo antigo e o novo durante a troca.

Respostas e retentativas

Como uma entrega é avaliada depende apenas do seu código de status. O corpo da resposta não é interpretado.

Seu receptorResultadoRepetida
2xxSucessoNão
5xx, 408, 429FalhaSim
Timeout, falha de conexão, endereço bloqueadoFalha, registrada com status 0Sim
Qualquer outro 4xxFalhaNão
  • Cronograma de retentativas: após uma falha, a Mateflow espera 1 minuto, 10 minutos, 1 hora e depois 6 horas. Com a primeira tentativa, são no máximo 5 tentativas ao longo de cerca de 7 horas.
  • Quando a entrega desiste: quando as retentativas se esgotam, ou diante de um status que não é repetido, o proprietário e os administradores da comunidade recebem um e-mail, no máximo um por webhook a cada 24 horas.
  • Interrompida no meio: se o webhook é excluído ou desativado, ou o plano deixa de incluir webhooks, as tentativas seguintes não são enviadas nem registradas.
  • Redirecionamentos: as entregas seguem redirecionamentos, mas um 301, 302 ou 303 transforma o POST em um GET sem corpo. Informe a URL final e não conte com um redirecionamento de http para https.

Reenvio manual

Reenviar em Logs de Entrega envia uma entrega de novo para a URL atual do webhook.

  • O corpo é idêntico, incluindo event_id, delivery_id e timestamp. O cabeçalho de timestamp e a assinatura são novos.
  • Tenta uma vez e não é repetido em caso de falha. O resultado aparece como uma nova linha no log.
  • Somente entregas de webhooks personalizados podem ser reenviadas, e o webhook ainda precisa existir e estar ativado.

Logs de entrega

Os logs são mantidos por 30 dias. Somente os primeiros 4 KB do corpo de cada resposta são salvos.

Confiabilidade

O que o seu receptor pode e não pode presumir.

  • Pelo menos uma vez. O mesmo evento pode chegar mais de uma vez. Deduplique por event_id.
  • Adicione uma segunda verificação para qualquer coisa que envolva dinheiro. A Mateflow já deduplica o mesmo pagamento e o mesmo início ou fim de assinatura, mas se essa verificação estiver indisponível ela envia em vez de descartar, e então os dois eventos têm valores de event_id diferentes. Verifique também invoice_id, subscription_id ou order_id.
  • Sem garantia de ordem. As entregas rodam em paralelo e são repetidas, então access_group_removed e access_group_added de um membro podem chegar invertidos. Para saber qual veio primeiro, use occurred_at, que tem precisão de segundos.
  • Perda rara é possível. Os eventos entram na fila depois que os dados são confirmados, então um processo que termina entre essas duas etapas perde o evento.
  • Reconcilie se você sincroniza estado. Trate um evento como um sinal de que algo mudou, leia o estado atual pela Open API (por exemplo /member/get com o escopo members.read) e faça uma comparação completa periodicamente. A Open API não devolve endereços de e-mail, então obtenha-os dos eventos.

Catálogo de eventos

Você pode assinar 17 eventos.

Regras para todos os campos

  • Os IDs da Mateflow são strings hashid, os mesmos valores que a API usa. Um valor 0 não é codificado e aparece como o número 0.
  • member_id e user_id se referem à mesma pessoa. member.joined, os eventos de publicação e os eventos de comentário usam user_id; todo o resto usa member_id.
  • Os IDs do Stripe são repassados sem alteração: invoice_id, subscription_id, charge_id e payment_intent_id.
  • Os horários seguem RFC 3339 em UTC.
  • Os valores são inteiros na menor unidade da moeda (centavos para USD), e currency é um código de moeda em minúsculas.
  • Um campo opcional que não se aplica é omitido. Ele não é null nem uma string vazia.
  • Campos e valores de enum só são acrescentados, nunca alterados. O seu receptor deve tolerar os novos.

Todos os eventos

EventoSignificadoNome de usuário e e-mail
member.joinedUm novo membro entrouSim
member.leftUm membro saiu da comunidadeSim
member.role_changedO papel de um membro mudouNão
member.suspendedUm membro foi suspenso ou banidoNão
member.reinstatedUma suspensão ou um banimento foi levantadoNão
member.access_group_addedUm membro passou a ter um grupo de acessoSim
member.access_group_removedUm membro deixou de ter um grupo de acessoSim
post.createdUma publicação foi publicadaNão
post.deletedUma publicação foi excluídaNão
comment.createdUm comentário foi publicadoNão
comment.deletedUm comentário foi excluídoNão
payment.receivedUm pagamento chegou, de uma fatura de assinatura ou de uma compra únicaSim
subscription.renewedUma assinatura foi renovada com sucessoSim
payment.failedO pagamento de uma fatura falhouSim
subscription.createdUma assinatura foi criada no StripeSim
subscription.canceledUma assinatura terminouSim
refund.issuedUm reembolso foi emitidoSim

Membros

member.joined

Um novo membro entrou.

CampoTipoSempre presenteDescrição
user_idhashidSimID do membro.
usernamestringSimNome de usuário.
emailstringSimEndereço de e-mail.

Enviado quando

  • Uma inscrição é bem-sucedida, incluindo login social, o primeiro login por SSO e inscrição por meio de um convite.
  • Uma inscrição paga é concluída.
  • Uma solicitação de entrada é aprovada.
  • Alguém se registra de novo com o mesmo e-mail e a conta é restaurada. O evento é enviado de novo.

Não enviado quando

  • Membros são importados de um arquivo CSV.
  • Um membro ainda aguarda aprovação em uma comunidade que analisa solicitações de entrada.

member.left

Um membro saiu da comunidade.

CampoTipoSempre presenteDescrição
member_idhashidSimO mesmo valor do user_id do membro em member.joined.
usernamestringSimNome de usuário antes de sair, mesmo que a saída apague os dados pessoais.
emailstringSimEndereço de e-mail antes de sair, nas mesmas condições.
sourcestringSimComo o membro saiu. Veja a tabela abaixo.
removed_byhashidNãoO administrador que executou a ação. Somente para removed e anonymized.
reasonstringNãoSomente para removed, quando o administrador informou um motivo.
sourceSignificadoRegistrar-se de novo com o mesmo e-mail
removedUm administrador removeu o membroRestaura o mesmo ID e envia member.joined de novo
account_deletedO membro excluiu a própria conta, imediatamente ou ao fim do período de reflexão de 30 diasExclusão imediata: igual ao caso acima. Após o período de reflexão: um novo ID
anonymizedUm administrador anonimizou o membro conforme a GDPRUm novo ID
inactivityLimpeza de contas inativas, que roda em lotes noturnosUm novo ID

Não enviado quando

  • Uma conta é desativada.
  • Um membro está dentro do período de reflexão após pedir a exclusão da conta. O evento é enviado quando o período termina, e não é enviado se ele cancelar.
  • Um membro é banido ou suspenso, o que envia member.suspended.
  • Alguém nunca entrou, como em uma solicitação de entrada rejeitada ou pendente.
  • Uma assinatura termina.
  • A comunidade é excluída.
  • Um membro sai de um único espaço.
  • Os grupos de acesso removidos pela saída não são enviados um a um como member.access_group_removed. Trate member.left como indicação de que o membro não tem mais nenhum grupo de acesso.

member.role_changed

O papel de um membro mudou.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
previous_rolestringSimmember, moderator ou admin, sempre em minúsculas.
rolestringSimOs mesmos valores.
changed_byhashidSimQuem fez a alteração.

Não enviado quando

  • O papel não mudou de fato.
  • Somente Billing Admin ou um papel personalizado mudou.

member.suspended

Um membro foi suspenso ou banido. Os dois usam este evento, distinguidos por ban_type.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
suspended_byhashidSimO administrador que executou a ação.
reasonstringSimA nota interna do administrador. Pode ser uma string vazia. Não a mostre ao membro.
ban_typestringSimsuspend ou ban.
duration_daysnumberNãoSomente para suspend.
suspended_untilRFC 3339NãoSomente para suspend.
viastringNãomoderation quando feito ao tratar uma denúncia. Omitido quando feito pelo gerenciamento de membros.

Enviado quando

  • Um membro é suspenso ou banido pelo gerenciamento de membros ou ao tratar uma denúncia, individualmente ou em massa.

Não enviado quando

  • Um membro apenas recebe um aviso.

member.reinstated

Uma suspensão ou um banimento foi levantado.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
reinstated_byhashidNãoO administrador que executou a ação. Omitido quando via é expired.
fromstringSimO que foi levantado: suspend ou ban.
viastringNãomoderation (levantado na moderação), appeal (recurso aprovado) ou expired (a suspensão terminou). Omitido quando levantado pelo gerenciamento de membros.

Não enviado quando

  • Uma suspensão terminou, mas o membro tem outro banimento ativo, então continua restrito.
  • Quando uma suspensão termina, o evento normalmente sai em poucos minutos, porque as expirações são verificadas a cada 5 minutos. occurred_at é o momento em que a expiração foi detectada.

member.access_group_added, member.access_group_removed

Um membro passou a ter ou deixou de ter um grupo de acesso. Cada evento cobre um membro e um grupo de acesso, então mover uma assinatura de Silver para Gold envia um removed e um added.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
usernamestringSimNome de usuário.
emailstringSimEndereço de e-mail.
access_group_idhashidSimO mesmo valor de access_groups[].id na Open API.
access_group_namestringSimO nome do grupo na ocasião. Para um grupo excluído, o nome antes da exclusão.
sourcestringSimVeja a tabela abaixo.
changed_byhashidNãoSomente para manual e invitation.
sourceEventosSignificadochanged_by
manualadded, removedUm administrador concedeu ou removeu no consoleO administrador
subscriptionadded, removedUma assinatura começou, terminou ou mudou de nívelNenhum
invitationaddedO membro aceitou um conviteQuem convidou
defaultaddedO membro entrou no grupo padrãoNenhum
group_deletedremovedO grupo de acesso foi excluídoNenhum

Não enviado quando

  • O conjunto de grupos do membro não mudou de fato.
  • Um membro entra automaticamente no grupo padrão na inscrição.
  • A alteração afeta um membro que ainda aguarda aprovação.
  • Os grupos são removidos porque a conta foi excluída.
  • Excluir um grupo de acesso ou definir um grupo padrão é uma alteração em massa. Os eventos são enviados membro por membro e chegam de segundos a minutos após a ação, enquanto occurred_at continua sendo o momento da ação. O event_id deles tem um formato diferente, e é por isso que deve ser tratado como opaco.

Conteúdo

Nos quatro eventos, post_id é o ID do próprio conteúdo e user_id é o autor, não quem executou a ação. space_id é omitido quando o conteúdo não está em um espaço. O conteúdo de espaços privados também é enviado, então filtre por space_id se o seu receptor precisar.

post.created

Uma publicação ou publicação de blog foi publicada.

CampoTipoSempre presenteDescrição
post_idhashidSimID da publicação.
user_idhashidSimO autor.
space_idhashidNãoO espaço que a contém.
titlestringSimTítulo. Pode ser uma string vazia.
bodystringSimCódigo-fonte em Markdown, até 500 caracteres. Pode ser cortado antes, em uma palavra ou sinal de pontuação, sem reticências. Para uma publicação de blog, é o resumo.

Enviado quando

  • Uma publicação ou publicação de blog se torna pública: é publicada diretamente, aprovada na fila de revisão ou chega ao horário agendado.

Não enviado quando

  • Um comentário é publicado, o que envia comment.created.
  • Uma publicação de blog envia este evento somente na primeira publicação, mas uma que foi despublicada e depois agendada de novo pode enviá-lo outra vez. Torne o seu tratamento idempotente em post_id.

post.deleted

Uma publicação ou publicação de blog foi excluída.

CampoTipoSempre presenteDescrição
post_idhashidSimID da publicação.
user_idhashidSimO autor.
space_idhashidNãoO espaço que a contém.

Enviado quando

  • O autor a exclui, um administrador a exclui (individualmente ou em massa), ela é removida ao tratar uma denúncia, ou um banimento apaga o conteúdo do membro. Apagar o conteúdo de um membro pode gerar um lote de eventos.

Não enviado quando

  • Uma publicação de blog volta a rascunho ao ser despublicada, o que não é uma exclusão.
  • Excluir uma publicação agendada que nunca foi publicada também envia este evento, então recebê-lo não significa que você recebeu post.created antes.
  • Não existe um evento separado para restaurar conteúdo.

comment.created

Um comentário foi publicado.

CampoTipoSempre presenteDescrição
post_idhashidSimO ID do próprio comentário.
parent_idhashidSimA publicação ou o comentário que está sendo respondido.
user_idhashidSimO autor.
space_idhashidNãoO espaço que a contém.
bodystringSimAs mesmas regras de body em post.created.

comment.deleted

Um comentário foi excluído. É enviado nas mesmas condições de post.deleted.

CampoTipoSempre presenteDescrição
post_idhashidSimO ID do próprio comentário.
parent_idhashidSimA publicação ou o comentário que está sendo respondido.
user_idhashidSimO autor.
space_idhashidNãoO espaço que a contém.

Pagamentos e assinaturas

Estes eventos cobrem assinaturas do Stripe, compras únicas de espaços e reembolsos. Eles trazem username e email, a menos que o membro não exista mais.

Compras dentro do aplicativo e assinaturas concedidas como presente ou por um código de resgate não enviam payment.* nem subscription.*. Se o plano estiver vinculado a um grupo de acesso, elas enviam member.access_group_added com source definido como subscription, e member.access_group_removed quando o acesso termina, o que você pode usar para acompanhar mudanças de direito de acesso.

Em uma inscrição paga o pagamento vem antes da conta, então os eventos do primeiro pagamento são enviados quando a conta passa a existir: member.joined, subscription.created e payment.received se a primeira fatura for paga. Eles podem chegar em qualquer ordem.

payment.received

Um pagamento chegou. Há dois formatos de payload, que você distingue pela presença de invoice_id.

CampoTipoFatura de assinaturaCompra únicaDescrição
member_idhashidSimSimID do membro.
usernamestringNormalmenteNormalmenteOmitido se o membro não existir mais.
emailstringNormalmenteNormalmenteOmitido se o membro não existir mais.
amount_centsnumberSimSimO valor pago. 0 para a fatura de valor zero quando um período de teste começa.
currencystringSimSimMoeda.
invoice_idstringSimNãoID da fatura do Stripe.
subscription_idstringSimNãoID da assinatura do Stripe.
period_startRFC 3339SimNãoInício do período que este pagamento cobriu.
period_endRFC 3339SimNãoFim do período que este pagamento cobriu. Você pode usá-lo como a data de expiração do acesso.
order_idhashidNãoSimID do pedido.
space_idhashidNãoSimO espaço comprado.
payment_intent_idstringNãoSimID do PaymentIntent do Stripe.
  • O evento não tem plan_id.
  • Uma compra única envia este evento depois que o acesso é concedido, uma vez por pedido.

subscription.renewed

Uma assinatura foi renovada com sucesso. Os campos são os mesmos da forma de fatura de assinatura de payment.received.

  • Uma renovação envia os dois eventos, com valores de event_id diferentes. Se você assina os dois, não registre a receita duas vezes.

payment.failed

O pagamento de uma fatura falhou. É enviado a cada falha, inclusive cada vez que o Stripe tenta a cobrança de novo.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
usernamestringNãoOmitido se o membro não existir mais.
emailstringNãoOmitido se o membro não existir mais.
invoice_idstringSimID da fatura do Stripe.
subscription_idstringSimID da assinatura do Stripe.
amount_due_centsnumberSimO valor devido.
currencystringSimMoeda.
attempt_countnumberSimQual tentativa é esta para a fatura.

subscription.created

Uma assinatura foi criada no Stripe. Isso não significa que ela foi paga; use payment.received para isso.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
usernamestringNãoOmitido se o membro não existir mais.
emailstringNãoOmitido se o membro não existir mais.
subscription_idstringSimID da assinatura do Stripe.
plan_idhashidSimO ID do plano de assinatura de membro.
statusstringSimValores comuns: active, trialing e incomplete (primeira fatura não quitada).
price_centsnumberSimO preço unitário do plano, antes de descontos.
currencystringSimMoeda.
billing_periodstringSimmonthly ou annual.
period_startRFC 3339SimInício do período atual.
period_endRFC 3339SimFim do período atual.

subscription.canceled

Uma assinatura realmente terminou. Um membro que agenda o cancelamento para o fim do período não dispara este evento; o fim do período dispara.

CampoTipoSempre presenteDescrição
member_idhashidSimID do membro.
usernamestringNãoOmitido se o membro não existir mais.
emailstringNãoOmitido se o membro não existir mais.
subscription_idstringSimID da assinatura do Stripe.
plan_idhashidSimO ID do plano de assinatura de membro.
previous_statusstringSimO status antes de terminar, como active, trialing ou past_due.
cancelled_atRFC 3339SimQuando terminou.
  • Uma assinatura que expira sem nunca ter sido paga também envia este evento, com previous_status definido como incomplete. Esse membro nunca teve acesso, então não o conte como churn.
  • A grafia é inconsistente: o evento é canceled, o campo é cancelled_at e o valor de status da assinatura é cancelled.

refund.issued

Um reembolso foi emitido. Reembolsos de faturas de assinatura e de compras únicas compartilham este evento, com campos diferentes. Você os distingue pela presença de invoice_id.

CampoTipoFatura de assinaturaCompra únicaDescrição
member_idhashidSimSimID do membro.
usernamestringNormalmenteNormalmenteOmitido se o membro não existir mais.
emailstringNormalmenteNormalmenteOmitido se o membro não existir mais.
amount_refunded_centsnumberSimSimO total reembolsado até agora, não o valor deste reembolso.
currencystringSimSimMoeda.
refund_statusstringrefunded ou partially_refundedrefundedO status após o reembolso.
is_partialbooleanSimSempre falseSe este é um reembolso parcial.
previous_statusstringPor exemplo paid ou partially_refundedcompletedO status antes do reembolso.
invoice_idstringSimNãoID da fatura do Stripe.
charge_idstringSim, pode ser uma string vaziaSomente para reembolsos iniciados no StripeID da cobrança do Stripe.
order_idhashidNãoSimID do pedido.
space_idhashidNãoSimO espaço comprado.
payment_intent_idstringNãoSimID do PaymentIntent do Stripe.
  • Um reembolso parcial de uma compra única feito no Stripe não envia evento, e o pedido e o acesso permanecem como estavam.

Entregas de teste

Testar Webhook no console de administração envia uma requisição imediatamente e grava o resultado no log de entrega. Um webhook desativado também pode ser testado, e o teste não é repetido. O formato é o mesmo de uma entrega real, inclusive a assinatura, exceto pelo seguinte.

ItemEntrega de testeEntrega real
testtrueAusente
eventSempre member.joined, independentemente dos eventos que o webhook assinaO evento assinado
dataDados de exemploDados reais
event_id, occurred_atAusentesPresentes

Verifique test primeiro e responda 200 quando for true. Caso contrário, um teste de member.joined poderia criar de verdade um membro no seu sistema.

Outros canais

Logs de Entrega também mostra estas origens. Elas usam os mesmos eventos dos webhooks personalizados, em formatos diferentes.

CanalCorpoAssinaturaOutras diferenças
ZapierO mesmo data. O envelope acrescenta um booleano test e não tem webhook_id.Somente se um segredo de assinatura foi definido ao conectar. Mesmo algoritmo.Acrescenta um cabeçalho X-Mateflow-Delivery-Id.
Slack, DiscordSomente texto legível, como text no Slack e content no Discord.Igual ao Zapier.Acrescenta um cabeçalho X-Mateflow-Delivery-Id. Sem campos estruturados.
Regra de automação: Disparar webhookO modelo escrito na regra.Somente se a regra tiver um segredo. Mesmo algoritmo.Não usa este envelope. A regra decide quando enviar.
Chame de volta a sua comunidade com a Open API

Comece a construir

Crie um webhook no console de administração da sua comunidade, envie uma entrega de teste e confira nos logs.

Teste grátis por 14 dias · Depois, Free para até 100 membros · Sem cartão