Concessão de Direitos
A carga útil enviada para seu endpoint de webhook quando uma concessão de direito é criada, entregue, falha ou é revogada.
Eventos de Webhook para Concessão de Direitos
Esses eventos são disparados sempre que a concessão de direitos de um cliente altera o estado, por exemplo, quando uma chave de licença é gerada, um papel do Discord é atribuído, um link de download é provisionado ou o acesso é revogado. Assine esses eventos para manter sua aplicação sincronizada com o que cada cliente pode acessar.EntitlementGrantResponse documentada no esquema abaixo.
Desencadeadores de Eventos
entitlement_grant.created
Uma linha de grant foi inserida. A partir desse momento, o grant sempre tem umid estável, mesmo que seu status mude. Use esse evento para registrar que o fulfillment está em andamento.
Para license keys preenchidas automaticamente e feature flags, a linha é inserida diretamente com status: "Delivered" e delivered_at preenchidos, portanto um único evento created é seguido por nenhuma outra mudança de estado, a menos que o grant seja posteriormente revogado.
Para license keys preenchidas manualmente (entitlements com fulfillment_mode: manual), a linha chega com status: "Pending" e sem o objeto license_key — ainda não há uma key. Esse evento indica que uma key está aguardando preenchimento; forneça-a por meio de POST /grants/{grant_id}/license-key, que então dispara entitlement_grant.delivered. Consulte Manual Fulfillment.
Para todas as outras integrações, a linha chega com status: "Pending". Um evento delivered ou failed ocorre quando a entrega é concluída:
- Integrações baseadas em OAuth (Discord, GitHub, Notion) usam um
oauth_urlque o cliente deve visitar para concluir o consentimento. Dodo Payments tenta criá-lo quando a concessão é criada, entãoentitlement_grant.createdpode incluí-lo; se estivernull, ele será preenchido quando o cliente iniciar o fluxo de aceitação no Customer Portal. A concessão permanecePendingaté que o cliente autorize. - Integrações diretas com a plataforma (Telegram, Framer, Digital Files) permanecem em
Pendingapenas brevemente enquanto a chamada à plataforma é executada e, em seguida, passam paraDelivered.
pending para delivered. O cliente agora tem o acesso descrito pela concessão. Use este evento para desbloquear funcionalidades dependentes em seus próprios sistemas, por exemplo, para provisionar um espaço de trabalho, enviar um email de boas-vindas personalizado, ou marcar uma bandeira “cumprida”.
O grant mudou para Delivered, geralmente a partir de Pending. O cliente agora tem o acesso descrito pelo entitlement. Use esse evento para desbloquear recursos dependentes em seus próprios sistemas, por exemplo, para provisionar um workspace, enviar um e-mail de boas-vindas personalizado ou marcar uma flag como “fulfilled”.
O campo delivered_at do payload registra quando a entrega foi concluída. delivered é disparado sempre que o status de um grant existente muda para Delivered: a partir de Pending, quando um grant OAuth com falha é posteriormente bem-sucedido ou quando um grant revogado é restaurado. Um grant que chega como Delivered na criação, como uma license key preenchida automaticamente, dispara apenas created.
A entrega foi tentada e falhou com um erro não reativável. Os campos error_code e error_message explicam a falha. Causas comuns incluem um token OAuth revogado, uma permissão de plataforma negada ou um alvo ausente (por exemplo, uma guilda do Discord excluída).
entitlement_grant.revoked
O acesso foi retirado no nível da plataforma: papel do Discord removido, colaborador do GitHub removido, chave de licença desativada, URLs de download de arquivos não são mais emitidos. O camporevocation_reason registra o disparador.
Variantes de Carga Útil
O campodata é sempre um objeto EntitlementGrantResponse. Dois tipos de integração anexam objetos aninhados extras:
O campo data é sempre um objeto EntitlementGrantResponse. O payload contém um campo integration_type (por exemplo, license_key, digital_files, discord) para que você possa reconhecer diretamente o tipo de grant. Três tipos de integração também incluem objetos aninhados adicionais:
license_keyé incluído quandointegration_typeélicense_keye uma key foi emitida. Ele contém a key gerada, a expiração e o uso de ativação. Para um grant preenchido manualmente que ainda está emPending, esse objeto énullaté que você preencha o grant.digital_product_deliveryé incluído quandointegration_typeédigital_files. Ele contém URLs de download pré-assinadas, oinstructionsopcional e oexternal_urlopcional.featureé incluído quandointegration_typeéfeature_flag. Ele contém ofeature_typee ofeature_idda capacidade concedida pelo grant.
null; a configuração relevante é registrada no próprio entitlement, não no grant.
Exemplos de Carga Útil
Chave de licença entregue (entitlement_grant.delivered)
License Key Entregue (entitlement_grant.delivered)
License Key Aguardando Fulfillment Manual (entitlement_grant.created)
Disparado quando um cliente compra um produto cujo entitlement de License Key usa fulfillment_mode: manual. O grant está Pending sem um objeto license_key — o merchant deve fornecer a key.
Arquivos Digitais Entregues (entitlement_grant.delivered)
Role do Discord Criada e Pendente (entitlement_grant.created)
Grant Revogado no Cancelamento da Subscription (entitlement_grant.revoked)
Falha na Entrega (entitlement_grant.failed)
Dicas de integração
- Desbloqueie recursos dependentes quando uma concessão chegar a
Delivered. Um eventopayment.succeededinforma que o pagamento foi compensado; ele não informa que o cliente já tem o repositório do GitHub ou a função no Discord. Trateentitlement_grant.deliverede tambémentitlement_grant.createdcomstatus: "Delivered", pois uma concessão entregue no momento da criação não dispara nenhum eventodelivered. - Associe
revocation_reasonaos fluxos de retenção. Um cancelamentosubscription_on_holdgeralmente significa que o cartão do cliente falhou e que a próxima renovação concederá o acesso novamente. Um cancelamentomanualousubscription_cancelledé intencional. Trate-os de forma diferente nas mensagens ao cliente. - Detecte duplicatas com o cabeçalho
webhook-id, não com oidda concessão. Uma concessão emitecreateduma vez, masdeliverederevokedpodem ser disparados mais de uma vez, pois uma concessão cancelada pode ser restaurada e cancelada novamente.failedtambém nem sempre é final: uma concessão OAuth com falha ainda pode ser entregue. As reentregas do sistema de webhooks também podem repetir um evento. Ignore as repetições usandowebhook-ide use oidda concessão como chave para seus próprios registros de concessão. - Leia
integration_typepara reconhecer o tipo de concessão. O payload contémintegration_typediretamente (por exemplo,license_key,digital_files,discord). Os objetos aninhadoslicense_keyedigital_product_deliverysão preenchidos quando suas respectivas concessões são entregues; uma concessão de chave de licença cumprida manualmente permanecePendingcomintegration_type: "license_key"e umnulllicense_keyaté que você a cumpra. - Para concessões baseadas em OAuth, mostre
oauth_urlao cliente. O eventoentitlement_grant.createddos fluxos de assinantes do Discord, GitHub ou Notion pode incluir umoauth_urleoauth_expires_at. Se estivernull, aguarde um evento posterior ou direcione o cliente ao Customer Portal. Envie a URL por e-mail ao cliente ou exiba-a no seu aplicativo para desbloquear a entrega.
Detailed view of a single entitlement grant: who it's for, its lifecycle state, and any integration-specific delivery payload.
Brand id this grant belongs to.
Identifier of the business that owns the grant.
Timestamp when the grant was created.
Identifier of the customer the grant was issued to.
Identifier of the entitlement this grant was issued from.
Unique identifier of the grant.
The integration type of the grant's entitlement (e.g. license_key).
discord, telegram, github, figma, framer, notion, digital_files, license_key, feature_flag Arbitrary key-value metadata recorded on the grant.
Lifecycle status of the grant.
Pending, Delivered, Failed, Revoked Timestamp when the grant was last modified.
Timestamp when the grant transitioned to delivered, when applicable.
Digital-product-delivery payload, present when the entitlement
integration is digital_files.
Machine-readable code reported when delivery failed, when applicable.
Human-readable message reported when delivery failed, when applicable.
Typed feature payload, present only when the entitlement integration is
feature_flag; null for every other integration type.
License-key delivery payload, present when the entitlement integration
is license_key.
Timestamp when oauth_url stops being valid, when applicable.
Customer-facing OAuth URL for OAuth-style integrations. Populated
during the customer-portal accept flow; null until the customer
completes that step, and on grants for non-OAuth integrations.
Identifier of the payment that triggered this grant, when applicable.
Reason recorded when the grant was revoked, when applicable.
Timestamp when the grant transitioned to revoked, when applicable.
Identifier of the subscription that triggered this grant, when applicable.