Concesión de Derechos
La carga útil enviada a su endpoint de webhook cuando se crea, entrega, falla o revoca una concesión de derechos.
Eventos de Webhook para Concesión de Derechos
Estos eventos se activan cada vez que cambia el estado de la concesión de derechos de un cliente, por ejemplo, cuando se genera una clave de licencia, se asigna un rol de Discord, se proporciona un enlace de descarga, o se revoca el acceso. Suscríbase a estos eventos para mantener su aplicación sincronizada con lo que cada cliente puede acceder.EntitlementGrantResponse documentada en el esquema a continuación.
Desencadenantes de Eventos
entitlement_grant.created
Se insertó una fila de grant. A partir de este momento, el grant siempre tiene unid estable, incluso si su estado cambia. Usa este evento para registrar que la cumplimentación está en curso.
Para license keys cumplimentadas automáticamente y feature flags, la fila se inserta directamente con status: "Delivered" y delivered_at rellenados, por lo que a un único evento created no le siguen más cambios de estado, a menos que el grant se revoque posteriormente.
Para las license keys fulfilladas manualmente (entitlements con fulfillment_mode: manual), la fila llega con status: "Pending" y sin el objeto license_key: todavía no hay ninguna key. Este evento indica que hay una key pendiente de fulfillment; proporciónala mediante POST /grants/{grant_id}/license-key, lo que activa entitlement_grant.delivered. Consulta Manual Fulfillment.
Para cualquier otra integración, la fila llega con status: "Pending". Una vez completada la entrega, le sigue un evento delivered o failed:
- Integraciones basadas en OAuth (Discord, GitHub, Notion) utilizan
oauth_urlque el cliente debe visitar para completar el consentimiento. Dodo Payments intenta crearlo cuando se crea el grant, por lo queentitlement_grant.createdpuede incluirlo; si esnull, se completa cuando el cliente inicia el flujo de aceptación desde el Customer Portal. El grant permanecePendinghasta que el cliente autoriza. - Integraciones directas con la plataforma (Telegram, Framer, Digital Files) permanecen en
Pendingsolo brevemente mientras se ejecuta la llamada de la plataforma; después pasan aDelivered.
pending a delivered. El cliente ahora tiene el acceso descrito por el derecho. Use este evento para desbloquear funciones dependientes en sus propios sistemas, por ejemplo, para proporcionar un espacio de trabajo, enviar un correo electrónico de bienvenida personalizado o marcar una bandera de “cumplido”.
El grant pasó al estado Delivered, normalmente desde Pending. El cliente ahora tiene el acceso descrito por la entitlement. Usa este evento para desbloquear funcionalidades dependientes en tus propios sistemas, por ejemplo, para aprovisionar un workspace, enviar un correo electrónico de bienvenida personalizado o marcar un indicador de “fulfilled”.
El campo delivered_at del payload registra cuándo se completó la entrega. delivered se activa cada vez que el estado de un grant existente cambia a Delivered: desde Pending, cuando un grant de OAuth fallido se completa posteriormente, o cuando se restaura un grant revocado. Un grant que llega a Delivered al crearse, como una license key cumplimentada automáticamente, solo activa created.
Se intentó la entrega y falló con un error no recuperable. Los campos error_code e error_message explican la falla. Las causas comunes incluyen un token OAuth revocado, un permiso de plataforma denegado, o un destino faltante (por ejemplo, una guild de Discord eliminada).
entitlement_grant.revoked
Se retiró el acceso a nivel de plataforma: se eliminó el rol de Discord, se eliminó el colaborador de GitHub, se desactivó la clave de licencia, las URL de descarga de archivos ya no se emiten. El camporevocation_reason registra el desencadenante.
Variantes de Carga Útil
El campodata siempre es un objeto EntitlementGrantResponse. Dos tipos de integraciones incluyen objetos anidados adicionales:
El campo data siempre es un objeto EntitlementGrantResponse. El payload incluye un campo integration_type (por ejemplo, license_key, digital_files, discord) para que puedas reconocer directamente el tipo de grant. Tres tipos de integración también adjuntan objetos anidados adicionales:
license_keyse incluye cuandointegration_typeeslicense_keyy se ha emitido una key. Contiene la key generada, la fecha de expiración y el uso de activación. En un grant fulfillado manualmente que aún está enPending, este objeto esnullhasta que completes el fulfillment del grant.digital_product_deliveryse incluye cuandointegration_typeesdigital_files. Contiene URLs de descarga presignadas, elinstructionsopcional y elexternal_urlopcional.featurese incluye cuandointegration_typeesfeature_flag. Contiene elfeature_typey elfeature_idde la capacidad otorgada por el grant.
null; la configuración relevante se registra en el entitlement, no en el grant.
Ejemplos de Carga Útil
Clave de licencia entregada (entitlement_grant.delivered)
License Key Delivered (entitlement_grant.delivered)
License Key Pending Manual Fulfillment (entitlement_grant.created)
Se activa cuando un cliente compra un producto cuyo entitlement de License Key utiliza fulfillment_mode: manual. El grant está en Pending y todavía no tiene un objeto license_key; el merchant debe proporcionar la key.
Digital Files Delivered (entitlement_grant.delivered)
Discord Role Created and Pending (entitlement_grant.created)
Grant Revoked on Subscription Cancellation (entitlement_grant.revoked)
Delivery Failed (entitlement_grant.failed)
Consejos de Integración
- Desbloquea las funciones dependientes cuando un grant alcanza
Delivered. Un eventopayment.succeededte indica que el dinero se liquidó; no te indica que el cliente ya tenga el repositorio de GitHub o el rol de Discord. Gestionaentitlement_grant.deliveredy tambiénentitlement_grant.createdconstatus: "Delivered", porque un grant que se entrega al crearse no genera ningún eventodelivered. - Asocia
revocation_reasoncon los flujos de retención. Un revokesubscription_on_holdnormalmente significa que la tarjeta del cliente falló y que el próximo renewal volverá a otorgar el acceso. Un revokemanualosubscription_cancelledes intencional. Trátalos de forma diferente en los mensajes al cliente. - Detecta duplicados con el header
webhook-id, no con eliddel grant. Un grant emitecreateduna sola vez, perodeliveredyrevokedpueden activarse más de una vez, porque un grant revocado puede restaurarse y revocarse nuevamente.failedtampoco es siempre definitivo: un grant de OAuth fallido aún puede entregarse. Las reentregas del sistema de webhook también pueden repetir un evento. Omite las repeticiones mediantewebhook-idy usa eliddel grant como clave para tus propios registros de grants. - Lee
integration_typepara identificar el tipo de grant. El payload incluyeintegration_typedirectamente (por ejemplo,license_key,digital_files,discord). Los objetos anidadoslicense_keyydigital_product_deliveryse completan una vez entregados sus respectivos grants; un grant de license-key cumplido manualmente permanecePendingconintegration_type: "license_key"y unnulllicense_keyhasta que lo cumplas. - Para los grants basados en OAuth, muestra
oauth_urlal cliente. El eventoentitlement_grant.createdpara los flujos de suscriptores de Discord, GitHub o Notion puede incluir unoauth_urlyoauth_expires_at. Si esnull, espera un evento posterior o dirige al cliente al Customer Portal. Envía la URL por correo electrónico al cliente o muéstrala en tu aplicación para desbloquear la 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.