منح الاستحقاق
الحمولة المرسلة إلى نقطة نهاية الويب هوك الخاصة بك عند إنشاء أو تسليم أو فشل أو إلغاء منحة الاستحقاق.
أحداث منح الاستحقاق عبر webhook
يتم إطلاق هذه الأحداث كلما تغيرت حالة منحة استحقاق العميل، على سبيل المثال عند إنشاء مفتاح ترخيص، أو تعيين دور Discord، أو توفير رابط تنزيل، أو سحب الوصول. اشترك في هذه الأحداث للحفاظ على توافق تطبيقك مع ما يمكن لكل عميل الوصول إليه.EntitlementGrantResponse الموثقة في المخطط أدناه.
محفزات الأحداث
entitlement_grant.created
تم إدراج صف منح. يملك المنح دائمًاid ثابتًا اعتبارًا من هذه النقطة، حتى إذا تغيرت حالته. استخدم هذا الحدث لتسجيل أن عملية الاستيفاء قيد التنفيذ.
بالنسبة إلى مفاتيح الترخيص التي يتم استيفاؤها تلقائيًا ورايات الميزات، يُدرج الصف مباشرةً مع تعبئة status: "Delivered" وdelivered_at، لذلك يتبع حدث created واحد دون أي تغييرات لاحقة في الحالة، ما لم يتم إلغاء المنح لاحقًا.
بالنسبة إلى مفاتيح الترخيص التي يتم تنفيذها يدويًا (الاستحقاقات التي تحتوي على fulfillment_mode: manual)، يصل الصف مع status: "Pending" ومن دون كائن license_key — إذ لا يوجد مفتاح بعد. يشير هذا الحدث إلى أن مفتاحًا بانتظار التنفيذ؛ وفّره عبر POST /grants/{grant_id}/license-key، ما يؤدي بعد ذلك إلى إطلاق entitlement_grant.delivered. راجع التنفيذ اليدوي.
بالنسبة إلى كل عمليات التكامل الأخرى، يصل الصف مع status: "Pending". يتبع ذلك حدث delivered أو failed عند اكتمال التسليم:
- التكاملات المستندة إلى OAuth (Discord وGitHub وNotion) تستخدم
oauth_urlالذي يجب على العميل زيارته لإكمال الموافقة. يحاول Dodo Payments إنشاءه عند إنشاء المنح، لذلك قد يتضمنهentitlement_grant.created؛ وإذا كانnull، فستتم تعبئته عندما يبدأ العميل تدفق القبول من Customer Portal. تظل المنحة في حالةPendingحتى يمنح العميل التفويض. - التكاملات المباشرة مع المنصة (Telegram وFramer وDigital Files) تبقى في حالة
Pendingلفترة وجيزة فقط أثناء تنفيذ استدعاء المنصة، ثم تنتقل إلىDelivered.
entitlement_grant.delivered
انتقل المنح إلىDelivered، وعادةً من Pending. أصبح لدى العميل الآن الوصول الموضح في الاستحقاق. استخدم هذا الحدث لفتح الميزات التابعة في أنظمتك، مثل تهيئة مساحة عمل، أو إرسال رسالة ترحيب مخصصة عبر البريد الإلكتروني، أو تعيين علامة “fulfilled”.
يلتقط الحقل delivered_at في الحمولة وقت اكتمال التسليم. يتم إطلاق delivered كلما تغيرت حالة منح موجودة إلى Delivered: من Pending، أو عند نجاح منح OAuth فاشل لاحقًا، أو عند استعادة منح مُلغى. أما المنح الذي يصل إلى Delivered عند إنشائه، مثل مفتاح الترخيص المستوفى تلقائيًا، فيُطلق created فقط.
entitlement_grant.failed
تمت محاولة التسليم وفشلت مع خطأ غير ممكن إعادة المحاولة. يوضح الحقلerror_code وerror_message الفشل. تشمل الأسباب الشائعة إلغاء رمز OAuth، أو رفض إذن منصة، أو هدف مفقود (مثل، تم حذف خادم Discord).
entitlement_grant.revoked
تم سحب الوصول على مستوى المنصة: تم إزالة دور Discord، تم إزالة المتعاون في GitHub، تم تعطيل مفتاح الترخيص، لم يعد يتم إصدار روابط تحميل الملفات. يسجل حقلrevocation_reason المُحرك.
أنواع الحمولة
يكون الحقلdata دائمًا كائنًا من نوع EntitlementGrantResponse. تحمل الحمولة حقل integration_type (مثل license_key وdigital_files وdiscord) حتى تتمكن من التعرّف مباشرةً على نوع المنح. كما تُرفق ثلاثة أنواع من عمليات التكامل كائنات متداخلة إضافية:
- يُضمَّن
license_keyعندما يكونintegration_typeهوlicense_keyويكون قد تم إصدار مفتاح. ويحتوي على المفتاح المُنشأ وتاريخ الانتهاء واستخدام التفعيل. وبالنسبة إلى منح يتم تنفيذها يدويًا ولا تزال في حالةPending، يكون هذا الكائنnullإلى أن تنفذ المنح. - يُضمَّن
digital_product_deliveryعندما يكونintegration_typeهوdigital_files. ويحتوي على عناوين URL لتنزيلات موقعة مسبقًا، وinstructionsالاختياري، وexternal_urlالاختياري. - يُضمَّن
featureعندما يكونintegration_typeهوfeature_flag. ويحتوي علىfeature_typeوfeature_idللقدرة التي يمنحها المنح.
null؛ إذ يتم تسجيل الإعدادات ذات الصلة في الاستحقاق نفسه، وليس في المنح.
عينات الحمولة
تم تسليم مفتاح الترخيص (entitlement_grant.delivered)
مفتاح الترخيص بانتظار الاستيفاء اليدوي (entitlement_grant.created)
يتم إطلاقه عندما يشتري العميل منتجًا يستخدم استحقاق مفتاح الترخيص الخاص به fulfillment_mode: manual. يكون المنح في حالة Pending ومن دون كائن license_key بعد — يجب على التاجر توفير المفتاح.
تم تسليم الملفات الرقمية (entitlement_grant.delivered)
تم إنشاء دور Discord وهو قيد الانتظار (entitlement_grant.created)
تم إلغاء المنح عند إلغاء الاشتراك (entitlement_grant.revoked)
فشل التسليم (entitlement_grant.failed)
نصائح للتكامل
- فعّل الميزات التابعة عندما تصل المنحة إلى
Delivered. يخبرك حدثpayment.succeededبأن الأموال قد تمت تسويتها؛ لكنه لا يخبرك بأن العميل حصل بالفعل على مستودع GitHub أو دور Discord. تعامل معentitlement_grant.delivered، وكذلك معentitlement_grant.createdباستخدامstatus: "Delivered"، لأن المنحة التي يتم تسليمها عند الإنشاء لا تطلق أي حدثdelivered. - اربط
revocation_reasonبتدفقات الاحتفاظ. يعني إلغاءsubscription_on_holdعادةً فشل بطاقة العميل، وستعيد عملية التجديد التالية منح الوصول. أما إلغاءmanualأوsubscription_cancelledفيكون مقصودًا. تعامل معها بشكل مختلف في رسائل العملاء. - اكتشف التكرارات باستخدام الترويسة
webhook-id، وليسidالخاص بالمنحة. تُصدر المنحةcreatedمرة واحدة، لكن يمكن أن يُطلق كل منdeliveredوrevokedأكثر من مرة، لأن المنحة الملغاة يمكن استعادتها ثم إلغاؤها مرة أخرى. ولا يكونfailedنهائيًا دائمًا: إذ لا يزال من الممكن تسليم منحة OAuth الفاشلة. كما يمكن لإعادة التسليم من نظام webhook أن تكرر حدثًا ما. تخطَّ التكرارات باستخدامwebhook-id، واجعل سجلات المنح الخاصة بك تعتمد علىidالخاص بالمنحة. - اقرأ
integration_typeللتعرف على نوع المنحة. تحمل الحمولةintegration_typeمباشرةً (مثلlicense_keyوdigital_filesوdiscord). تتم تعبئة الكائنين المتداخلينlicense_keyوdigital_product_deliveryبعد تسليم المنحتين المعنيتين؛ بينما تظل منحة مفتاح الترخيص التي تم تنفيذها يدويًا في حالةPendingمعintegration_type: "license_key"وnulllicense_keyإلى أن تنفذها. - بالنسبة إلى المنح المستندة إلى OAuth، اعرض
oauth_urlللعميل. قد يتضمن حدثentitlement_grant.createdلتدفقات المشتركين في Discord أو GitHub أو Notion كلاً منoauth_urlوoauth_expires_at. وإذا كانnull، فانتظر حدثًا لاحقًا أو وجّه العميل إلى Customer Portal. أرسل عنوان URL بالبريد الإلكتروني إلى العميل أو اعرضه في تطبيقك لإتاحة التسليم.
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.