> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Pengenalan

> Secara otomatis mengirimkan kunci lisensi, file yang dapat diunduh, dan akses ke platform seperti Discord, GitHub, Telegram, Framer, dan Notion saat pelanggan membayar.

<Info>
  Entitlements mengubah pembayaran yang berhasil atau langganan aktif menjadi akses nyata: kunci lisensi di kotak masuk pelanggan Anda, peran Discord, repositori GitHub, template Notion, tautan remix Framer, undangan obrolan Telegram, atau bundel file yang dapat diunduh. Dodo Payments menerbitkan, melacak, dan mencabut akses tersebut secara otomatis seiring perubahan siklus pembayaran.
</Info>

<Frame caption="The Entitlements dashboard. Each entitlement is a reusable template; the right pane shows individual customer grants.">
  <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=12a326205f64d1e71485bce46114d296" alt="Dasbor entitlements dengan daftar entitlements di kiri dan aktivitas pemberian di kanan" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1195" data-path="images/entitlements/list.png" />
</Frame>

## Apa itu Entitlements?

**Entitlement** adalah definisi yang dapat digunakan kembali dari sesuatu yang Anda berikan kepada pelanggan: kunci lisensi Pro, peran Discord "Patrons", akses ke repositori GitHub pribadi Anda, bundel e-book yang dapat diunduh. Anda melampirkan entitlements ke produk, dan Dodo Payments menangani sisanya.

Ketika seorang pelanggan membeli produk, Dodo Payments membuat **grant**, penerbitan entitlement untuk satu pelanggan. Grant bergerak melalui beberapa status: `pending` saat pengiriman sedang berlangsung, `delivered` setelah pelanggan memiliki akses, `failed` jika pengiriman tidak dapat diselesaikan, dan `revoked` ketika akses dicabut.

<Tip>
  Entitlements mengatur **fulfillment** (apakah pelanggan memiliki akses?). Kredit mengatur **consumption** (seberapa banyak yang dapat mereka gunakan?). Keduanya dapat dilampirkan ke produk yang sama. Lihat [Credit-Based Billing](/features/credit-based-billing) untuk kredit.
</Tip>

## Integrasi yang Tersedia

Dodo Payments mengirimkan setiap entitlement melalui integrasi khusus. Pilih integrasi yang sesuai dengan apa yang Anda jual.

<CardGroup cols={2}>
  <Card title="License Keys" icon="key" href="/features/license-keys">
    Hasilkan kunci lisensi unik dengan batas aktivasi dan kedaluwarsa. Terbaik untuk perangkat lunak, plugin, dan CLI.
  </Card>

  <Card title="Digital Files" icon="download" href="/features/digital-product-delivery">
    Kirimkan file yang dapat diunduh (e-book, template, media) dengan URL unduhan yang telah ditandatangani dan instruksi opsional.
  </Card>

  <Card title="Discord" icon="discord" href="/features/entitlements/discord">
    Beri pelanggan peran di server Discord Anda saat mereka membeli. Cabut otomatis saat pembatalan.
  </Card>

  <Card title="GitHub" icon="github" href="/features/entitlements/github">
    Tambahkan pelanggan sebagai kolaborator ke repositori pribadi pada tingkat izin yang Anda pilih.
  </Card>

  <Card title="Telegram" icon="telegram" href="/features/entitlements/telegram">
    Tambahkan pelanggan ke obrolan atau saluran Telegram pribadi setelah pembelian.
  </Card>

  <Card title="Framer" icon="puzzle-piece" href="/features/entitlements/framer">
    Buka tautan remix template Framer untuk pelanggan yang membayar.
  </Card>

  <Card title="Notion" icon="book" href="/features/entitlements/notion">
    Salin template Notion ke ruang kerja pelanggan saat pembelian.
  </Card>
</CardGroup>

***

## Bagaimana Grant Bekerja

Grant digerakkan oleh acara pembayaran dan langganan yang sama yang sudah Anda terima sebagai webhook. Anda tidak perlu memanggil grant API sendiri untuk pembelian. Dodo Payments membuat dan mencabut grant secara otomatis berdasarkan siklus pembayaran yang mendasarinya.

### Siklus Hidup Grant

<Steps>
  <Step title="Created">
    A grant dibuat ketika pembayaran selesai atau langganan menjadi aktif. Kunci lisensi langsung beralih ke `delivered`. Setiap integrasi lainnya dimulai di `pending`. Integrasi berbasis OAuth (Discord, GitHub, Notion) menyertakan `oauth_url` yang harus dikunjungi pelanggan untuk menyelesaikan persetujuan. Integrasi langsung dari platform (Telegram, Framer, File Digital) hanya sebentar berada di `pending` sambil menunggu pengiriman, kemudian beralih ke `delivered`.
  </Step>

  <Step title="Delivered">
    Setelah pengiriman selesai (kunci lisensi dihasilkan, peran diberikan, akses repositori diberikan, tautan file diselesaikan, OAuth selesai), grant bergerak ke `delivered` dan `delivered_at` ditetapkan.
  </Step>

  <Step title="Failed">
    Jika panggilan integrasi mengembalikan kesalahan yang tidak dapat diulang (token OAuth dicabut, izin ditolak, file tidak lagi ada), grant bergerak ke `failed`. Bidang `error_code` dan `error_message` menangkap alasannya.
  </Step>

  <Step title="Revoked">
    Ketika akses dicabut (langganan dibatalkan, pengembalian dana diberikan, atau pencabutan yang dimulai pedagang), grant bergerak ke `revoked`. Bidang `revocation_reason` mencatat pemicunya.
  </Step>
</Steps>

### Perilaku Grant berdasarkan Acara

| Event                                                     | Perilaku                                                                                                                                                                                                                                                                                                                                                                                        |
| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `payment.succeeded` (pembayaran satu kali)                | Keluarkan satu grant untuk setiap entitlement yang dilampirkan.                                                                                                                                                                                                                                                                                                                                 |
| `payment.succeeded` (pembayaran yang terhubung langganan) | Tidak ada operasi. Grant digerakkan oleh acara langganan di bawah.                                                                                                                                                                                                                                                                                                                              |
| `subscription.active`                                     | Keluarkan grant untuk setiap entitlements yang dilampirkan yang belum memiliki satu. Keluarkan kembali setiap grant yang sebelumnya dicabut untuk langganan yang sama.                                                                                                                                                                                                                          |
| `subscription.renewed`                                    | Tidak ada operasi. Grant yang ada tetap ada saat perpanjangan.                                                                                                                                                                                                                                                                                                                                  |
| `subscription.on_hold`                                    | Cabut semua grant yang dikirimkan dan tertunda. `revocation_reason: subscription_on_hold`.                                                                                                                                                                                                                                                                                                      |
| `subscription.cancelled`                                  | Cabut semua. `revocation_reason: subscription_cancelled`.                                                                                                                                                                                                                                                                                                                                       |
| `subscription.expired`                                    | Cabut semua. `revocation_reason: subscription_expired`.                                                                                                                                                                                                                                                                                                                                         |
| `subscription.plan_changed`                               | Cabut semua grant saat ini, kemudian keluarkan grant untuk entitlements rencana baru. `revocation_reason: plan_changed`.                                                                                                                                                                                                                                                                        |
| `refund.succeeded` (pembayaran satu kali)                 | Cabut grant untuk pembayaran tersebut. `revocation_reason: refund`.                                                                                                                                                                                                                                                                                                                             |
| Manual API revoke                                         | Cabut dengan `revocation_reason: manual`. Pencabutan manual tidak secara otomatis dikeluarkan ulang saat perpanjangan langganan.                                                                                                                                                                                                                                                                |
| License key disabled                                      | Untuk grant dengan kunci lisensi, menonaktifkan kunci yang mendasari mencabut grant dengan `revocation_reason: license_key_disabled`. Grant secara otomatis diaktifkan kembali jika kunci diaktifkan ulang.                                                                                                                                                                                     |
| Platform drift detected                                   | Jika sisi platform dari integrasi keluar dari sinkronisasi (peran Discord dihapus secara manual, Aplikasi GitHub kehilangan akses ke repositori, atau proses rekonsiliasi mendeteksi target yang hilang), grant dicabut dengan `revocation_reason: platform_external`. Tidak secara otomatis dikeluarkan ulang saat perpanjangan langganan hingga masalah platform yang mendasari diselesaikan. |

<Note>
  Grant yang digerakkan oleh langganan adalah idempoten per `(entitlement, customer, subscription)`; pembaruan dan reaktivasi tidak membuat grant duplikat. Grant satu kali adalah idempoten per `(entitlement, customer, payment)`.
</Note>

***

## Buat entitlement pertama Anda

<Steps>
  <Step title="Open Entitlements">
    Pergi ke **Entitlements** di dasbor Dodo Payments Anda dan klik **+** untuk membuat entitlement baru.
  </Step>

  <Step title="Pick an integration">
    Pilih jenis integrasi: License Key, Digital Files, Discord, GitHub, Telegram, Framer, atau Notion. Untuk integrasi platform, hubungkan akun Anda terlebih dahulu jika Anda belum melakukannya.
  </Step>

  <Step title="Configure delivery">
    Isi kolom yang spesifik untuk integrasi. Misalnya, GitHub meminta repositori dan tingkat izin; Discord meminta server dan peran opsional; License Key meminta batas aktivasi dan kedaluwarsa.

    <Frame caption="Creating a GitHub entitlement. Each integration shows the fields it needs.">
      <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/github/create.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=722e925ec5158a5d16c58213132ccb9d" alt="Formulir Entitlement Baru dengan pemilih integrasi dan kolom konfigurasi" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1130" data-path="images/entitlements/github/create.png" />
    </Frame>
  </Step>

  <Step title="Save">
    Simpan entitlement. Sekarang Anda dapat melampirkannya ke produk apa pun.
  </Step>
</Steps>

## Lampirkan Entitlements ke Produk

Buka produk, perluas **Advanced Settings → Entitlements & Credits**, dan pilih entitlements yang harus dikirimkan saat produk dibeli. Satu produk dapat mengirimkan beberapa entitlements sekaligus. Misalnya, rencana Pro dapat mencakup kunci lisensi, akses GitHub, dan peran Discord.

<Frame caption="Attaching entitlements to a product. Selected entitlements are delivered on every successful purchase or active subscription.">
  <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=965ad78262791fa8dbb712b4fdf89538" alt="Panel pemilihan entitlement produk yang menunjukkan kotak centang untuk setiap entitlement yang tersedia" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1197" data-path="images/entitlements/attach-to-product.png" />
</Frame>

***

## Pengalaman Pelanggan

### Email dan pusat pelanggan

Pelanggan menerima email pengiriman setelah pembelian yang berisi kunci lisensi, tautan unduhan, tautan undangan OAuth, atau undangan platform, mana yang berlaku untuk entitlements pada produk. Rincian yang sama tetap tersedia tanpa batas dari [Customer Portal](/features/customer-portal) di bawah riwayat pesanan mereka.

### Pengiriman berbasis OAuth

Akses pelanggan Discord, GitHub, dan Notion memerlukan pelanggan untuk mengotorisasi Dodo Payments untuk memberikan akses kepada mereka. Grant ini tetap dalam status `pending` sampai pelanggan menyelesaikan alur OAuth menggunakan tautan dari email mereka atau portal pelanggan. Setelah mereka mengotorisasi, grant bergerak ke `delivered` dan akses platform segera disediakan.

### Pencabutan

Grant yang dicabut dihapus di tingkat platform: peran Discord dihapus, kolaborator GitHub dihapus, kunci lisensi dinonaktifkan. Pelanggan melihat perubahan ini tercermin di portal pelanggan.

<Warning>
  Untuk File Digital, pencabutan menghapus akses ke URL yang telah ditandatangani ke depan tetapi tidak membatalkan salinan yang sudah diunduh pelanggan. Rencanakan konten Anda dengan cara ini.
</Warning>

***

## Kelola Grant

Buka salah satu entitlement dari dasbor untuk melihat grant-nya. Panel detail grant menunjukkan total grant, filter status, informasi pelanggan, tanggal pengiriman, dan tindakan pencabutan.

Anda juga dapat mengelola grant secara programatis:

<CodeGroup>
  ```typescript TypeScript theme={null} theme={null}
  import DodoPayments from 'dodopayments';

  const client = new DodoPayments({
    bearerToken: process.env['DODO_PAYMENTS_API_KEY'],
  });

  // List grants for an entitlement
  const grants = await client.entitlements.grants.list('ent_abc123', {
    status: 'delivered',
  });

  // Revoke a single grant
  await client.entitlements.grants.revoke('grant_xyz789', {
    path_id: 'ent_abc123',
  });
  ```

  ```python Python theme={null} theme={null}
  client.entitlements.grants.list(
      "ent_abc123",
      status="delivered",
  )

  client.entitlements.grants.revoke(
      "grant_xyz789",
      path_id="ent_abc123",
  )
  ```

  ```go Go theme={null} theme={null}
  grants, _ := client.Entitlements.Grants.List(
    ctx, "ent_abc123",
    dodopayments.EntitlementGrantListParams{Status: dodopayments.F("delivered")},
  )

  _, _ = client.Entitlements.Grants.Revoke(ctx, "grant_xyz789", "ent_abc123")
  ```
</CodeGroup>

***

## Manajemen API

<CardGroup cols={2}>
  <Card title="Create Entitlement" icon="plus" href="/api-reference/entitlements/create-entitlement">
    Buat entitlement baru dari jenis integrasi apa pun.
  </Card>

  <Card title="List Entitlements" icon="list" href="/api-reference/entitlements/list-entitlements">
    Daftar entitlements dengan penyaringan berdasarkan jenis integrasi.
  </Card>

  <Card title="Get Entitlement" icon="magnifying-glass" href="/api-reference/entitlements/get-entitlement">
    Ambil entitlement dan konfigurasi yang diselesaikan.
  </Card>

  <Card title="Update Entitlement" icon="pen" href="/api-reference/entitlements/update-entitlement">
    Perbarui nama, deskripsi, atau konfigurasi integrasi.
  </Card>

  <Card title="Delete Entitlement" icon="trash" href="/api-reference/entitlements/delete-entitlement">
    Hapus entitlement secara lembut; grant yang ada tidak terpengaruh.
  </Card>

  <Card title="Upload File" icon="upload" href="/api-reference/entitlements/upload-file">
    Unggah file ke entitlement File Digital (hingga 100 MB).
  </Card>

  <Card title="List Grants" icon="users" href="/api-reference/entitlements/list-grants">
    Daftar semua grant untuk sebuah entitlement dengan filter status dan pelanggan.
  </Card>

  <Card title="Revoke Grant" icon="ban" href="/api-reference/entitlements/revoke-grant">
    Cabut satu grant secara manual.
  </Card>
</CardGroup>

***

## Webhook

Dodo Payments memicu empat acara webhook untuk siklus hidup grant. Berlangganan ke acara-acara ini untuk menjaga aplikasi Anda tetap sinkron dengan apa yang dapat diakses setiap pelanggan.

| Event                         | Dipicu ketika                                                                                                                                                                                                                                  |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `entitlement_grant.created`   | Grant baru dibuat. Grant kunci lisensi tiba di `delivered`; setiap integrasi lainnya tiba di `pending` dan beralih ke `delivered` setelah panggilan platform berhasil (atau, untuk integrasi berbasis OAuth, setelah pelanggan mengotorisasi). |
| `entitlement_grant.delivered` | Grant beralih ke dikirim. Pelanggan sekarang memiliki akses.                                                                                                                                                                                   |
| `entitlement_grant.failed`    | Grant tidak dapat dikirimkan. Periksa `error_code` dan `error_message`.                                                                                                                                                                        |
| `entitlement_grant.revoked`   | Akses telah dicabut. Periksa `revocation_reason`.                                                                                                                                                                                              |

<Card title="Entitlement Grant Webhook Payloads" icon="bell" href="/developer-resources/webhooks/intents/entitlement-grant">
  Lihat skema payload lengkap, contoh acara, dan referensi `revocation_reason`.
</Card>

***

## Praktik Terbaik

* **Gunakan satu entitlement per saluran pengiriman.** Jangan bagikan satu entitlements Discord di seluruh produk dengan maksud peran yang berbeda; buat satu per peran untuk pencabutan yang bersih.
* **Uji terlebih dahulu dalam mode uji.** Buat entitlement, lampirkan ke produk uji, jalankan checkout, dan pantau transisi grant melalui `pending → delivered`. Konfirmasi bahwa pembatalan langganan uji mencabut grant.
* **Dengarkan `entitlement_grant.delivered`, bukan `payment.succeeded`.** Pembayaran bisa berhasil sebelum penyelesaian selesai (terutama untuk alur OAuth). Tunggu acara dikirim sebelum membuka fitur yang bergantung pada sistem Anda sendiri.
* **Anggap `entitlement_grant.failed` sebagai tindakan yang bisa dilakukan.** Grant yang gagal berarti pelanggan membayar tetapi tidak mendapatkan akses. Tampilkan ini ke tim dukungan Anda atau aktifkan regrant.
* **Petakan `revocation_reason` ke alur retensi Anda.** Pencabutan `subscription_on_hold` dapat dipulihkan (pelanggan mungkin memperbarui kartu mereka). Pencabutan `manual` bersifat disengaja. Perlakukan mereka berbeda dalam komunikasi pelanggan.
