Octroi de droits
La charge utile envoyée à votre point de terminaison webhook lorsqu’un octroi de droits est créé, livré, échoue, ou est révoqué.
Événements Webhook d’Octroi de Droits
Ces événements se déclenchent chaque fois que l’état de l’octroi de droits d’un client change, par exemple lorsqu’une clé de licence est générée, un rôle Discord est attribué, un lien de téléchargement est provisionné, ou l’accès est révoqué. Abonnez-vous à ces événements pour garder votre application synchronisée avec ce à quoi chaque client peut accéder.EntitlementGrantResponse documentée dans le schéma ci-dessous.
Déclencheurs d’Événements
entitlement_grant.created
Une ligne d’attribution a été insérée. L’attribution possède toujours unid stable à partir de ce moment, même si son statut change. Utilisez cet événement pour enregistrer que la mise à disposition est en cours.
Pour les clés de licence traitées automatiquement et les indicateurs de fonctionnalité, la ligne est insérée directement avec status: "Delivered" et delivered_at renseignés. Ainsi, un seul événement created est suivi d’aucun autre changement d’état, sauf si l’attribution est révoquée ultérieurement.
Pour les clés de licence traitées manuellement (entitlements avec fulfillment_mode: manual), la ligne arrive avec status: "Pending" et sans objet license_key — aucune clé n’est encore disponible. Cet événement vous indique qu’une clé attend d’être traitée ; fournissez-la via POST /grants/{grant_id}/license-key, ce qui déclenche ensuite entitlement_grant.delivered. Consultez Traitement manuel.
Pour toutes les autres intégrations, la ligne arrive avec status: "Pending". Un événement delivered ou failed suit une fois la livraison terminée :
- Les intégrations basées sur OAuth (Discord, GitHub, Notion) utilisent une
oauth_urlque le client doit consulter pour terminer son consentement. Dodo Payments essaie de la créer lorsque l’autorisation est créée ;entitlement_grant.createdpeut donc l’inclure. Si elle estnull, elle est renseignée lorsque le client démarre le flux d’acceptation depuis le Customer Portal. L’autorisation restePendingjusqu’à ce que le client l’autorise. - Les intégrations directes avec la plateforme (Telegram, Framer, Digital Files) restent
Pendinguniquement pendant l’exécution de l’appel à la plateforme, puis passent àDelivered.
entitlement_grant.delivered
L’attribution est passée àDelivered, généralement depuis Pending. Le client dispose désormais de l’accès décrit par le droit. Utilisez cet événement pour déverrouiller les fonctionnalités dépendantes dans vos propres systèmes, par exemple pour provisionner un espace de travail, envoyer un e-mail de bienvenue personnalisé ou marquer un indicateur « fulfilled ».
Le champ delivered_at de la charge utile indique le moment où la livraison a été terminée. delivered est déclenché chaque fois que le statut d’une attribution existante passe à Delivered : depuis Pending, lorsqu’une attribution OAuth ayant échoué réussit ultérieurement, ou lorsqu’une attribution révoquée est restaurée. Une attribution qui arrive à l’état Delivered lors de sa création, comme une clé de licence traitée automatiquement, ne déclenche que created.
entitlement_grant.failed
La livraison a été tentée et a échoué avec une erreur non réessayer. Les champserror_code et error_message expliquent l’échec. Les causes courantes incluent un token OAuth révoqué, une permission de plateforme refusée, ou une cible manquante (par exemple, un serveur Discord supprimé).
entitlement_grant.revoked
L’accès a été retiré au niveau de la plateforme : rôle Discord supprimé, collaborateur GitHub supprimé, clé de licence désactivée, URL de téléchargement de fichiers non émises. Le champrevocation_reason enregistre le déclencheur.
Variantes de charge utile
Le champdata est toujours un objet EntitlementGrantResponse. Le payload contient un champ integration_type (par exemple license_key, digital_files, discord), afin que vous puissiez reconnaître directement le type de grant. Trois types d’intégration ajoutent également des objets imbriqués supplémentaires :
license_keyest inclus lorsqueintegration_typevautlicense_keyet qu’une clé a été émise. Il contient la clé générée, sa date d’expiration et les informations d’utilisation pour son activation. Pour un grant traité manuellement qui se trouve encore dansPending, cet objet vautnulljusqu’à ce que vous traitiez le grant.digital_product_deliveryest inclus lorsqueintegration_typevautdigital_files. Il contient des URL de téléchargement présignées, le champ facultatifinstructionset le champ facultatifexternal_url.featureest inclus lorsqueintegration_typevautfeature_flag. Il contientfeature_typeetfeature_idde la capacité accordée par le grant.
null ; la configuration pertinente est enregistrée dans l’entitlement lui-même, et non dans le grant.
Charges utiles d’exemple
Clé de licence livrée (entitlement_grant.delivered)
Clé de licence en attente de traitement manuel (entitlement_grant.created)
Déclenché lorsqu’un client achète un produit dont l’entitlement License Key utilise fulfillment_mode: manual. Le grant est Pending et ne contient encore aucun objet license_key — le marchand doit fournir la clé.
Fichiers numériques livrés (entitlement_grant.delivered)
Rôle Discord créé et en attente (entitlement_grant.created)
Attribution révoquée lors de l’annulation de l’abonnement (entitlement_grant.revoked)
Échec de la livraison (entitlement_grant.failed)
Conseils d’intégration
- Déverrouillez les fonctionnalités dépendantes lorsqu’une autorisation atteint
Delivered. Un événementpayment.succeededvous indique que le paiement a été compensé ; il ne vous indique pas que le client dispose déjà du dépôt GitHub ou du rôle Discord. Gérezentitlement_grant.delivered, ainsi queentitlement_grant.createdavecstatus: "Delivered", car une autorisation délivrée lors de sa création ne déclenche aucun événementdelivered. - Associez
revocation_reasonaux flux de fidélisation. Une révocationsubscription_on_holdsignifie généralement que la carte du client a échoué et que le prochain renouvellement rétablira l’accès. Une révocationmanualousubscription_cancelledest intentionnelle. Traitez-les différemment dans vos communications avec les clients. - Détectez les doublons avec l’en-tête
webhook-id, et non avec leidde l’autorisation. Une autorisation émetcreatedune seule fois, maisdeliveredetrevokedpeuvent chacun être déclenchés plusieurs fois, car une autorisation révoquée peut être restaurée puis révoquée à nouveau.failedn’est pas toujours définitif non plus : une autorisation OAuth ayant échoué peut tout de même être délivrée. Les nouvelles livraisons du système de webhooks peuvent également répéter un événement. Ignorez les répétitions à l’aide dewebhook-idet utilisez leidde l’autorisation comme clé pour vos propres enregistrements. - Lisez
integration_typepour identifier le type d’autorisation. Le payload contient directementintegration_type(par exemplelicense_key,digital_files,discord). Les objets imbriquéslicense_keyetdigital_product_deliverysont renseignés une fois leurs autorisations respectives délivrées ; une autorisation de clé de licence traitée manuellement restePendingavecintegration_type: "license_key"et unenulllicense_keyjusqu’à ce que vous la traitiez. - Présentez
oauth_urlau client pour les autorisations basées sur OAuth. L’événemententitlement_grant.createddes flux d’abonnement Discord, GitHub ou Notion peut inclure uneoauth_urletoauth_expires_at. Si elle estnull, attendez un événement ultérieur ou redirigez le client vers le Customer Portal. Envoyez l’URL au client par e-mail ou affichez-la dans votre application pour débloquer la livraison.
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.