Skip to main content

Sự Kiện Webhook Trao Quyền

Các sự kiện này được kích hoạt mỗi khi quyền của khách hàng thay đổi trạng thái, ví dụ khi một license key được tạo, một vai trò Discord được gán, một liên kết tải xuống được cung cấp hoặc quyền truy cập bị từ chối. Đăng ký các sự kiện này để giữ cho ứng dụng của bạn đồng bộ với những gì mỗi khách hàng có thể truy cập. Cả bốn sự kiện đều chia sẻ cùng một tải trọng EntitlementGrantResponse được tài liệu hóa trong sơ đồ dưới đây.

Kích Hoạt Sự Kiện

entitlement_grant.created

Một hàng grant đã được chèn. Kể từ thời điểm này, grant luôn có id ổn định, ngay cả khi trạng thái thay đổi. Sử dụng event này để ghi nhận rằng quá trình fulfillment đang diễn ra. Đối với license keys được fulfillment tự động và feature flags, hàng được chèn trực tiếp với status: "Delivered" và delivered_at đã được điền, vì vậy một event created duy nhất sẽ không có thêm thay đổi trạng thái nào, trừ khi grant sau đó bị thu hồi. Đối với license key được fulfillment thủ công (entitlement có fulfillment_mode: manual), row được tạo với status: "Pending" và không có object license_key — chưa có key. Event này báo hiệu rằng một key đang chờ fulfillment; hãy cung cấp key qua POST /grants/{grant_id}/license-key, sau đó event entitlement_grant.delivered sẽ được phát. Xem Manual Fulfillment. Đối với mọi integration khác, row được tạo với status: "Pending". Một event delivered hoặc failed sẽ được phát sau khi delivery hoàn tất:
  • Các integration dựa trên OAuth (Discord, GitHub, Notion) sử dụng một oauth_url mà khách hàng phải truy cập để hoàn tất việc cấp quyền. Dodo Payments cố gắng tạo URL này khi grant được tạo, vì vậy entitlement_grant.created có thể bao gồm URL này; nếu là null, URL sẽ được điền khi khách hàng bắt đầu accept flow từ Customer Portal. Grant vẫn ở trạng thái Pending cho đến khi khách hàng cấp quyền.
  • Các integration trực tiếp với platform (Telegram, Framer, Digital Files) chỉ ở trạng thái Pending trong thời gian ngắn khi lời gọi đến platform đang chạy, sau đó chuyển sang Delivered.
Quyền đã chuyển từ pending sang delivered. Khách hàng hiện có quyền truy cập như đã mô tả trong quyền. Sử dụng sự kiện này để mở khóa các tính năng phụ thuộc trong hệ thống của bạn, ví dụ để cung cấp một không gian làm việc, gửi email chào mừng tùy chỉnh hoặc đánh dấu một cờ “đã hoàn thành”. Grant đã chuyển sang Delivered, thường là từ Pending. Khách hàng hiện có quyền truy cập được mô tả trong entitlement. Sử dụng event này để mở khóa các feature phụ thuộc trong hệ thống của bạn, chẳng hạn như provision một workspace, gửi email chào mừng tùy chỉnh hoặc đánh dấu cờ “fulfilled”. Trường delivered_at trong payload ghi nhận thời điểm delivery hoàn tất. delivered được phát bất cứ khi nào trạng thái của một grant hiện có thay đổi thành Delivered: từ Pending, khi một OAuth grant thất bại sau đó thành công, hoặc khi một grant đã bị thu hồi được khôi phục. Grant có trạng thái Delivered ngay khi được tạo, chẳng hạn như license key được fulfillment tự động, chỉ phát created. Giao hàng đã được thử nghiệm nhưng thất bại với lỗi không thể thử lại. Các trường error_code và error_message giải thích lý do thất bại. Nguyên nhân phổ biến bao gồm token OAuth bị thu hồi, quyền nền tảng bị từ chối, hoặc mục tiêu bị thiếu (ví dụ, một guild Discord đã bị xóa).
Xử lý entitlement_grant.failed như một hành động có thể thực hiện. Khách hàng đã thanh toán nhưng không nhận được quyền truy cập. Hiển thị các thất bại cho đội ngũ hỗ trợ của bạn hoặc kích hoạt lại sau khi vấn đề cơ bản được giải quyết.

entitlement_grant.revoked

Quyền truy cập đã bị rút lại ở cấp độ nền tảng: vai trò Discord bị xóa, cộng tác viên GitHub bị xóa, key giấy phép bị vô hiệu hóa, URL tải xuống tệp không còn được cấp phát. Trường revocation_reason ghi lại kích hoạt.

Biến Thể Payload

Trường data luôn là một đối tượng EntitlementGrantResponse. Hai kiểu tích hợp đính kèm thêm các đối tượng con: Trường data luôn là một object EntitlementGrantResponse. Payload chứa một trường integration_type (ví dụ license_key, digital_files, discord) để bạn có thể nhận diện trực tiếp loại grant. Ba loại integration cũng đính kèm các object nested bổ sung:
  • license_key được bao gồm khi integration_type là license_key và một key đã được cấp. Object này chứa key được tạo, thời hạn hết hạn và thông tin sử dụng activation. Đối với grant được fulfillment thủ công vẫn ở trạng thái Pending, object này là null cho đến khi bạn fulfillment grant.
  • digital_product_delivery được bao gồm khi integration_type là digital_files. Object này chứa các URL download presigned, instructions tùy chọn và external_url tùy chọn.
  • feature được bao gồm khi integration_type là feature_flag. Object này chứa feature_type và feature_id của capability được grant cấp.
Đối với tất cả các loại integration khác (Discord, GitHub, Telegram, Figma, Framer, Notion), các field nested này là null; cấu hình liên quan được lưu trong entitlement, không phải trong grant.

Payload Ví Dụ

License key được giao (entitlement_grant.delivered)

License Key đã được giao (entitlement_grant.delivered)

License Key đang chờ fulfillment thủ công (entitlement_grant.created)

Được phát khi customer mua một product có entitlement License Key sử dụng fulfillment_mode: manual. Grant ở trạng thái Pending và chưa có object license_key — merchant phải cung cấp key.

Digital Files đã được giao (entitlement_grant.delivered)

Discord Role đã được tạo và đang chờ xử lý (entitlement_grant.created)

Grant bị thu hồi khi hủy subscription (entitlement_grant.revoked)

Delivery thất bại (entitlement_grant.failed)


Mẹo Tích Hợp

  • Mở khóa các tính năng phụ thuộc khi grant đạt trạng thái Delivered. Một event payment.succeeded cho bạn biết khoản tiền đã được clearing; event này không cho biết khách hàng đã có GitHub repo hoặc Discord role hay chưa. Hãy xử lý entitlement_grant.delivered, đồng thời xử lý entitlement_grant.created cùng với status: "Delivered", vì grant được giao ngay khi tạo sẽ không phát ra event delivered nào.
  • Ánh xạ revocation_reason vào các retention flow. Việc revoke subscription_on_hold thường có nghĩa là thẻ của khách hàng bị từ chối và lần gia hạn tiếp theo sẽ cấp lại quyền truy cập. Việc revoke manual hoặc subscription_cancelled là có chủ đích. Hãy xử lý chúng khác nhau trong thông điệp gửi khách hàng.
  • Phát hiện các bản sao bằng header webhook-id, không phải grant id. Một grant phát ra created một lần, nhưng delivered và revoked có thể mỗi loại được phát ra nhiều lần, vì một grant đã bị revoke có thể được khôi phục rồi lại bị revoke. failed cũng không phải lúc nào cũng là trạng thái cuối: một OAuth grant thất bại vẫn có thể được giao. Việc gửi lại từ hệ thống webhook cũng có thể khiến một event bị lặp lại. Bỏ qua các bản lặp dựa trên webhook-id và dùng grant id làm khóa cho các bản ghi grant của riêng bạn.
  • Đọc integration_type để nhận biết loại grant. Payload chứa trực tiếp integration_type (ví dụ license_key, digital_files, discord). Các object lồng nhau license_key và digital_product_delivery được điền sau khi các grant tương ứng được giao; một license-key grant được hoàn tất thủ công vẫn ở trạng thái Pending với integration_type: "license_key" và một null license_key cho đến khi bạn hoàn tất việc giao.
  • Đối với các OAuth grant, hiển thị oauth_url cho khách hàng. Event entitlement_grant.created trong các subscriber flow của Discord, GitHub hoặc Notion có thể bao gồm một oauth_url và oauth_expires_at. Nếu là null, hãy chờ event tiếp theo hoặc hướng khách hàng đến Customer Portal. Gửi URL qua email cho khách hàng hoặc hiển thị URL trong app của bạn để tiếp tục quá trình giao.

Detailed view of a single entitlement grant: who it's for, its lifecycle state, and any integration-specific delivery payload.

brand_id
string
bắt buộc

Brand id this grant belongs to.

business_id
string
bắt buộc

Identifier of the business that owns the grant.

created_at
string<date-time>
bắt buộc

Timestamp when the grant was created.

customer_id
string
bắt buộc

Identifier of the customer the grant was issued to.

entitlement_id
string
bắt buộc

Identifier of the entitlement this grant was issued from.

id
string
bắt buộc

Unique identifier of the grant.

integration_type
enum<string>
bắt buộc

The integration type of the grant's entitlement (e.g. license_key).

Tùy chọn có sẵn:
discord,
telegram,
github,
figma,
framer,
notion,
digital_files,
license_key,
feature_flag
metadata
Metadata · object
bắt buộc

Arbitrary key-value metadata recorded on the grant.

status
enum<string>
bắt buộc

Lifecycle status of the grant.

Tùy chọn có sẵn:
Pending,
Delivered,
Failed,
Revoked
updated_at
string<date-time>
bắt buộc

Timestamp when the grant was last modified.

delivered_at
string<date-time> | null

Timestamp when the grant transitioned to delivered, when applicable.

digital_product_delivery
null | Digital Product Delivery · object

Digital-product-delivery payload, present when the entitlement integration is digital_files.

error_code
string | null

Machine-readable code reported when delivery failed, when applicable.

error_message
string | null

Human-readable message reported when delivery failed, when applicable.

feature
null | object

Typed feature payload, present only when the entitlement integration is feature_flag; null for every other integration type.

license_key
null | object

License-key delivery payload, present when the entitlement integration is license_key.

oauth_expires_at
string<date-time> | null

Timestamp when oauth_url stops being valid, when applicable.

oauth_url
string | null

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.

payment_id
string | null

Identifier of the payment that triggered this grant, when applicable.

revocation_reason
string | null

Reason recorded when the grant was revoked, when applicable.

revoked_at
string<date-time> | null

Timestamp when the grant transitioned to revoked, when applicable.

subscription_id
string | null

Identifier of the subscription that triggered this grant, when applicable.

Lần sửa đổi cuối 26 tháng 9, 2026