Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.
Entitlements turn a successful payment or active subscription into access: a license key in your customer’s inbox, a feature flag your app checks, a Discord role, a GitHub repository, a Notion template, a Framer remix link, a Telegram chat invite, or a downloadable file bundle. Dodo Payments issues, tracks, and revokes that access automatically as the payment lifecycle changes.
The Entitlements dashboard. Each entitlement is a reusable template; the right pane shows individual customer grants.
An entitlement is a reusable definition of something you deliver to a customer, such as a Pro license key, a “Patrons” Discord role, access to your private GitHub repository, or a downloadable e-book bundle. You attach entitlements to products, and Dodo Payments delivers them when a customer pays.When a customer buys the product, Dodo Payments creates a grant: one customer’s issuance of that entitlement. A grant has one of four statuses: Pending while delivery is in progress, Delivered once the customer has access, Failed if delivery couldn’t complete, and Revoked when access is withdrawn.
Entitlements gate fulfillment (does the customer have access?). Credits gate consumption (how much of it can they use?). You can attach both to the same product. See Credit-Based Billing for credits.
Grants follow the same payment and subscription events that you receive as webhooks. Dodo Payments creates and revokes grants for purchases automatically, based on the payment lifecycle, so you don’t call the grant API yourself.
Dodo Payments creates a grant when a payment completes or a subscription becomes active. Feature-flag grants start as Delivered. License-key grants also start as Delivered when the entitlement uses fulfillment_mode: auto (the default). Under fulfillment_mode: manual, the grant starts as Pending with no key until you supply one with Fulfill License Key Grant. Every other integration starts as Pending.OAuth-based integrations (Discord, GitHub, Notion) expose an oauth_url that the customer visits to give consent. Dodo Payments tries to generate this URL when it creates the grant. If that fails, the field stays null until the customer starts the accept flow from their delivery email or the Customer Portal. Platform-direct integrations (Telegram, Framer, Digital Files) stay Pending only while delivery is provisioned, then move to Delivered.
2
Delivered
When delivery completes, the grant moves to Delivered and delivered_at is set. Delivery is complete when the license key is generated, the role is assigned, the repository access is granted, the file links are resolved, or the OAuth flow is finished.
3
Failed
If the integration call returns a non-retryable error, such as a revoked OAuth token, a denied permission, or a file that no longer exists, the grant moves to Failed. The error_code and error_message fields record the reason.
4
Revoked
When access is withdrawn, for example because a subscription is cancelled, a refund is issued, or you revoke the grant, the grant moves to Revoked. The revocation_reason field records the trigger.
Each payment and subscription event changes grants as follows:
Event
Behavior
payment.succeeded (one-time payment)
Issues one grant per attached entitlement. A License Key entitlement issues one grant per key.
payment.succeeded (subscription-linked payment)
No change. The subscription events below drive these grants.
subscription.active
Issues grants for any attached entitlements that don’t have one yet, and re-grants grants previously revoked for the same subscription. Grants revoked with manual, refund, or platform_external aren’t re-granted.
subscription.renewed
No change. Existing grants persist across renewals.
subscription.past_due
No change. Grants stay delivered for the whole grace period.
subscription.on_hold
Revokes all delivered and pending grants with revocation_reason: subscription_on_hold.
subscription.paused
Revokes all delivered and pending grants with revocation_reason: SubscriptionPaused. Unlike the other subscription reasons, this value uses PascalCase, so match it exactly.
subscription.unpaused
Re-grants grants previously revoked for the same subscription, the same way subscription.active does.
subscription.cancelled
Revokes all grants with revocation_reason: subscription_cancelled.
subscription.expired
Revokes all grants with revocation_reason: subscription_expired.
subscription.plan_changed
Revokes all current grants with revocation_reason: plan_changed, then issues grants for the new plan’s entitlements.
refund.succeeded (one-time payment)
Revokes the grants for that payment with revocation_reason: refund.
Manual API revoke
Revokes the grant with revocation_reason: manual. Manual revokes aren’t re-granted automatically on subscription renewal.
License key disabled
For license-key grants, disabling the underlying key revokes the grant with revocation_reason: license_key_disabled. Re-enabling the key restores the grant automatically.
Platform drift detected
If the platform side of an integration drifts out of sync, such as a Discord role removed manually, the GitHub App losing repository access, or a reconciliation pass finding a missing target, Dodo Payments revokes the grant with revocation_reason: platform_external. It isn’t re-granted automatically on subscription renewal until the platform issue is resolved.
Subscription-driven grants are idempotent per (entitlement, customer, subscription), so renewals and re-activations don’t create duplicate grants. One-time grants are idempotent per (entitlement, customer, payment).
Go to Entitlements in the dashboard and click + to create an entitlement.
2
Pick an Integration
Choose the integration type: License Key, Digital Files, Feature Flag, Discord, GitHub, Telegram, Figma, Framer, or Notion. For a platform integration, connect your account first if you haven’t already.
3
Configure Delivery
Fill in the fields for the integration. For example, GitHub asks for a repository and a permission level, Discord asks for a server and an optional role, and License Key asks for an activations limit and a license length.
Creating a GitHub entitlement. Each integration shows the fields it needs.
4
Save
Click Create Entitlement. You can now attach the entitlement to any product.
Open a product, go to its Entitlements section, and select the entitlements to deliver when the product is purchased. One product can deliver several entitlements at once. For example, a Pro plan can include a license key, GitHub access, and a Discord role.
Attaching entitlements to a product. Selected entitlements are delivered on every successful purchase or active subscription.
After a purchase, the customer receives a delivery email with the license key, download links, OAuth invitation links, or platform invite that applies to the entitlements on the product. The same details stay available in the Customer Portal, under their order history, while the grant is active.
Discord, GitHub, and Notion subscriber access requires the customer to authorize Dodo Payments to grant that access. These grants stay Pending until the customer completes the OAuth flow from the link in their email or the Customer Portal. After the customer authorizes, the grant moves to Delivered and Dodo Payments provisions the platform access.
When a grant is revoked, Dodo Payments removes the access on the platform: it removes the Discord role, removes the GitHub collaborator, or disables the license key. The customer sees the change in the Customer Portal.
For Digital Files, revocation stops new presigned download URLs, but it doesn’t invalidate copies that a customer has already downloaded. Plan your content gating with this in mind.
Open any entitlement from the dashboard to see its grants. The detail panel shows the total granted, a status filter, and one row per grant with the customer, the date accessed, the status, and a Revoke action.To manage grants programmatically, list them with the status filter and revoke a single grant by ID:
import DodoPayments from 'dodopayments';const client = new DodoPayments({ bearerToken: process.env['DODO_PAYMENTS_API_KEY'],});// List grants for an entitlementconst grants = await client.entitlements.grants.list('ent_abc123', { status: 'Delivered',});// Revoke a single grantawait client.entitlements.grants.revoke('entg_xyz789', { id: 'ent_abc123',});
Dodo Payments sends four webhook events for the grant lifecycle. Subscribe to them to keep your application in sync with what each customer can access.
Event
Fires when
entitlement_grant.created
A grant is created. Auto-fulfilled license-key grants and feature-flag grants arrive Delivered. Manually fulfilled license-key grants and every other integration arrive Pending, then move to Delivered once the platform call succeeds or, for OAuth-based integrations, once the customer authorizes.
entitlement_grant.delivered
An existing grant moves to Delivered, so the customer now has access. A grant that is Delivered on creation fires only created.
entitlement_grant.failed
The grant couldn’t be delivered. Inspect error_code and error_message.
entitlement_grant.revoked
Access has been withdrawn. Inspect revocation_reason.
Entitlement Grant Webhook Payloads
View the full payload schema, sample events, and revocation_reason reference.
Use one entitlement per delivery channel. Don’t share one Discord entitlement across products with different role intentions. Create one entitlement per role, so revocation stays clean.
Test in test mode first. Create the entitlement, attach it to a test product, run a checkout, and watch the grant move from Pending to Delivered. Then cancel the test subscription and confirm that the grant is revoked.
Listen to entitlement_grant.delivered, not payment.succeeded. A payment can succeed before fulfillment finishes, especially for OAuth flows. Wait for the grant to reach Delivered before you unlock dependent features in your own systems. A grant that is delivered on creation, such as an auto-fulfilled license key or a feature flag, arrives as entitlement_grant.created with status: "Delivered" instead.
Treat entitlement_grant.failed as actionable. A failed grant means a customer paid but didn’t get access. Surface these grants to your support team or trigger a re-grant.
Map revocation_reason to your retention flows. A subscription_on_hold revoke is recoverable, because the customer may update their card. A manual revoke is intentional. Treat them differently in customer messages.
Do not revoke access on subscription.past_due. That event opens a grace period, and the customer keeps access until the window ends. Wait for subscription.on_hold or subscription.cancelled.
Last modified on November 6, 2026
Was this page helpful?
⌘I
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Dodo Payments Documentation","description":"Documentation for Dodo Payments — the all-in-one payments, billing, and merchant of record platform for SaaS, AI, and digital products.","colors":{"primary":"#779812","light":"#C6FE1E","dark":"#166534"},"logo":{"light":"https://mintcdn.com/dodopayments/nM_mJfYkri-OpC5M/logo/light.svg?fit=max\u0026auto=format\u0026n=nM_mJfYkri-OpC5M\u0026q=85\u0026s=23f7a052f7ecb9d6570b7c95ee359a97","dark":"https://mintcdn.com/dodopayments/nM_mJfYkri-OpC5M/logo/dark.svg?fit=max\u0026auto=format\u0026n=nM_mJfYkri-OpC5M\u0026q=85\u0026s=cd6c20238a54526436f21c43fee51b26"},"favicon":"https://mintcdn.com/dodopayments/doYQc9oUE-WNz0cs/favicon.svg?fit=max\u0026auto=format\u0026n=doYQc9oUE-WNz0cs\u0026q=85\u0026s=271c6cc8ce7d6bf4d7f2b9cca029e004","background":{"color":{"light":"#FFFFFF","dark":"#0D0D0D"}},"navbar":{"links":[{"icon":"link","href":"https://docs.dodopayments.com/llms-full.txt","label":"llms-full.txt"},{"icon":"discord","href":"https://discord.gg/bYqAp4ayYh","label":"Community"},{"icon":"house","href":"https://app.dodopayments.com/","label":"Dashboard"}]},"footer":{"socials":{"x":"https://x.com/dodopayments","linkedin":"https://linkedin.com/company/dodopayments","website":"https://dodopayments.com","discord":"https://discord.gg/bYqAp4ayYh","github":"https://github.com/dodopayments","instagram":"https://www.instagram.com/dodo.payments","facebook":"https://www.facebook.com/profile.php?id=61565515607280"}},"seo":{"metatags":{"og:site_name":"Dodo Payments Documentation","twitter:card":"summary_large_image"},"indexing":"navigable"},"fonts":{"heading":{"family":"ApfelGrotezk","weight":400,"source":"fonts/ApfelGrotezk-Regular.woff2","format":"woff2"},"body":{"family":"Inter","weight":400,"source":"fonts/Inter-Variable.woff2","format":"woff2"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","cursor"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":"introduction"},{"language":"es","href":"es/introduction"},{"language":"ar","href":"ar/introduction"},{"language":"fr","href":"fr/introduction"},{"language":"de","href":"de/introduction"},{"language":"id","href":"id/introduction"},{"language":"ja","href":"ja/introduction"},{"language":"ko","href":"ko/introduction"},{"language":"pt-BR","href":"pt-BR/introduction"},{"language":"vi","href":"vi/introduction"},{"language":"cn","href":"cn/introduction"},{"language":"hi","href":"hi/introduction"},{"language":"it","href":"it/introduction"},{"language":"sv","href":"sv/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dodopayments","hasAudioNarration":false,"actualSubdomain":"dodopayments","customDomains":["docs.dodopayments.com"],"gitSource":{"type":"github","owner":"dodopayments","repo":"dodo-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af2d0a118316a0dfc1e077b","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"en","tag":"API Reference","count":181},{"language":"en","tag":"Docs","count":175},{"language":"ar","tag":"Docs","count":153},{"language":"cn","tag":"Docs","count":153},{"language":"de","tag":"Docs","count":153},{"language":"es","tag":"Docs","count":153},{"language":"fr","tag":"Docs","count":153},{"language":"hi","tag":"Docs","count":153},{"language":"id","tag":"Docs","count":153},{"language":"it","tag":"Docs","count":153},{"language":"ja","tag":"Docs","count":153},{"language":"ko","tag":"Docs","count":153},{"language":"pt-BR","tag":"Docs","count":153},{"language":"sv","tag":"Docs","count":153},{"language":"vi","tag":"Docs","count":153},{"language":"ar","tag":"API Reference","count":151},{"language":"cn","tag":"API Reference","count":151},{"language":"de","tag":"API Reference","count":151},{"language":"es","tag":"API Reference","count":151},{"language":"fr","tag":"API Reference","count":151},{"language":"hi","tag":"API Reference","count":151},{"language":"id","tag":"API Reference","count":151},{"language":"it","tag":"API Reference","count":151},{"language":"ja","tag":"API Reference","count":151},{"language":"ko","tag":"API Reference","count":151},{"language":"pt-BR","tag":"API Reference","count":151},{"language":"sv","tag":"API Reference","count":151},{"language":"vi","tag":"API Reference","count":151},{"language":"en","tag":"Features","count":85},{"language":"ar","tag":"Features","count":81},{"language":"cn","tag":"Features","count":81},{"language":"de","tag":"Features","count":81},{"language":"es","tag":"Features","count":81},{"language":"fr","tag":"Features","count":81},{"language":"hi","tag":"Features","count":81},{"language":"id","tag":"Features","count":81},{"language":"it","tag":"Features","count":81},{"language":"ja","tag":"Features","count":81},{"language":"ko","tag":"Features","count":81},{"language":"pt-BR","tag":"Features","count":81},{"language":"sv","tag":"Features","count":81},{"language":"vi","tag":"Features","count":81},{"language":"en","tag":"Integrate","count":74},{"language":"en","tag":"Changelog","count":66},{"language":"ar","tag":"Changelog","count":65},{"language":"cn","tag":"Changelog","count":65},{"language":"de","tag":"Changelog","count":65},{"language":"es","tag":"Changelog","count":65},{"language":"fr","tag":"Changelog","count":65},{"language":"hi","tag":"Changelog","count":65},{"language":"id","tag":"Changelog","count":65},{"language":"it","tag":"Changelog","count":65},{"language":"ja","tag":"Changelog","count":65},{"language":"ko","tag":"Changelog","count":65},{"language":"pt-BR","tag":"Changelog","count":65},{"language":"sv","tag":"Changelog","count":65},{"language":"vi","tag":"Changelog","count":65},{"language":"ar","tag":"Integrate","count":59},{"language":"cn","tag":"Integrate","count":59},{"language":"de","tag":"Integrate","count":59},{"language":"es","tag":"Integrate","count":59},{"language":"fr","tag":"Integrate","count":59},{"language":"hi","tag":"Integrate","count":59},{"language":"id","tag":"Integrate","count":59},{"language":"it","tag":"Integrate","count":59},{"language":"ja","tag":"Integrate","count":59},{"language":"ko","tag":"Integrate","count":59},{"language":"pt-BR","tag":"Integrate","count":59},{"language":"sv","tag":"Integrate","count":59},{"language":"vi","tag":"Integrate","count":59},{"language":"en","tag":"External Integrations","count":33},{"language":"ar","tag":"External Integrations","count":30},{"language":"cn","tag":"External Integrations","count":30},{"language":"de","tag":"External Integrations","count":30},{"language":"es","tag":"External Integrations","count":30},{"language":"fr","tag":"External Integrations","count":30},{"language":"hi","tag":"External Integrations","count":30},{"language":"id","tag":"External Integrations","count":30},{"language":"it","tag":"External Integrations","count":30},{"language":"ja","tag":"External Integrations","count":30},{"language":"ko","tag":"External Integrations","count":30},{"language":"pt-BR","tag":"External Integrations","count":30},{"language":"sv","tag":"External Integrations","count":30},{"language":"vi","tag":"External Integrations","count":30},{"language":"en","tag":"Webhooks","count":23},{"language":"ar","tag":"Webhooks","count":23},{"language":"cn","tag":"Webhooks","count":23},{"language":"de","tag":"Webhooks","count":23},{"language":"es","tag":"Webhooks","count":23},{"language":"fr","tag":"Webhooks","count":23},{"language":"hi","tag":"Webhooks","count":23},{"language":"id","tag":"Webhooks","count":23},{"language":"it","tag":"Webhooks","count":23},{"language":"ja","tag":"Webhooks","count":23},{"language":"ko","tag":"Webhooks","count":23},{"language":"pt-BR","tag":"Webhooks","count":23},{"language":"sv","tag":"Webhooks","count":23},{"language":"vi","tag":"Webhooks","count":23},{"language":"en","tag":"Guides","count":22},{"language":"ar","tag":"Guides","count":22},{"language":"cn","tag":"Guides","count":22},{"language":"de","tag":"Guides","count":22},{"language":"es","tag":"Guides","count":22},{"language":"fr","tag":"Guides","count":22},{"language":"hi","tag":"Guides","count":22},{"language":"id","tag":"Guides","count":22},{"language":"it","tag":"Guides","count":22},{"language":"ja","tag":"Guides","count":22},{"language":"ko","tag":"Guides","count":22},{"language":"pt-BR","tag":"Guides","count":22},{"language":"sv","tag":"Guides","count":22},{"language":"vi","tag":"Guides","count":22},{"language":"en","tag":"Entitlements","count":20},{"language":"ar","tag":"Entitlements","count":20},{"language":"cn","tag":"Entitlements","count":20},{"language":"de","tag":"Entitlements","count":20},{"language":"es","tag":"Entitlements","count":20},{"language":"fr","tag":"Entitlements","count":20},{"language":"hi","tag":"Entitlements","count":20},{"language":"id","tag":"Entitlements","count":20},{"language":"it","tag":"Entitlements","count":20},{"language":"ja","tag":"Entitlements","count":20},{"language":"ko","tag":"Entitlements","count":20},{"language":"pt-BR","tag":"Entitlements","count":20},{"language":"sv","tag":"Entitlements","count":20},{"language":"vi","tag":"Entitlements","count":20},{"language":"en","tag":"Invoices","count":17},{"language":"ar","tag":"Customers","count":16},{"language":"cn","tag":"Customers","count":16},{"language":"de","tag":"Customers","count":16},{"language":"es","tag":"Customers","count":16},{"language":"fr","tag":"Customers","count":16},{"language":"hi","tag":"Customers","count":16},{"language":"id","tag":"Customers","count":16},{"language":"it","tag":"Customers","count":16},{"language":"ja","tag":"Customers","count":16},{"language":"ko","tag":"Customers","count":16},{"language":"pt-BR","tag":"Customers","count":16},{"language":"sv","tag":"Customers","count":16},{"language":"vi","tag":"Customers","count":16}]},"assistantConfig":{"deflection":{"enabled":false,"email":"support@dodopayments.com","showHelpButton":true}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":"#content-area{max-width:60rem}h1,h2,h3,h4,h5,h6{letter-spacing:0.05em!important}.welcome-page .card-group{margin:3rem auto 8rem;max-width:70rem;padding-left:1.25rem;padding-right:1.25rem}.welcome-page .card-group .card{padding:1rem}.welcome-hero{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:20vh;text-align:center;margin-top:3rem;margin-bottom:2.5rem}.welcome-hero h1{font-size:2.5rem;font-weight:700;margin-bottom:1rem;line-height:1.2;color:#fff}.welcome-hero p{font-size:1.25rem;max-width:600px;margin:0 auto}.welcome-hero h1{color:rgb(41 42 37 / 1)}.dark .welcome-hero h1{color:rgb(255 255 255 / 1)}.welcome-hero p{color:rgb(83 85 79 / 1)}.dark .welcome-hero p{color:rgb(162 164 158 / 1)}"}],"page":{"pagePath":"features/entitlements/introduction","slug":"/features/entitlements/introduction","pageMetadata":{"title":"Introduction","sidebarTitle":"Introduction","description":"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.","icon":"box-archive","keywords":["Dodo Payments","entitlements","fulfillment","license keys","digital delivery","platform access"],"href":"/features/entitlements/introduction"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,CodeGroup,Frame,Heading,Info,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsx(_components.p,{children:`Entitlements turn a successful payment or active subscription into access: a license key in your customer’s inbox, a feature flag your app checks, a Discord role, a GitHub repository, a Notion template, a Framer remix link, a Telegram chat invite, or a downloadable file bundle. Dodo Payments issues, tracks, and revokes that access automatically as the payment lifecycle changes.`})}),`\n`,_jsx(Frame,{caption:`The Entitlements dashboard. Each entitlement is a reusable template; the right pane shows individual customer grants.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=12a326205f64d1e71485bce46114d296`,alt:`Entitlements dashboard with a list of entitlements on the left and grant activity on the right`,style:{maxHeight:`500px`,width:`auto`},\"data-og-width\":`2000`,width:`2000`,\"data-og-height\":`1195`,height:`1195`,\"data-path\":`images/entitlements/list.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?w=280\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=d12b37e6f3daedbb84e544d08513207e 280w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?w=560\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=70afcf57fcdd38039179d3054a5eb73f 560w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?w=840\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=b1cb6ba70f564db87c9bd19f50b21f44 840w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?w=1100\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=463a9ba560357d16a43e39c23ea5a042 1100w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?w=1650\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=8b695099d64c9bc75bef9fa1bef28541 1650w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?w=2500\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=9e86c8dff013279ce9c94de2b5d48338 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`what-are-entitlements`,children:`What Are Entitlements?`}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.strong,{children:`entitlement`}),` is a reusable definition of something you deliver to a customer, such as a Pro license key, a “Patrons” Discord role, access to your private GitHub repository, or a downloadable e-book bundle. You attach entitlements to products, and Dodo Payments delivers them when a customer pays.`]}),`\n`,_jsxs(_components.p,{children:[`When a customer buys the product, Dodo Payments creates a `,_jsx(_components.strong,{children:`grant`}),`: one customer’s issuance of that entitlement. A grant has one of four statuses: `,_jsx(_components.code,{children:`Pending`}),` while delivery is in progress, `,_jsx(_components.code,{children:`Delivered`}),` once the customer has access, `,_jsx(_components.code,{children:`Failed`}),` if delivery couldn’t complete, and `,_jsx(_components.code,{children:`Revoked`}),` when access is withdrawn.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Entitlements gate `,_jsx(_components.strong,{children:`fulfillment`}),` (does the customer have access?). Credits gate `,_jsx(_components.strong,{children:`consumption`}),` (how much of it can they use?). You can attach both to the same product. See `,_jsx(_components.a,{href:`/features/credit-based-billing`,children:`Credit-Based Billing`}),` for credits.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`available-integrations`,children:`Available Integrations`}),`\n`,_jsx(_components.p,{children:`Each entitlement delivers through one integration. Pick the integration that matches what you sell.`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`License Keys`,icon:`key`,href:`/features/license-keys`,children:_jsx(_components.p,{children:`Generate unique license keys with activation limits and expiry. Best for software, plugins, and CLIs.`})}),_jsx(Card,{title:`Digital Files`,icon:`download`,href:`/features/digital-product-delivery`,children:_jsx(_components.p,{children:`Deliver downloadable files, such as e-books, templates, and media, with presigned download URLs and optional instructions.`})}),_jsx(Card,{title:`Feature Flags`,icon:`flag`,href:`/features/entitlements/feature-flags`,children:_jsx(_components.p,{children:`Gate features in your own app on a purchase. Delivered on creation, checked through the API, and revoked on cancellation.`})}),_jsx(Card,{title:`Discord`,icon:`discord`,href:`/features/entitlements/discord`,children:_jsx(_components.p,{children:`Give a customer a role in your Discord server when they buy. The role is removed automatically on cancellation.`})}),_jsx(Card,{title:`GitHub`,icon:`github`,href:`/features/entitlements/github`,children:_jsx(_components.p,{children:`Add customers as collaborators to a private repository at the permission level you choose.`})}),_jsx(Card,{title:`Telegram`,icon:`telegram`,href:`/features/entitlements/telegram`,children:_jsx(_components.p,{children:`Add customers to a private Telegram chat or channel after purchase.`})}),_jsx(Card,{title:`Framer`,icon:`puzzle-piece`,href:`/features/entitlements/framer`,children:_jsx(_components.p,{children:`Unlock a Framer template remix link for paying customers.`})}),_jsx(Card,{title:`Notion`,icon:`book`,href:`/features/entitlements/notion`,children:_jsx(_components.p,{children:`Duplicate a Notion template into the customer’s workspace on purchase.`})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`how-grants-work`,children:`How Grants Work`}),`\n`,_jsx(_components.p,{children:`Grants follow the same payment and subscription events that you receive as webhooks. Dodo Payments creates and revokes grants for purchases automatically, based on the payment lifecycle, so you don’t call the grant API yourself.`}),`\n`,_jsx(Heading,{level:`3`,id:`grant-lifecycle`,children:`Grant Lifecycle`}),`\n`,_jsx(_components.p,{children:`A grant moves through these statuses:`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Created`,children:[_jsxs(_components.p,{children:[`Dodo Payments creates a grant when a payment completes or a subscription becomes active. Feature-flag grants start as `,_jsx(_components.code,{children:`Delivered`}),`. License-key grants also start as `,_jsx(_components.code,{children:`Delivered`}),` when the entitlement uses `,_jsx(_components.code,{children:`fulfillment_mode: auto`}),` (the default). Under `,_jsx(_components.code,{children:`fulfillment_mode: manual`}),`, the grant starts as `,_jsx(_components.code,{children:`Pending`}),` with no key until you supply one with `,_jsx(_components.a,{href:`/api-reference/entitlements/fulfill-license-key`,children:`Fulfill License Key Grant`}),`. Every other integration starts as `,_jsx(_components.code,{children:`Pending`}),`.`]}),_jsxs(_components.p,{children:[`OAuth-based integrations (Discord, GitHub, Notion) expose an `,_jsx(_components.code,{children:`oauth_url`}),` that the customer visits to give consent. Dodo Payments tries to generate this URL when it creates the grant. If that fails, the field stays `,_jsx(_components.code,{children:`null`}),` until the customer starts the accept flow from their delivery email or the Customer Portal. Platform-direct integrations (Telegram, Framer, Digital Files) stay `,_jsx(_components.code,{children:`Pending`}),` only while delivery is provisioned, then move to `,_jsx(_components.code,{children:`Delivered`}),`.`]})]}),_jsx(Step,{title:`Delivered`,children:_jsxs(_components.p,{children:[`When delivery completes, the grant moves to `,_jsx(_components.code,{children:`Delivered`}),` and `,_jsx(_components.code,{children:`delivered_at`}),` is set. Delivery is complete when the license key is generated, the role is assigned, the repository access is granted, the file links are resolved, or the OAuth flow is finished.`]})}),_jsx(Step,{title:`Failed`,children:_jsxs(_components.p,{children:[`If the integration call returns a non-retryable error, such as a revoked OAuth token, a denied permission, or a file that no longer exists, the grant moves to `,_jsx(_components.code,{children:`Failed`}),`. The `,_jsx(_components.code,{children:`error_code`}),` and `,_jsx(_components.code,{children:`error_message`}),` fields record the reason.`]})}),_jsx(Step,{title:`Revoked`,children:_jsxs(_components.p,{children:[`When access is withdrawn, for example because a subscription is cancelled, a refund is issued, or you revoke the grant, the grant moves to `,_jsx(_components.code,{children:`Revoked`}),`. The `,_jsx(_components.code,{children:`revocation_reason`}),` field records the trigger.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`grant-behavior-by-event`,children:`Grant Behavior by Event`}),`\n`,_jsx(_components.p,{children:`Each payment and subscription event changes grants as follows:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Behavior`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`payment.succeeded`}),` (one-time payment)`]}),_jsx(_components.td,{children:`Issues one grant per attached entitlement. A License Key entitlement issues one grant per key.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`payment.succeeded`}),` (subscription-linked payment)`]}),_jsx(_components.td,{children:`No change. The subscription events below drive these grants.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.active`})}),_jsxs(_components.td,{children:[`Issues grants for any attached entitlements that don’t have one yet, and re-grants grants previously revoked for the same subscription. Grants revoked with `,_jsx(_components.code,{children:`manual`}),`, `,_jsx(_components.code,{children:`refund`}),`, or `,_jsx(_components.code,{children:`platform_external`}),` aren’t re-granted.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.renewed`})}),_jsx(_components.td,{children:`No change. Existing grants persist across renewals.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.past_due`})}),_jsxs(_components.td,{children:[`No change. Grants stay delivered for the whole `,_jsx(_components.a,{href:`/features/subscription#grace-period`,children:`grace period`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.on_hold`})}),_jsxs(_components.td,{children:[`Revokes all delivered and pending grants with `,_jsx(_components.code,{children:`revocation_reason: subscription_on_hold`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.paused`})}),_jsxs(_components.td,{children:[`Revokes all delivered and pending grants with `,_jsx(_components.code,{children:`revocation_reason: SubscriptionPaused`}),`. Unlike the other subscription reasons, this value uses PascalCase, so match it exactly.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.unpaused`})}),_jsxs(_components.td,{children:[`Re-grants grants previously revoked for the same subscription, the same way `,_jsx(_components.code,{children:`subscription.active`}),` does.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.cancelled`})}),_jsxs(_components.td,{children:[`Revokes all grants with `,_jsx(_components.code,{children:`revocation_reason: subscription_cancelled`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.expired`})}),_jsxs(_components.td,{children:[`Revokes all grants with `,_jsx(_components.code,{children:`revocation_reason: subscription_expired`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`subscription.plan_changed`})}),_jsxs(_components.td,{children:[`Revokes all current grants with `,_jsx(_components.code,{children:`revocation_reason: plan_changed`}),`, then issues grants for the new plan’s entitlements.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`refund.succeeded`}),` (one-time payment)`]}),_jsxs(_components.td,{children:[`Revokes the grants for that payment with `,_jsx(_components.code,{children:`revocation_reason: refund`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Manual API revoke`}),_jsxs(_components.td,{children:[`Revokes the grant with `,_jsx(_components.code,{children:`revocation_reason: manual`}),`. Manual revokes aren’t re-granted automatically on subscription renewal.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`License key disabled`}),_jsxs(_components.td,{children:[`For license-key grants, disabling the underlying key revokes the grant with `,_jsx(_components.code,{children:`revocation_reason: license_key_disabled`}),`. Re-enabling the key restores the grant automatically.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Platform drift detected`}),_jsxs(_components.td,{children:[`If the platform side of an integration drifts out of sync, such as a Discord role removed manually, the GitHub App losing repository access, or a reconciliation pass finding a missing target, Dodo Payments revokes the grant with `,_jsx(_components.code,{children:`revocation_reason: platform_external`}),`. It isn’t re-granted automatically on subscription renewal until the platform issue is resolved.`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Subscription-driven grants are idempotent per `,_jsx(_components.code,{children:`(entitlement, customer, subscription)`}),`, so renewals and re-activations don’t create duplicate grants. One-time grants are idempotent per `,_jsx(_components.code,{children:`(entitlement, customer, payment)`}),`.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`create-your-first-entitlement`,children:`Create Your First Entitlement`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open Entitlements`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Entitlements`}),` in the dashboard and click `,_jsx(_components.strong,{children:`+`}),` to create an entitlement.`]})}),_jsx(Step,{title:`Pick an Integration`,children:_jsx(_components.p,{children:`Choose the integration type: License Key, Digital Files, Feature Flag, Discord, GitHub, Telegram, Figma, Framer, or Notion. For a platform integration, connect your account first if you haven’t already.`})}),_jsxs(Step,{title:`Configure Delivery`,children:[_jsx(_components.p,{children:`Fill in the fields for the integration. For example, GitHub asks for a repository and a permission level, Discord asks for a server and an optional role, and License Key asks for an activations limit and a license length.`}),_jsx(Frame,{caption:`Creating a GitHub entitlement. Each integration shows the fields it needs.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=722e925ec5158a5d16c58213132ccb9d`,alt:`New Entitlement form with integration selector and configuration fields`,style:{maxHeight:`500px`,width:`auto`},\"data-og-width\":`2000`,width:`2000`,\"data-og-height\":`1130`,height:`1130`,\"data-path\":`images/entitlements/github/create.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?w=280\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=27f80ec98d393359ca3136524a0ad9d8 280w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?w=560\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=6cf0a907fa86298b9ad896b1a604fa0b 560w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?w=840\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=a34a563dad17160d3c13067e3a349f3c 840w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?w=1100\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=fc893072e5f07d021b962b0bdd87933c 1100w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?w=1650\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=222cfaf3c0ac63f69d8494d7387d3e22 1650w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?w=2500\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=f6b547a74f61c76b6735d3e92c4960d8 2500w`})})]}),_jsx(Step,{title:`Save`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Create Entitlement`}),`. You can now attach the entitlement to any product.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`attach-entitlements-to-products`,children:`Attach Entitlements to Products`}),`\n`,_jsxs(_components.p,{children:[`Open a product, go to its `,_jsx(_components.strong,{children:`Entitlements`}),` section, and select the entitlements to deliver when the product is purchased. One product can deliver several entitlements at once. For example, a Pro plan can include a license key, GitHub access, and a Discord role.`]}),`\n`,_jsx(Frame,{caption:`Attaching entitlements to a product. Selected entitlements are delivered on every successful purchase or active subscription.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=965ad78262791fa8dbb712b4fdf89538`,alt:`Product entitlement selection panel showing checkboxes for each available entitlement`,style:{maxHeight:`500px`,width:`auto`},\"data-og-width\":`2000`,width:`2000`,\"data-og-height\":`1197`,height:`1197`,\"data-path\":`images/entitlements/attach-to-product.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?w=280\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=4b98785a408414890f3247f318c96740 280w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?w=560\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=64f89fb68e337ec53ff48c75f0c4dc4e 560w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?w=840\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=2c289e402cf161b27d7c0f90b81ccd6f 840w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?w=1100\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=0632a046cb6d1c5e6529f3d63911f5d8 1100w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?w=1650\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=7e9d6f96690fcd3e53eebef77df2d279 1650w, https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?w=2500\u0026fit=max\u0026auto=format\u0026n=do-W-dMDGVB_xzr_\u0026q=85\u0026s=adbc6c5a189350107f9faf43b2a47224 2500w`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`customer-experience`,children:`Customer Experience`}),`\n`,_jsx(Heading,{level:`3`,id:`email-and-customer-portal`,children:`Email and Customer Portal`}),`\n`,_jsxs(_components.p,{children:[`After a purchase, the customer receives a delivery email with the license key, download links, OAuth invitation links, or platform invite that applies to the entitlements on the product. The same details stay available in the `,_jsx(_components.a,{href:`/features/customer-portal`,children:`Customer Portal`}),`, under their order history, while the grant is active.`]}),`\n`,_jsx(Heading,{level:`3`,id:`oauth-based-delivery`,children:`OAuth-Based Delivery`}),`\n`,_jsxs(_components.p,{children:[`Discord, GitHub, and Notion subscriber access requires the customer to authorize Dodo Payments to grant that access. These grants stay `,_jsx(_components.code,{children:`Pending`}),` until the customer completes the OAuth flow from the link in their email or the Customer Portal. After the customer authorizes, the grant moves to `,_jsx(_components.code,{children:`Delivered`}),` and Dodo Payments provisions the platform access.`]}),`\n`,_jsx(Heading,{level:`3`,id:`revocation`,children:`Revocation`}),`\n`,_jsx(_components.p,{children:`When a grant is revoked, Dodo Payments removes the access on the platform: it removes the Discord role, removes the GitHub collaborator, or disables the license key. The customer sees the change in the Customer Portal.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`For Digital Files, revocation stops new presigned download URLs, but it doesn’t invalidate copies that a customer has already downloaded. Plan your content gating with this in mind.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`manage-grants`,children:`Manage Grants`}),`\n`,_jsxs(_components.p,{children:[`Open any entitlement from the dashboard to see its grants. The detail panel shows the total granted, a status filter, and one row per grant with the customer, the date accessed, the status, and a `,_jsx(_components.strong,{children:`Revoke`}),` action.`]}),`\n`,_jsxs(_components.p,{children:[`To manage grants programmatically, list them with the `,_jsx(_components.code,{children:`status`}),` filter and revoke a single grant by ID:`]}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`TypeScript`,expandable:`true`,numberOfLines:`15`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` DodoPayments`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'dodopayments'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` client`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` DodoPayments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` bearerToken:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'DODO_PAYMENTS_API_KEY'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// List grants for an entitlement`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` grants`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`entitlements`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`grants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`list`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'ent_abc123'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` status:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Delivered'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Revoke a single grant`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`entitlements`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`grants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`revoke`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'entg_xyz789'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` id:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'ent_abc123'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Python`,expandable:`true`,numberOfLines:`10`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Assumes client = DodoPayments(bearer_token=os.environ[\"DODO_PAYMENTS_API_KEY\"])`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`grants `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` client.entitlements.grants.list(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ent_abc123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` status`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Delivered\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`client.entitlements.grants.revoke(`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"entg_xyz789\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ent_abc123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Go`,expandable:`true`,numberOfLines:`13`,language:`go`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`go`,children:_jsxs(_components.code,{language:`go`,numberOfLines:`13`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Assumes client := dodopayments.NewClient() and ctx := context.Background().`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`grants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` :=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Entitlements`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Grants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`List`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` ctx`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ent_abc123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` dodopayments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:`EntitlementGrantListParams`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`dodopayments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`F`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`dodopayments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`EntitlementGrantListParamsStatusDelivered`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` err`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` !=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` nil`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` panic`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`Error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`())`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`fmt`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`Println`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`len`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`grants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Items`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`))`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`_`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Entitlements`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Grants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`Revoke`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ctx`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ent_abc123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"entg_xyz789\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`api-management`,children:`API Management`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Create Entitlement`,icon:`plus`,href:`/api-reference/entitlements/create-entitlement`,children:_jsx(_components.p,{children:`Create an entitlement of any integration type.`})}),_jsx(Card,{title:`List Entitlements`,icon:`list`,href:`/api-reference/entitlements/list-entitlements`,children:_jsx(_components.p,{children:`List entitlements, filtered by integration type.`})}),_jsx(Card,{title:`Get Entitlement`,icon:`magnifying-glass`,href:`/api-reference/entitlements/get-entitlement`,children:_jsx(_components.p,{children:`Retrieve an entitlement and its resolved configuration.`})}),_jsx(Card,{title:`Update Entitlement`,icon:`pen`,href:`/api-reference/entitlements/update-entitlement`,children:_jsx(_components.p,{children:`Update the name, description, or integration configuration.`})}),_jsx(Card,{title:`Delete Entitlement`,icon:`trash`,href:`/api-reference/entitlements/delete-entitlement`,children:_jsx(_components.p,{children:`Soft-delete an entitlement. Existing grants aren’t revoked, but Dodo Payments no longer manages them.`})}),_jsx(Card,{title:`Upload File`,icon:`upload`,href:`/api-reference/entitlements/upload-file`,children:_jsx(_components.p,{children:`Upload a file of up to 100 MB to a Digital Files entitlement.`})}),_jsx(Card,{title:`List Grants`,icon:`users`,href:`/api-reference/entitlements/list-grants`,children:_jsx(_components.p,{children:`List an entitlement’s grants, filtered by status and customer.`})}),_jsx(Card,{title:`Revoke Grant`,icon:`ban`,href:`/api-reference/entitlements/revoke-grant`,children:_jsx(_components.p,{children:`Revoke a single grant manually.`})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`webhooks`,children:`Webhooks`}),`\n`,_jsx(_components.p,{children:`Dodo Payments sends four webhook events for the grant lifecycle. Subscribe to them to keep your application in sync with what each customer can access.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Fires when`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`entitlement_grant.created`})}),_jsxs(_components.td,{children:[`A grant is created. Auto-fulfilled license-key grants and feature-flag grants arrive `,_jsx(_components.code,{children:`Delivered`}),`. Manually fulfilled license-key grants and every other integration arrive `,_jsx(_components.code,{children:`Pending`}),`, then move to `,_jsx(_components.code,{children:`Delivered`}),` once the platform call succeeds or, for OAuth-based integrations, once the customer authorizes.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`entitlement_grant.delivered`})}),_jsxs(_components.td,{children:[`An existing grant moves to `,_jsx(_components.code,{children:`Delivered`}),`, so the customer now has access. A grant that is `,_jsx(_components.code,{children:`Delivered`}),` on creation fires only `,_jsx(_components.code,{children:`created`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`entitlement_grant.failed`})}),_jsxs(_components.td,{children:[`The grant couldn’t be delivered. Inspect `,_jsx(_components.code,{children:`error_code`}),` and `,_jsx(_components.code,{children:`error_message`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`entitlement_grant.revoked`})}),_jsxs(_components.td,{children:[`Access has been withdrawn. Inspect `,_jsx(_components.code,{children:`revocation_reason`}),`.`]})]})]})]}),`\n`,_jsx(Card,{title:`Entitlement Grant Webhook Payloads`,icon:`bell`,href:`/developer-resources/webhooks/intents/entitlement-grant`,children:_jsxs(_components.p,{children:[`View the full payload schema, sample events, and `,_jsx(_components.code,{children:`revocation_reason`}),` reference.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`best-practices`,children:`Best Practices`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use one entitlement per delivery channel.`}),` Don’t share one Discord entitlement across products with different role intentions. Create one entitlement per role, so revocation stays clean.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Test in test mode first.`}),` Create the entitlement, attach it to a test product, run a checkout, and watch the grant move from `,_jsx(_components.code,{children:`Pending`}),` to `,_jsx(_components.code,{children:`Delivered`}),`. Then cancel the test subscription and confirm that the grant is revoked.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Listen to `,_jsx(_components.code,{children:`entitlement_grant.delivered`}),`, not `,_jsx(_components.code,{children:`payment.succeeded`}),`.`]}),` A payment can succeed before fulfillment finishes, especially for OAuth flows. Wait for the grant to reach `,_jsx(_components.code,{children:`Delivered`}),` before you unlock dependent features in your own systems. A grant that is delivered on creation, such as an auto-fulfilled license key or a feature flag, arrives as `,_jsx(_components.code,{children:`entitlement_grant.created`}),` with `,_jsx(_components.code,{children:`status: \"Delivered\"`}),` instead.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Treat `,_jsx(_components.code,{children:`entitlement_grant.failed`}),` as actionable.`]}),` A failed grant means a customer paid but didn’t get access. Surface these grants to your support team or trigger a re-grant.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Map `,_jsx(_components.code,{children:`revocation_reason`}),` to your retention flows.`]}),` A `,_jsx(_components.code,{children:`subscription_on_hold`}),` revoke is recoverable, because the customer may update their card. A `,_jsx(_components.code,{children:`manual`}),` revoke is intentional. Treat them differently in customer messages.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Do not revoke access on `,_jsx(_components.code,{children:`subscription.past_due`}),`.`]}),` That event opens a `,_jsx(_components.a,{href:`/features/subscription#grace-period`,children:`grace period`}),`, and the customer keeps access until the window ends. Wait for `,_jsx(_components.code,{children:`subscription.on_hold`}),` or `,_jsx(_components.code,{children:`subscription.cancelled`}),`.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Introduction","sidebarTitle":"Introduction","description":"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.","icon":"box-archive","keywords":["Dodo Payments","entitlements","fulfillment","license keys","digital delivery","platform access"],"href":"/features/entitlements/introduction"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What Are Entitlements?","slug":"what-are-entitlements","depth":2,"children":[]},{"title":"Available Integrations","slug":"available-integrations","depth":2,"children":[]},{"title":"How Grants Work","slug":"how-grants-work","depth":2,"children":[{"title":"Grant Lifecycle","slug":"grant-lifecycle","depth":3,"children":[]},{"title":"Grant Behavior by Event","slug":"grant-behavior-by-event","depth":3,"children":[]}]},{"title":"Create Your First Entitlement","slug":"create-your-first-entitlement","depth":2,"children":[]},{"title":"Attach Entitlements to Products","slug":"attach-entitlements-to-products","depth":2,"children":[]},{"title":"Customer Experience","slug":"customer-experience","depth":2,"children":[{"title":"Email and Customer Portal","slug":"email-and-customer-portal","depth":3,"children":[]},{"title":"OAuth-Based Delivery","slug":"oauth-based-delivery","depth":3,"children":[]},{"title":"Revocation","slug":"revocation","depth":3,"children":[]}]},{"title":"Manage Grants","slug":"manage-grants","depth":2,"children":[]},{"title":"API Management","slug":"api-management","depth":2,"children":[]},{"title":"Webhooks","slug":"webhooks","depth":2,"children":[]},{"title":"Best Practices","slug":"best-practices","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dodopayments/0ee82a08f7b65bcb/seo.js","/_mintlify/custom/dodopayments/6f88c9bbee313616/assistant-loader.js"],"subdomain":"dodopayments","siteName":"Dodo Payments Documentation","title":"Introduction - Dodo Payments Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/features/entitlements/introduction","matchLevel":0},"es":{"href":"/es/features/entitlements/introduction","matchLevel":1},"ar":{"href":"/ar/features/entitlements/introduction","matchLevel":1},"fr":{"href":"/fr/features/entitlements/introduction","matchLevel":1},"de":{"href":"/de/features/entitlements/introduction","matchLevel":1},"id":{"href":"/id/features/entitlements/introduction","matchLevel":1},"ja":{"href":"/ja/features/entitlements/introduction","matchLevel":1},"ko":{"href":"/ko/features/entitlements/introduction","matchLevel":1},"pt-BR":{"href":"/pt-BR/features/entitlements/introduction","matchLevel":1},"vi":{"href":"/vi/features/entitlements/introduction","matchLevel":1},"cn":{"href":"/cn/features/entitlements/introduction","matchLevel":1},"hi":{"href":"/hi/features/entitlements/introduction","matchLevel":1},"it":{"href":"/it/features/entitlements/introduction","matchLevel":1},"sv":{"href":"/sv/features/entitlements/introduction","matchLevel":1}}},"lastModified":"2026-11-06T07:07:37.233Z","gitLastModified":"2026-11-06T07:05:49.000Z","originalFileLocation":"features/entitlements/introduction.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Dodo Payments Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Introduction - Dodo Payments Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Dodo Payments Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.dodopayments.com/features/entitlements/introduction\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dodopayments.mintlify.site/_mintlify/api/og/v2?division=Entitlements\u0026amp;title=Introduction\u0026amp;description=Deliver+license+keys%2C+downloadable+files%2C+feature+flags%2C+and+access+to+Discord%2C+GitHub%2C+Telegram%2C+Framer%2C+and+Notion+automatically+when+customers+pay.\u0026amp;theme=fcc3a546490e883f7462a320\u0026amp;signature=9217d9454cc7962b8ea2d729dc3349401e825fd7335c35b1157f2482e4ae2337\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Introduction - Dodo Payments Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dodopayments.mintlify.site/_mintlify/api/og/v2?division=Entitlements\u0026amp;title=Introduction\u0026amp;description=Deliver+license+keys%2C+downloadable+files%2C+feature+flags%2C+and+access+to+Discord%2C+GitHub%2C+Telegram%2C+Framer%2C+and+Notion+automatically+when+customers+pay.\u0026amp;theme=fcc3a546490e883f7462a320\u0026amp;signature=9217d9454cc7962b8ea2d729dc3349401e825fd7335c35b1157f2482e4ae2337\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dodopayments/KuV_TozyHuGHOyyc/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Dodo Payments Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#779812\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.dodopayments.com/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/features/entitlements/introduction.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.dodopayments.com/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.dodopayments.com/es/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ar\" href=\"https://docs.dodopayments.com/ar/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://docs.dodopayments.com/fr/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://docs.dodopayments.com/de/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"id\" href=\"https://docs.dodopayments.com/id/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.dodopayments.com/ja/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.dodopayments.com/ko/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://docs.dodopayments.com/pt-BR/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"vi\" href=\"https://docs.dodopayments.com/vi/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.dodopayments.com/cn/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"hi\" href=\"https://docs.dodopayments.com/hi/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://docs.dodopayments.com/it/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"sv\" href=\"https://docs.dodopayments.com/sv/features/entitlements/introduction\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.dodopayments.com/features/entitlements/introduction\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.dodopayments.com/#organization\",\"name\":\"Dodo Payments Documentation\",\"url\":\"https://docs.dodopayments.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dodopayments/nM_mJfYkri-OpC5M/logo/light.svg?fit=max\u0026auto=format\u0026n=nM_mJfYkri-OpC5M\u0026q=85\u0026s=23f7a052f7ecb9d6570b7c95ee359a97\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.dodopayments.com#website\",\"name\":\"Dodo Payments Documentation\",\"url\":\"https://docs.dodopayments.com\",\"publisher\":{\"@id\":\"https://docs.dodopayments.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.dodopayments.com/features/entitlements/introduction#webpage\",\"url\":\"https://docs.dodopayments.com/features/entitlements/introduction\",\"name\":\"Introduction\",\"description\":\"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.\",\"dateModified\":\"2026-11-06T07:05:49.000Z\",\"isPartOf\":{\"@id\":\"https://docs.dodopayments.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dodopayments.com/features/entitlements/introduction#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dodopayments.com/features/entitlements/introduction#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Features\",\"item\":\"https://docs.dodopayments.com/features/products\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introduction\",\"item\":\"https://docs.dodopayments.com/features/entitlements/introduction\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.dodopayments.com/features/entitlements/introduction#article\",\"headline\":\"Introduction\",\"name\":\"Introduction\",\"description\":\"Deliver license keys, downloadable files, feature flags, and access to Discord, GitHub, Telegram, Framer, and Notion automatically when customers pay.\",\"url\":\"https://docs.dodopayments.com/features/entitlements/introduction\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dodopayments.com/features/entitlements/introduction#webpage\"},\"dateModified\":\"2026-11-06T07:05:49.000Z\",\"keywords\":\"Dodo Payments, entitlements, fulfillment, license keys, digital delivery, platform access\",\"publisher\":{\"@id\":\"https://docs.dodopayments.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.dodopayments.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Dodo Payments Documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Dodo Payments Documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/features/entitlements/introduction.md","siteName":"Dodo Payments Documentation","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Docs","icon":"book","groups":[{"group":"Getting Started","pages":[{"title":"Welcome to Dodo Payments","sidebarTitle":"Introduction","icon":"rocket","href":"/introduction"},{"title":"Build with AI Coding Agents","sidebarTitle":"AI Coding Agents","icon":"robot","href":"/developer-resources/build-with-ai-coding-agents"},{"title":"Migrate to Dodo Payments","icon":"arrow-right-arrow-left","href":"/migrate-to-dodo"},{"title":"Account Verification","icon":"id-card","href":"/miscellaneous/verification-process"}]},{"group":"Features","pages":[{"sidebarTitle":"Products","title":"Products","icon":"box","href":"/features/products"},{"sidebarTitle":"Product Collections","title":"Product Collections","icon":"layer-group","href":"/features/product-collections"},{"sidebarTitle":"One-Time Payments","title":"One-Time Payments","icon":"credit-card","href":"/features/one-time-payment-products"},{"group":"Subscriptions","icon":"infinity","pages":[{"sidebarTitle":"Subscriptions","title":"Subscriptions","icon":"repeat","href":"/features/subscription"},{"sidebarTitle":"Add-ons","title":"Add-ons for Subscriptions","icon":"puzzle","href":"/features/addons"},{"title":"On-Demand Subscriptions","icon":"bolt","href":"/developer-resources/ondemand-subscriptions"}]},{"group":"Usage Based Billing","icon":"arrow-trend-up","pages":[{"sidebarTitle":"Introduction","title":"Usage-Based Billing","icon":"box","href":"/features/usage-based-billing/introduction"},{"sidebarTitle":"Meters","title":"Meters","icon":"sliders","href":"/features/usage-based-billing/meters"},{"sidebarTitle":"Event Ingestion","title":"Event Ingestion","icon":"bolt","href":"/features/usage-based-billing/event-ingestion"},{"group":"Ingestion Blueprints","icon":"copy","pages":[{"sidebarTitle":"Introduction","title":"Ingestion Blueprints","icon":"box","href":"/features/usage-based-billing/ingestion-blueprints"},{"title":"LLM Blueprint","icon":"brain-circuit","href":"/developer-resources/ingestion-blueprints/llm"},{"title":"API Gateway Blueprint","icon":"cloud","href":"/developer-resources/ingestion-blueprints/api-gateway"},{"title":"Object Storage Blueprint","icon":"box-archive","href":"/developer-resources/ingestion-blueprints/object-storage"},{"title":"Stream Blueprint","icon":"tower-broadcast","href":"/developer-resources/ingestion-blueprints/stream"},{"title":"Time Range Blueprint","icon":"clock","href":"/developer-resources/ingestion-blueprints/time-range"}]}]},{"sidebarTitle":"Credit-Based Billing","title":"Credit-Based Billing","icon":"coins","href":"/features/credit-based-billing"},{"sidebarTitle":"Seat-Based Billing","title":"Seat-Based Billing","icon":"users","href":"/features/seat-based-billing"},{"sidebarTitle":"Hybrid Billing","title":"Hybrid Billing Models","icon":"layer-group","href":"/features/hybrid-billing"},{"title":"Upsells \u0026 Downsells","icon":"arrow-up-right-dots","href":"/features/upsells-and-downsells"},{"group":"Customers","icon":"user-group","pages":[{"title":"Customer Management","icon":"user-group","href":"/features/customers"},{"sidebarTitle":"Customer Portal","title":"Customer Portal","icon":"id-card","href":"/features/customer-portal"},{"title":"Customer Wallets","icon":"wallet","href":"/features/customer-wallet"},{"sidebarTitle":"Sent Emails","title":"Customer Email Logs","icon":"envelope","href":"/features/email-logs"},{"sidebarTitle":"Customer Blocklist","title":"Customer Blocklist","icon":"user-slash","href":"/features/customer-blocklist"}]},{"sidebarTitle":"Discounts","title":"Discounts","icon":"percent","href":"/features/discount-codes"},{"group":"Recovery","icon":"rotate","pages":[{"sidebarTitle":"Overview","title":"Revenue Recovery","icon":"rotate","href":"/features/recovery/overview"},{"sidebarTitle":"Abandoned Cart Recovery","title":"Abandoned Cart Recovery","icon":"cart-shopping","href":"/features/recovery/abandoned-cart-recovery"},{"sidebarTitle":"Subscription Dunning","title":"Subscription Dunning","icon":"repeat","href":"/features/recovery/subscription-dunning"},{"sidebarTitle":"Subscription Payment Retries","title":"Subscription Payment Retries","icon":"arrow-rotate-right","href":"/features/recovery/payment-retries"},{"sidebarTitle":"Manual Retry","title":"Manual Payment Retry","icon":"hand-pointer","href":"/features/recovery/manual-retry"}]},{"group":"Transactions","icon":"credit-card","pages":[{"title":"Payments","icon":"money-bill-transfer","href":"/features/transactions/payments"},{"title":"Refunds","icon":"rotate-left","href":"/features/transactions/refunds"},{"title":"Disputes","description":"View and respond to disputes from the Transactions page, and stop chargebacks before they are filed with Visa RDR, Ethoca alerts, and deflections.","icon":"circle-exclamation","href":"/features/transactions/disputes"}]},{"group":"Entitlements","icon":"gift","pages":[{"title":"Introduction","sidebarTitle":"Introduction","icon":"box-archive","href":"/features/entitlements/introduction"},{"title":"License Keys","description":"Issue license keys with activation limits and expiry through the License Key entitlement, then activate, validate, and deactivate them from your software.","icon":"key","href":"/features/license-keys"},{"title":"Digital Product Delivery","sidebarTitle":"Digital Products","icon":"download","href":"/features/digital-product-delivery"},{"title":"Feature Flag Entitlement","sidebarTitle":"Feature Flags","icon":"flag","href":"/features/entitlements/feature-flags"},{"title":"Discord Entitlement","sidebarTitle":"Discord","icon":"discord","href":"/features/entitlements/discord"},{"title":"GitHub Entitlement","sidebarTitle":"GitHub","icon":"github","href":"/features/entitlements/github"},{"title":"Telegram Entitlement","sidebarTitle":"Telegram","icon":"telegram","href":"/features/entitlements/telegram"},{"title":"Framer Entitlement","sidebarTitle":"Framer","icon":"puzzle-piece","href":"/features/entitlements/framer"},{"title":"Notion Entitlement","sidebarTitle":"Notion","icon":"book","href":"/features/entitlements/notion"}]},{"group":"Payouts and Balances","icon":"wallet","pages":[{"title":"Payouts Process","icon":"money-bill","href":"/features/payouts/payout-structure"},{"title":"Balances","icon":"file-invoice-dollar","href":"/features/account-summary-payout-wallet"}]},{"group":"Account Management","icon":"user","pages":[{"sidebarTitle":"Archive a Business","title":"Archiving a Business","icon":"box-archive","href":"/features/archive-business"},{"sidebarTitle":"Transfer Ownership","title":"Transferring Business Ownership","icon":"people-arrows","href":"/features/ownership-transfer"},{"sidebarTitle":"Entity Transfer","title":"Transferring Your Business to a New Entity","icon":"building","href":"/features/entity-transfer"},{"title":"Multi-Brand Setup","icon":"building-columns","href":"/features/multi-brands"},{"title":"Invoice Management","icon":"file-invoice-dollar","href":"/features/invoice-generation"},{"title":"Team Members","icon":"user-gear","href":"/features/team"},{"sidebarTitle":"Connected Apps","title":"Connected Apps","icon":"plug","href":"/features/connected-apps"},{"title":"Communication Preferences","sidebarTitle":"Communication Preferences","icon":"bell","href":"/features/communication-preferences"},{"title":"My Account","icon":"user-gear","href":"/miscellaneous/accounts"}]},{"group":"Pricing","icon":"dollar-sign","pages":[{"sidebarTitle":"Tax Inclusive Pricing","title":"Tax Inclusive Pricing","icon":"file-invoice","href":"/features/tax-inclusive-pricing"},{"sidebarTitle":"Pay What You Want","title":"Pay What You Want Pricing","icon":"dollar-sign","href":"/features/pay-what-you-want"},{"title":"B2B Payments","icon":"money-bills","href":"/features/b2b-payments"},{"title":"Localized Pricing","sidebarTitle":"Localized Pricing","icon":"earth-americas","href":"/features/localized-pricing"},{"sidebarTitle":"Purchasing Power Parity","title":"Purchasing Power Parity","icon":"money-bill-trend-up","href":"/features/purchasing-power-parity"},{"sidebarTitle":"Charm Pricing","title":"Charm Pricing","icon":"tag","href":"/features/charm-pricing"}]},{"sidebarTitle":"Checkout","title":"Checkout Features","icon":"cart-shopping","href":"/features/checkout"},{"sidebarTitle":"Single Page Checkout","title":"Single Page Checkout","icon":"window-maximize","tag":"BETA","href":"/features/single-page-checkout"},{"sidebarTitle":"Design","title":"Design \u0026 Theme Customization","icon":"palette","href":"/features/design"},{"group":"Payment Methods","icon":"money-bill-wave","pages":[{"title":"Payment Methods","sidebarTitle":"Overview","icon":"layer-group","href":"/features/payment-methods"},{"title":"Credit \u0026 Debit Cards","sidebarTitle":"Cards","icon":"credit-card","href":"/features/payment-methods/cards"},{"title":"Digital Wallets","sidebarTitle":"Digital Wallets","icon":"wallet","href":"/features/payment-methods/digital-wallets"},{"title":"Buy Now Pay Later (BNPL)","sidebarTitle":"BNPL","icon":"calendar-days","href":"/features/payment-methods/bnpl"},{"title":"ACH Direct Debit","sidebarTitle":"ACH Direct Debit","icon":"building-columns","href":"/features/payment-methods/ach"},{"title":"India Payment Methods","sidebarTitle":"India","icon":"indian-rupee-sign","href":"/features/payment-methods/india"},{"title":"European Payment Methods","sidebarTitle":"Europe","icon":"euro-sign","href":"/features/payment-methods/europe"},{"title":"South Korea Payment Methods","sidebarTitle":"South Korea","icon":"won-sign","href":"/features/payment-methods/south-korea"},{"title":"Asia-Pacific Payment Methods","sidebarTitle":"Asia-Pacific","icon":"earth-asia","href":"/features/payment-methods/asia-pacific"},{"title":"Pix","sidebarTitle":"Pix","icon":"brazilian-real-sign","href":"/features/payment-methods/pix"},{"title":"Stablecoins","sidebarTitle":"Stablecoins","icon":"dollar-sign","href":"/features/payment-methods/stablecoins"},{"title":"WeChat Pay","sidebarTitle":"WeChat Pay","icon":"comment-dollar","href":"/features/payment-methods/wechat"}]},{"title":"Third-Party Analytics","sidebarTitle":"Third-Party Analytics","icon":"chart-line","href":"/features/analytics"},{"sidebarTitle":"Adaptive Currency","title":"Adaptive Currency","icon":"money-bill-transfer","href":"/features/adaptive-currency"},{"group":"BYOP","icon":"shuffle","tag":"BETA","pages":[{"title":"Bring Your Own Processor (BYOP)","sidebarTitle":"Overview","tag":"BETA","icon":"boxes-stacked","href":"/features/byop"},{"title":"Stripe - Connect \u0026 Raw Card API Access","sidebarTitle":"Stripe","icon":"stripe","href":"/features/byop/stripe"},{"title":"Adyen - Connect \u0026 Raw Card API Access","sidebarTitle":"Adyen","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/adyen.svg","href":"/features/byop/adyen"}]},{"title":"Storefront","icon":"store","href":"/features/storefront"},{"title":"Affiliates","icon":"users-line","href":"/features/affiliates"},{"title":"Moderation API","icon":"shield-check","tag":"NEW","href":"/features/moderation"},{"title":"Selling Digital Goods on iOS","icon":"mobile","href":"/features/appstore-digital-goods"},{"title":"Dashboard Analytics","sidebarTitle":"Dashboard Analytics","icon":"chart-line","href":"/features/analytics-and-reporting"},{"title":"Reports","sidebarTitle":"Reports","icon":"file-invoice","href":"/features/reports"}]},{"group":"Integrate","pages":[{"group":"SDKs","icon":"box-open","pages":[{"sidebarTitle":"Overview","title":"Official SDKs","icon":"box","href":"/developer-resources/dodo-payments-sdks"},{"title":"TypeScript","icon":"js","href":"/developer-resources/sdks/typescript"},{"title":"Python","icon":"python","href":"/developer-resources/sdks/python"},{"title":"Go","icon":"golang","href":"/developer-resources/sdks/go"},{"title":"Ruby","icon":"gem","href":"/developer-resources/sdks/ruby"},{"title":"Java","icon":"java","href":"/developer-resources/sdks/java"},{"title":"Kotlin","icon":"k","href":"/developer-resources/sdks/kotlin"},{"title":"PHP","icon":"php","href":"/developer-resources/sdks/php"},{"title":"C#","icon":"c","href":"/developer-resources/sdks/csharp"},{"title":"Rust","icon":"rust","href":"/developer-resources/sdks/rust"}]},{"group":"Mobile Checkout SDKs","icon":"mobile","pages":[{"title":"Mobile Integration Guide","sidebarTitle":"Integration Guide","icon":"mobile","href":"/developer-resources/mobile-integration"},{"title":"Android","sidebarTitle":"Android","icon":"android","href":"/developer-resources/sdks/android"},{"title":"iOS","sidebarTitle":"iOS","icon":"apple","href":"/developer-resources/sdks/ios"},{"title":"React Native","sidebarTitle":"React Native","icon":"react","href":"/developer-resources/sdks/react-native"},{"title":"Flutter","sidebarTitle":"Flutter","icon":"layer-group","href":"/developer-resources/sdks/flutter"}]},{"group":"Framework Adaptors","icon":"frame","pages":[{"sidebarTitle":"Overview","title":"Framework Adaptors Overview","icon":"box","href":"/developer-resources/framework-adaptors"},{"title":"Next.js Adaptor","icon":"code-merge","href":"/developer-resources/nextjs-adaptor"},{"title":"Better Auth Adaptor","icon":"code-merge","href":"/developer-resources/better-auth-adaptor"},{"title":"Convex Component","icon":"code-merge","href":"/developer-resources/convex-component"},{"title":"TanStack Adaptor","icon":"code-merge","href":"/developer-resources/tanstack-adaptor"},{"title":"Nuxt Adaptor","icon":"code-merge","href":"/developer-resources/nuxt-adaptor"},{"title":"Express Adaptor","icon":"code-merge","href":"/developer-resources/express-adaptor"},{"title":"Astro Adaptor","icon":"code-merge","href":"/developer-resources/astro-adaptor"},{"title":"SvelteKit Adaptor","icon":"code-merge","href":"/developer-resources/sveltekit-adaptor"},{"title":"Hono Adaptor","icon":"code-merge","href":"/developer-resources/hono-adaptor"},{"title":"Remix Adaptor","icon":"code-merge","href":"/developer-resources/remix-adaptor"},{"title":"Fastify Adaptor","icon":"code-merge","href":"/developer-resources/fastify-adaptor"},{"title":"Bun Adaptor","icon":"code-merge","href":"/developer-resources/bun-adaptor"}]},{"group":"Apps","icon":"puzzle-piece","pages":[{"sidebarTitle":"Build an app","title":"Build an App","icon":"puzzle-piece","href":"/developer-resources/build-an-app"}]},{"group":"Webhooks","icon":"webhook","pages":[{"sidebarTitle":"Overview","title":"Webhooks","icon":"webhook","href":"/developer-resources/webhooks"},{"title":"Webhook Events Guide","icon":"bell","href":"/developer-resources/webhooks/intents/webhook-events-guide"},{"group":"Webhook Payloads","icon":"code","pages":[{"title":"Payment","icon":"credit-card","href":"/developer-resources/webhooks/intents/payment"},{"sidebarTitle":"Subscription","title":"Subscription Webhooks","icon":"repeat","href":"/developer-resources/webhooks/intents/subscription"},{"title":"Refund","icon":"rotate-left","href":"/developer-resources/webhooks/intents/refund"},{"sidebarTitle":"Dispute","title":"Dispute Webhooks","icon":"circle-exclamation","href":"/developer-resources/webhooks/intents/dispute"},{"title":"License Key","icon":"key","href":"/developer-resources/webhooks/intents/license-key"},{"title":"Entitlement Grant","icon":"gift","href":"/developer-resources/webhooks/intents/entitlement-grant"},{"sidebarTitle":"Credit-Based Billing","title":"Credit-Based Billing Webhooks","icon":"coins","href":"/developer-resources/webhooks/intents/credit"},{"title":"Recovery","icon":"rotate","href":"/developer-resources/webhooks/intents/recovery"},{"sidebarTitle":"Payout","title":"Payout Webhooks","icon":"money-bill-transfer","href":"/developer-resources/webhooks/intents/payout"}]},{"group":"Deploy to Cloud","icon":"rocket","pages":[{"title":"Vercel Functions","icon":"triangle","href":"/developer-resources/webhooks/examples/vercel-example"},{"title":"Cloudflare Workers","icon":"cloud","href":"/developer-resources/webhooks/examples/cloudflare-example"},{"title":"Supabase Edge Functions","icon":"bolt","href":"/developer-resources/webhooks/examples/supabase-example"},{"title":"Netlify Functions","icon":"diamond","href":"/developer-resources/webhooks/examples/netlify-example"}]}]},{"group":"Workload Identity","icon":"id-badge","tag":"NEW","pages":[{"sidebarTitle":"Overview","title":"Workload Identity Federation","icon":"id-badge","tag":"NEW","href":"/developer-resources/workload-identity/overview"},{"sidebarTitle":"Dashboard Setup","title":"Set Up Workload Identity in the Dashboard","icon":"sliders","href":"/developer-resources/workload-identity/dashboard-setup"},{"sidebarTitle":"SDK Usage","title":"Use Workload Identity with the SDKs","icon":"code","href":"/developer-resources/workload-identity/sdk-usage"},{"sidebarTitle":"Terraform","title":"Use Workload Identity with the Terraform Provider","icon":"code-branch","href":"/developer-resources/workload-identity/terraform"},{"group":"Provider Guides","icon":"list-check","pages":[{"sidebarTitle":"GitHub Actions","title":"Workload Identity for GitHub Actions","icon":"github","href":"/developer-resources/workload-identity/providers/github-actions"},{"sidebarTitle":"GitLab","title":"Workload Identity for GitLab CI/CD","icon":"gitlab","href":"/developer-resources/workload-identity/providers/gitlab"},{"sidebarTitle":"Terraform Cloud","title":"Workload Identity for HCP Terraform","icon":"cloud","href":"/developer-resources/workload-identity/providers/terraform-cloud"},{"sidebarTitle":"Google Cloud","title":"Workload Identity for Google Cloud","icon":"google","href":"/developer-resources/workload-identity/providers/google-cloud"},{"sidebarTitle":"Vercel","title":"Workload Identity for Vercel","icon":"triangle","href":"/developer-resources/workload-identity/providers/vercel"},{"sidebarTitle":"Kubernetes and EKS","title":"Workload Identity for Kubernetes and Amazon EKS","icon":"dharmachakra","href":"/developer-resources/workload-identity/providers/kubernetes"},{"sidebarTitle":"AWS","title":"Workload Identity for AWS","icon":"aws","href":"/developer-resources/workload-identity/providers/aws"},{"sidebarTitle":"Custom OIDC","title":"Workload Identity for a Custom OIDC Issuer","icon":"key","href":"/developer-resources/workload-identity/providers/custom-oidc"}]}]},{"group":"Testing \u0026 Demo Tools","icon":"flask","pages":[{"title":"Test Mode vs Live Mode","icon":"toggle-on","href":"/miscellaneous/test-mode-vs-live-mode"},{"title":"Testing Process","icon":"flask","href":"/miscellaneous/testing-process"},{"title":"Atlas Demo Product","icon":"palette","href":"/features/atlas-demo-website"}]},{"group":"Boilerplates","icon":"box-open","pages":[{"sidebarTitle":"Expo","title":"Expo Boilerplate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/expo.svg","href":"/developer-resources/expo-boilerplate"},{"sidebarTitle":"Supabase","title":"Supabase Boilerplate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/supabase.svg","href":"/developer-resources/supabase-boilerplate"},{"sidebarTitle":"Figma Plugin","title":"Figma Plugin","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/figma.svg","href":"/integrations/figma-plugin"},{"sidebarTitle":"Next.js","title":"Next.js Minimal Boilerplate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/nextjs.svg","href":"/developer-resources/nextjs-boilerplate"},{"sidebarTitle":"Astro","title":"Astro Minimal Boilerplate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/astro.svg","href":"/developer-resources/astro-boilerplate"},{"sidebarTitle":"FastAPI","title":"FastAPI Boilerplate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/dodopayments/images/logos/fastapi.svg","href":"/developer-resources/fastapi-boilerplate"},{"sidebarTitle":"Go","title":"Go Boilerplate","icon":"golang","href":"/developer-resources/go-boilerplate"}]},{"title":"Dodo CLI","icon":"terminal","href":"/developer-resources/sdks/cli"},{"sidebarTitle":"Terraform Provider","title":"Pricing as Code with Terraform","icon":"code-branch","tag":"NEW","href":"/developer-resources/terraform-provider"},{"title":"Overlay Checkout","icon":"cart-shopping","href":"/developer-resources/overlay-checkout"},{"title":"Inline Checkout","icon":"credit-card","href":"/developer-resources/inline-checkout"},{"title":"Billing SDK","icon":"boxes-stacked","href":"/developer-resources/billingsdk"},{"title":"Dodo Payments MCP Server","icon":"server","href":"/developer-resources/mcp-server"},{"title":"Agent Skills","icon":"wand-magic-sparkles","href":"/developer-resources/agent-skills"},{"sidebarTitle":"Database Sync","title":"Sync with Your Database","icon":"database","href":"/developer-resources/dodo-sync"},{"sidebarTitle":"Subscription Migration","title":"Subscription Migration to Dodo Payments","icon":"file-import","href":"/miscellaneous/subscription-migration"},{"sidebarTitle":"Card Data Export","title":"Request a Card Data Export","icon":"file-export","href":"/miscellaneous/card-data-export"}]},{"group":"Merchant of Record","pages":[{"sidebarTitle":"What Is MoR?","title":"Introduction","icon":"building-columns","href":"/features/mor-introduction"},{"title":"MoR vs PG","icon":"scale-balanced","href":"/features/mor-vs-pg"},{"title":"Countries Eligible for Payment Acceptance","icon":"globe","href":"/miscellaneous/list-of-countries-we-accept-payments-from"},{"title":"Merchant Acceptance Policy","icon":"building-shield","href":"/miscellaneous/merchant-acceptance"},{"title":"Countries Eligible for Merchant Acceptance","icon":"globe","href":"/miscellaneous/accepted-countries-and-territories"},{"title":"Review \u0026 Monitoring Policy","icon":"magnifying-glass","href":"/miscellaneous/review-monitoring-policy"},{"sidebarTitle":"Bypass of App Store Fees","title":"Bypassing App Store \u0026 Play Store Fees Using Dodo Payments","icon":"shield-check","href":"/features/bypassing-app-store-fees"}]},{"group":"Miscellaneous","pages":[{"group":"Support Channels","icon":"headset","pages":[{"title":"Help and Support","icon":"headset","href":"/miscellaneous/help-support"},{"title":"Feature Request and Roadmap","icon":"lightbulb","href":"/features/feature-request"}]},{"title":"Mobile \u0026 Desktop Apps","icon":"mobile","href":"/features/mobile-app"},{"title":"FAQs","icon":"circle-question","href":"/miscellaneous/faq"},{"title":"Security Reporting Policy","icon":"shield","href":"/miscellaneous/security-policy"}]}]},{"tab":"Guides","icon":"compass","pages":[{"title":"Guides","href":"/developer-resources/integration-guide"}]},{"tab":"API Reference","icon":"rectangle-code","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]},{"tab":"External Integrations","icon":"plug","pages":[{"title":"External Integrations","href":"/integrations/introduction"}]},{"tab":"Changelog","icon":"calendar-days","pages":[{"title":"Changelog","href":"/changelog/introduction"}]},{"tab":"Community Projects","icon":"users","pages":[{"title":"Community Projects","href":"/community/overview"}]}]},{"language":"es","pages":[{"title":"es","href":"/es/features/entitlements/introduction"}]},{"language":"ar","pages":[{"title":"ar","href":"/ar/features/entitlements/introduction"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/features/entitlements/introduction"}]},{"language":"de","pages":[{"title":"de","href":"/de/features/entitlements/introduction"}]},{"language":"id","pages":[{"title":"id","href":"/id/features/entitlements/introduction"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/features/entitlements/introduction"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/features/entitlements/introduction"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/pt-BR/features/entitlements/introduction"}]},{"language":"vi","pages":[{"title":"vi","href":"/vi/features/entitlements/introduction"}]},{"language":"cn","pages":[{"title":"cn","href":"/cn/features/entitlements/introduction"}]},{"language":"hi","pages":[{"title":"hi","href":"/hi/features/entitlements/introduction"}]},{"language":"it","pages":[{"title":"it","href":"/it/features/entitlements/introduction"}]},{"language":"sv","pages":[{"title":"sv","href":"/sv/features/entitlements/introduction"}]}]},"basePath":"","title":"Introduction - Dodo Payments Documentation","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-BXrZabKK.js","DynamicMarkdown-CtasenyM.js","zoom-image-lightbox-C5F0mVLH.js","lightbox-handle-r17bVUz3.js"]}