Entitlement Grant
Payload yang dikirim ke endpoint webhook Anda ketika pemberian hak istimewa dibuat, dikirim, gagal, atau dibatalkan.
Entitlement Grant Webhook Events
Event ini terjadi setiap kali status pemberian hak istimewa pelanggan berubah, misalnya ketika sebuah kunci lisensi dihasilkan, peran Discord diberikan, tautan unduhan disediakan, atau akses dicabut. Berlangganan ke event-event ini untuk menjaga aplikasi Anda tetap sinkron dengan apa yang dapat diakses oleh setiap pelanggan.EntitlementGrantResponse yang sama seperti yang didokumentasikan dalam skema di bawah.
Pemicu Event
entitlement_grant.created
Baris grant telah disisipkan. Sejak saat ini, grant selalu memilikiid yang stabil, meskipun statusnya berubah. Gunakan event ini untuk mencatat bahwa proses fulfillment sedang berlangsung.
Untuk license key yang dipenuhi otomatis dan feature flag, baris tersebut langsung disisipkan dengan status: "Delivered" dan delivered_at yang telah diisi, sehingga satu event created tidak diikuti perubahan status lebih lanjut, kecuali grant tersebut nantinya dicabut.
Untuk license key yang dipenuhi secara manual (entitlements dengan fulfillment_mode: manual), baris masuk dengan status: "Pending" dan tanpa objek license_key — belum ada key. Event ini menandakan bahwa key sedang menunggu pemenuhan; berikan key tersebut melalui POST /grants/{grant_id}/license-key, yang kemudian memicu entitlement_grant.delivered. Lihat Manual Fulfillment.
Untuk setiap integrasi lainnya, baris masuk dengan status: "Pending". Event delivered atau failed muncul setelah pengiriman selesai:
- Integrasi berbasis OAuth (Discord, GitHub, Notion) menggunakan
oauth_urlyang harus dikunjungi pelanggan untuk menyelesaikan persetujuan. Dodo Payments mencoba membuatnya saat grant dibuat, sehinggaentitlement_grant.createddapat menyertakannya; jikanull, nilainya diisi saat pelanggan memulai alur penerimaan dari Customer Portal. Grant tetapPendinghingga pelanggan memberikan otorisasi. - Integrasi langsung platform (Telegram, Framer, Digital Files) hanya berada dalam
Pendingsebentar saat panggilan platform berjalan, lalu berpindah keDelivered.
pending ke delivered. Pelanggan sekarang memiliki akses seperti yang dijelaskan oleh pemberian tersebut. Gunakan event ini untuk membuka fitur bergantung dalam sistem Anda sendiri, misalnya untuk menyediakan workspace, mengirim email sambutan khusus, atau menandai “fulfilled”.
Grant beralih ke Delivered, biasanya dari Pending. Customer kini memiliki akses yang dijelaskan oleh entitlement tersebut. Gunakan event ini untuk membuka fitur yang bergantung pada grant di sistem Anda sendiri, misalnya menyediakan workspace, mengirim email sambutan khusus, atau menandai flag “fulfilled”.
Field delivered_at dalam payload mencatat kapan pengiriman selesai. delivered dipicu setiap kali status grant yang sudah ada berubah menjadi Delivered: dari Pending, saat grant OAuth yang gagal kemudian berhasil, atau saat grant yang dicabut dipulihkan. Grant yang tiba dalam status Delivered saat dibuat, seperti license key yang dipenuhi otomatis, hanya memicu created.
Pengiriman dicoba dan gagal dengan kesalahan yang tidak dapat dicoba ulang. Field error_code dan error_message menjelaskan kegagalan. Penyebab umum termasuk token OAuth dicabut, izin platform ditolak, atau target yang hilang (misalnya, komunitas Discord yang dihapus).
entitlement_grant.revoked
Akses ditarik di tingkat platform: peran Discord dihapus, kolaborator GitHub dihapus, kunci lisensi dinonaktifkan, URL unduhan file tidak lagi diterbitkan. Fieldrevocation_reason mencatat pemicu.
Variasi Payload
Fielddata selalu merupakan objek EntitlementGrantResponse. Dua jenis integrasi menempelkan objek bersarang tambahan:
Field data selalu berupa objek EntitlementGrantResponse. Payload membawa field integration_type (misalnya license_key, digital_files, discord) sehingga Anda dapat langsung mengenali jenis grant. Tiga jenis integrasi juga menyertakan objek bertingkat tambahan:
license_keydisertakan ketikaintegration_typeadalahlicense_keydan key telah diterbitkan. Objek ini berisi key yang dibuat, masa berlaku, dan penggunaan aktivasi. Untuk grant yang dipenuhi secara manual dan masih dalam statusPending, objek ini bernilainullhingga Anda memenuhi grant tersebut.digital_product_deliverydisertakan ketikaintegration_typeadalahdigital_files. Objek ini berisi URL unduhan yang telah ditandatangani sebelumnya,instructionsopsional, danexternal_urlopsional.featuredisertakan ketikaintegration_typeadalahfeature_flag. Objek ini berisifeature_typedanfeature_iddari kapabilitas yang diberikan oleh grant.
null; konfigurasi terkait tercatat dalam entitlement itu sendiri, bukan dalam grant.
Contoh Payload
Kunci lisensi dikirim (entitlement_grant.delivered)
License Key Delivered (entitlement_grant.delivered)
License Key Pending Manual Fulfillment (entitlement_grant.created)
Dipicu ketika customer membeli produk yang entitlement License Key-nya menggunakan fulfillment_mode: manual. Grant berstatus Pending tanpa objek license_key — merchant harus menyediakan 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)
Tips Integrasi
- Buka fitur yang bergantung saat grant mencapai
Delivered. Eventpayment.succeededmemberi tahu Anda bahwa pembayaran telah berhasil, tetapi tidak memberi tahu bahwa pelanggan sudah memiliki repositori GitHub atau peran Discord. Tanganientitlement_grant.delivered, dan jugaentitlement_grant.createddenganstatus: "Delivered", karena grant yang dikirim saat dibuat tidak memicu eventdelivered. - Petakan
revocation_reasonke alur retensi. Pencabutansubscription_on_holdbiasanya berarti kartu pelanggan gagal diproses dan perpanjangan berikutnya akan memberikan grant akses kembali. Pencabutanmanualatausubscription_cancelleddilakukan secara sengaja. Perlakukan keduanya secara berbeda dalam pesan kepada pelanggan. - Deteksi duplikat menggunakan header
webhook-id, bukanidmilik grant. Grant memancarkancreatedsatu kali, tetapidelivereddanrevokedmasing-masing dapat dipicu lebih dari sekali, karena grant yang dicabut dapat dipulihkan lalu dicabut kembali.failedjuga tidak selalu final: grant OAuth yang gagal tetap dapat dikirimkan. Pengiriman ulang dari sistem webhook juga dapat mengulangi sebuah event. Lewati pengulangan berdasarkanwebhook-id, dan gunakanidmilik grant sebagai kunci untuk record grant Anda sendiri. - Baca
integration_typeuntuk mengenali jenis grant. Payload memuatintegration_typesecara langsung (misalnyalicense_key,digital_files,discord). Objek bertingkatlicense_keydandigital_product_deliveryakan terisi setelah grant masing-masing dikirimkan; grant kunci lisensi yang dipenuhi secara manual tetapPendingdenganintegration_type: "license_key"dannulllicense_keyhingga Anda memenuhinya. - Untuk grant berbasis OAuth, tampilkan
oauth_urlkepada pelanggan. Evententitlement_grant.createduntuk alur pelanggan Discord, GitHub, atau Notion dapat menyertakanoauth_urldanoauth_expires_at. Jikanull, tunggu event berikutnya atau arahkan pelanggan ke Customer Portal. Kirim URL tersebut melalui email kepada pelanggan atau tampilkan di aplikasi Anda untuk membuka blokir pengiriman.
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.