Skip to main content
License keys are the License Key entitlement type. Create a License Key entitlement once with the activation limit, expiry, and instructions you want, attach it to any product, and Dodo Payments generates and delivers a key per purchase or subscription seat, automatically.

What are License Keys?

License keys are unique tokens that authorize access to your product. They’re ideal for:
  • Software licensing: Desktop apps, plugins, and CLIs
  • Per-seat controls: Limit activations per user or device
  • Digital goods: Gate downloads, updates, or premium features
Inside Dodo Payments, license keys are managed through the Entitlements system, meaning the lifecycle of every key (creation, expiry, revocation, regrant) is driven by the same payment and subscription events as your other deliverables.

Create a License Key Entitlement

1

Open Entitlements

Go to Entitlements in your Dodo Payments dashboard and click + to create a new entitlement.
2

Choose License Key

Select License Key as the integration. Configure how each issued key behaves:
  • Activations Limit: Maximum concurrent activations per key (e.g., 1 for single-user, 5 for team licenses, leave blank for unlimited).
  • Duration: How long the key stays valid after issuance (e.g., 30 days, 1 year). For subscription-issued keys, leave blank; keys remain valid as long as the subscription is active.
  • Activation Instructions: Customer-facing instructions emailed with the key. Examples: Paste the key in Settings → License or Run: mycli activate <key>.
New License Key entitlement form with name, fulfillment mode, license length, activations limit, and activation message
3

Save the entitlement

Save. The entitlement is now available to attach to any product.

Attach to Products

Open a product, expand Advanced Settings → Entitlements & Credits, and select your License Key entitlement. A single product can deliver a license key alongside other entitlements (Discord access, file downloads, GitHub repo access, etc.) on the same purchase.
Product entitlements panel with License Key selected

Selecting the License Key entitlement in the product entitlements panel.


How Keys Are Issued

Key issuance follows the standard grant lifecycle:

Quantity behavior

  • Subscription products issue one key per seat (subscriptions.quantity).
  • One-time products issue one key per cart line item (product_cart.quantity).
  • Manual API grants issue exactly one key.

Fulfillment mode

Every License Key entitlement has a fulfillment_mode that controls who supplies the key:
  • auto (default): Dodo Payments generates and emails the key automatically on payment or subscription. This is the behavior described above and applies when fulfillment_mode is omitted.
  • manual: The purchase creates a Pending grant with no key, and you supply each key value yourself. See Manual Fulfillment below.

Manual Fulfillment

By default, Dodo Payments generates and emails a license key the moment a customer pays. With manual fulfillment you supply the key yourself: the purchase creates a Pending grant with no key, notifies you, and waits for you to submit the key value. Use it when keys come from your own system, a third-party vendor, or a finite pool of pre-printed codes.
Looking for a step-by-step build? See the Manual License Key Fulfillment Integration Guide for an end-to-end walkthrough from product creation to delivering the key.

When to use it

Auto fulfillment is the right default for most software licensing. Choose manual fulfillment when Dodo Payments cannot mint the key itself:
  • Bring-your-own-keys: The key is generated by your application, a desktop product, or your own license server.
  • Third-party vendors: You resell keys issued by an upstream provider (a game key, an API credential, a partner platform).
  • Finite inventory: You hand out codes from a pre-allocated pool and want to assign them one at a time.
  • Human review: You want to vet a purchase before releasing access.

Enable manual fulfillment

Set fulfillment_mode: "manual" on the License Key entitlement’s integration config:
fulfillment_mode is backward compatible. Entitlements created before this setting existed have no fulfillment_mode and continue to behave as auto. Switching to manual only affects grants created after the change; keys already delivered are untouched.

Find grants awaiting fulfillment

When a customer buys a manual-mode product, the grant is created in Pending status with no key and an entitlement_grant.created webhook fires with integration_type: "license_key" and status: "Pending". You can react to that webhook, or poll the List Customer Grants endpoint with the integration_type and status filters:

Deliver the key

Submit the key with the Fulfill License Key Grant endpoint. The grant moves to Delivered and the customer is sent the key automatically — the same email they would receive under auto fulfillment.
cURL
activations_limit and expires_at are optional and fall back to the entitlement config when omitted. Each grant can be fulfilled once; retrying an already-fulfilled grant returns 409 rather than issuing a second key.
You do not need to email the key yourself — delivery happens automatically when the grant is fulfilled. This differs from importing keys via POST /license_keys, which intentionally does not notify the customer.

Activation, Validation, Deactivation

The activation/validation/deactivation API endpoints are public and require no API key. Use them directly from desktop software, CLIs, or browser-based clients to verify keys at runtime.
Public Endpoints: The activate, deactivate, and validate license endpoints are public and do not require an API key. Call them directly from your client applications without exposing your API credentials.

Activate a license

Validate a license

Deactivate an activation instance


Manage Keys

Open the License Key entitlement from your dashboard to see every grant (one row per customer key) with delivery date, activation count, and a revoke action. Each grant detail surfaces the underlying license key, expiry, activations used, and the activations limit. You can also list grants programmatically:

Import Existing License Keys via API

Already have license keys in another system? Use the Create License Key API to import them into Dodo Payments. This lets you migrate existing keys without disrupting your customers — they continue to activate, validate, and deactivate against the same key strings without re-issuance.
License keys created or updated through the API do not trigger email notifications to customers. If you need to notify customers about an imported key, handle that separately in your application.

How keys differ by source

Gunakan field source pada record license key untuk membedakan inventaris yang dimigrasikan dan key yang dipenuhi secara manual dari key yang diterbitkan secara organik saat melakukan rekonsiliasi atau audit. Baca field tersebut dari objek license_key pada grant yang dikembalikan oleh List Grants; endpoint lama GET /license_keys sudah deprecated.
Migrating from Polar.sh or Lemon Squeezy? The dodo-migrate CLI automates bulk imports of products, customers, discounts, and license keys in a single command and maps external IDs to Dodo IDs automatically.

License Keys in Return URL

When a customer completes a purchase for a product with a License Key entitlement, the generated key is automatically appended to your return_url as a query parameter. This lets you display the key immediately on your success page without making an extra API call.
If the purchase generates multiple keys (quantity > 1), they are comma-separated:
For subscriptions, subscription_id is used instead of payment_id:
Parse the license_key parameter on your return page to show the key immediately, improving the post-purchase experience.

API Management

Activation, deactivation, and validation are public; no API key required.

Activate License

Create or record an activation instance for a license key.

Deactivate License

Revoke a prior activation to free up capacity.

Validate License

Check authenticity, status, and constraints before granting access.
Create, list, retrieve, and update individual license key records. Use these to import existing keys or fetch usage details.
GET /license_keys, GET /license_keys/{id}, dan PATCH /license_keys/{id} sudah deprecated. Gunakan endpoint entitlement grant (List Grants, List Customer Grants) untuk membaca data. POST /license_keys tetap didukung untuk mengimpor key yang sudah ada.

Create License Key

Buat license key baru atau impor license key yang sudah ada.

List License Keys

Telusuri semua key beserta detail status dan penggunaannya.

Get License Key

Ambil key tertentu beserta metadata-nya.

Update License Key

Ubah masa berlaku, batas aktivasi, atau status aktif/nonaktif key.
Kelola entitlement License Key itu sendiri: batas aktivasi, durasi, dan instruksinya.

Create Entitlement

Buat entitlement License Key.

Update Entitlement

Perbarui konfigurasi entitlement.

List Grants

Tampilkan daftar key yang diterbitkan untuk sebuah entitlement.

Revoke Grant

Cabut key pelanggan secara manual.

Webhooks

Pengiriman dan pencabutan license key memicu empat entitlement_grant.* peristiwa webhook. Payload grant mencakup objek license_key yang telah diisi dengan key, masa berlaku, jumlah aktivasi yang digunakan, dan batasnya. Peristiwa license_key.* lama (license_key.created) tetap dipicu untuk lifecycle record license key yang mendasarinya; lihat halaman payload webhook License Key.
Untuk integrasi baru, dengarkan entitlement_grant.delivered, bukan license_key.created. Peristiwa entitlement memberi tahu Anda bahwa pengiriman telah selesai di semua integrasi pada produk, bukan hanya pada license key.

License Key Lama

Produk yang dibuat dengan flag license_key_enabled versi lama telah dimigrasikan secara otomatis ke entitlement License Key. Migrasi ini transparan: key pelanggan yang sudah ada terus berfungsi tanpa perubahan, endpoint publik /licenses/activate, /licenses/validate, /licenses/deactivate terus berfungsi, dan endpoint API /license_keys/* terus membaca dan menulis ke key store yang sama.Bagian dashboard License Keys mandiri tetap tersedia sebagai daftar datar setiap key yang diterbitkan, sehingga berguna untuk audit dan pencarian. Konfigurasi baru (mengubah batas aktivasi, durasi, atau instruksi) harus dilakukan dengan mengedit entitlement License Key yang telah dimigrasikan di Entitlements.

Praktik Terbaik

  • Tetapkan batas aktivasi dengan jelas: Pilih default yang wajar (1 untuk aplikasi satu pengguna, 3–5 untuk lisensi tim) dan dokumentasikan.
  • Berikan instruksi aktivasi yang tepat: Pelanggan menyalin instruksi ini dari email mereka, sehingga path dan command yang tepat dapat mengurangi tiket dukungan.
  • Validasi key di sisi server: Untuk produk yang terhubung ke jaringan, lakukan validasi melalui /licenses/validate, bukan dengan menyimpan aktivasi secara lokal.
  • Gunakan webhook untuk pencabutan: Dengarkan entitlement_grant.revoked untuk segera menonaktifkan fitur dalam aplikasi saat pelanggan membatalkan atau meminta refund.
  • Uji dengan langganan dan pembelian one-time: Perilaku license key sedikit berbeda di antara keduanya, jadi uji keduanya sebelum ditayangkan.
Terakhir diubah pada 21 Agustus 2026